Language/Java

'Do it 자바프로그래밍 입문' 11장 정리

ABCD 2022. 9. 27.

Object

  • 모든 클래스의 최상위 클래스
  • 모든 클래스는 Object 클래스로부터 상속 받는다.
주로 사용되는 메서드 설명
String toString( ) 객체를 문자열로 표현하여 반환
boolean equals(Object obj) 두 인스턴스가 동일한지 여부 변환
int hashCode( ) 객체의 해시코드 값을 반환
Object clone( ) 객체를 복제, 동일한 멤버변수 값을 가진 새로운 인스턴스 생성
Class getClass( ) 객체의 Class 클래스를 반환
void finalize( ) 인스턴스가 힙 메모리에서 제가될 때 GC에 의해 호출되는 메서드
void wait( ) 멀티스레드 프로그램에서 사용. 스레드를 대기상태로 만듬
void notify( ) wiat( ) 메서드에 의해 기다리고 있는 스레드를 실행가능한 상태로 가져옴
  • 모든 클래스는 Object의 메서드 사용가능
  • 필요에 따라 Object의 메서드 재정의 가능. (모든 메서드를 재정의 할 수 있는것은 아니다.)

 

toString( )

  • 객체 정보를 문자열(String)로 바꾸어 줌
  • toString( ) 메서드의 원형은 생성된 클래스 이름과 주소를 보여준다.
  • ex)
class Book{
	int bookNumber;
    String bookTitle;
    
    Book(int bookNumber, String bookTitle){
    	this.bookNumber = bookNumber;
        this.bookTitle = bookTitle;
    }
}

public class ToStringEx{
	public static void main(String[ ] args){
    	Book book = new Book(200, "개미");
        
        System.out.println(book1);
        System.out.println(book1.toString());
    }
}
object.Book@16f65612
object.Book@16f65612
  • Object 클래스의 toString( ) 메서드의 원형은 다음과 같다.
getClass( ).getName( ) + '@' + Integer.toHexString(hashCode())
  • 재정의하면 객체의 참조변수를 이용해 원하는 문자열 표현 가능
@Override
public String toString(){
	return bookTitle + ', ' + bookNumber;

 

clone( )

  • 기본틀의 복사본을 사용해 동일한 인스턴스를 만드는 메서드
  • 객체를 복제해도 된다는 의미로 클래스에 cloneable 인터페이스 구현이 필수
  • Object에 protected Object clone( ); 이라고 선언 되어 있다.

 

마커인터페이스

  • cloneable 인터페이스처럼 선언해도 구현할 메서드가 없는 인터페이스

 

equals( )

  • 두 인터페이스의 주소값을 비교하여 boolean 값을 반환
  • 물리적(메모리주소) 동일성, 논리적 동일성을 구현할 때 재정의하여 사용
  • JDK에서 제공하는 String 클래스와 Integer 클래스는 이미 equals( ) 메서드가 재정의 되어 있다.
Student studentLee = new Student(100, "이상원");
Student studentLee1 = studentLee;

Student studentLee = new Student(100, "이상원");
Student studentLee2 = studentLee;
Student studentSang = new Student(100, "이상원");

클래스에서 equals( ) 메서드 직접 재정의 할 수 있다.

  • 인스턴스로 비교하는 것이 아닌 변수자체로 비교하게 재정의하여 논리적 동일성을 확보 할 수 있다.

 

hashCode( )

index = hash(key)

저장위치 = 해시 함수(객체 정보)
  • 정보를 저장하거나 검색할 때 사용하는 자료 구조
  • 해시 함수는 개발하는 프로그램에 따라 다르게 구현됨
  • 힙 메모리에 저장한 "인스턴스의 주소값" = "해시코드 값"
  • Java에서 두 인스턴스가 같다면 해시코드값도 같아야함
  • equals( ) 메서드를 재정의했다면 hashCode( ) 메서드도 재정의 해야한다.
  • hashCode( ) 메서드를 재정의 했을 경우, 실제 인스턴스 주소는 System.identityHashCode( ) 메서드를 사용하면 알 수 있다.
public class HashCodeTest{
	public static void main(String[ ] args){
    	String str1 = new String("abc");
        String str2 = new String("abc");
        
        System.out.println(str1.hashCode());
        System.out.println(str2.hashCode());
        
        Integer i1 = new Integer(100);
        Integer i2 = new Integer(100);
        
        System.out.println(i1.hashCode());
        System.out.pritnln(i2.hashCode());
96354
96354
100
100

String 선언방법

1. String str1 = new String("abc");
2. String str2 = "test";
  • new 예약어 사용시 "abc" 문자열을 위한 메모리가 할당되고 새로운 객체가 생성됨
  • 생성자 없이 문자열 상수를 가리키는 경우 기존에 있던 "test"라는 문자열 상수의 메모리 주소를 가리키게됨

 

상수풀

  • constant pool
  • test나 10, 20 등과 같이 프로그램에서 사용되는 상수값을 저장하는 공간

 

String 클래사의 final char[ ]

  • 프로그램에서 String s = new String("abc") 선언시 "abc"는 String 클래스의 value 변수에 저장됨
  • value 변수는 final로 선언되어 있다. 따라서, 한번 생성된 문자열은 변경되지 않는 불변의 특징을 갖는다.

 

concat( )

  • 두 문자열을 연결하는 메서드
  • 두 문자열이 연결될 때 변수값 자체가 변하는 것이 아닌 새로운 문자열이 생성되는 방식의 메서드 ( 추가메모리를 사용한다. )
public class StringTest2{
	public static void main(String[ ] agrs){
    	String javaStr = new String("java");
    	String androidStr = new String("android")
        System.out.prinln(javaStr);
        System.out.prinln("처음 문자열 주소 값 : " + System.identityHashCode(javaStr));
        
        javaStr = javaStr.concat(androidStr);
        
        System.out.println(javaStr);
        System.out.println("연결된 문자열 주소 값 : " + System.identityHashCode(javaStr));
java
처음 문자열 주소 값 : 385242642
javaandroid
연결된 문자 주소 값 : 824009085

StringBuffer

  • 내부에 변경가능한 ( final이 아닌 ) char[ ] 를 변수로 가짐
  • 추가 메모리를 사용하지 않는다.
  • 문자열이 안전하게 변경되도록 보장

 

StringBuilder

  • 내부에 변경가능한 ( final이 아닌 ) char[ ] 를 변수로 가짐
  • 추가 메모리를 사용하지 않는다.
  • 문자열이 안전하게 변경되도록 보장하지 않음
  • 프로그램에서 따로 스레드를 생성하는 멀티스레드 프로그램이 아니라면 StringBuffer보다 실행 속도가 빠르다.
  • 문자열 추가시 appen( ) 사용
String javaStr = new String("Java");
StringBuilder buffer = new StringBuilder(javaStr);
buffer.append(" and ");
buffer.append("android ");
javaStr = buffer.toString( );
System.out.println(javaStr);
Java and android


Warpper

  • 기본형을 객체형으로 사용해야 하는 경우 사용할 수 있는 클래스

 

Integer 클래스 사용하기

Integer(int value) {...} //정수를 매개변수로
Integer(String s) {...} //문자열을 매개변수로

 

intValue( )

  • Integer 클래스 내부의 int 자료형 값을 가져옴
Integer iValue = new Integer(100);
int myValue = iValue.intValue();

 

valueOf( )

  • 생성자를 사요하지 않고 정수나 문자열을 바로 Integer 클래스에 반환
Integer number1 = Integer.valueOf("100");
Integer number2 = Integer.valueOf(100);

 

parseInt( )

  • 문자열이 어떤 숫자를 나타낼 때 문자열에서 int값을 가져와 반환
int num = Integer.parseInt("100");

 

오토박싱

  • 기본형을 객체형으로 바꾸는 것

언박싱

  • 객체형을 기본형으로 바꾸는 것

 

오토 박싱과 언박싱은 연산방법이 변경되는 것이 아닌, 컴파일러가 변경하는 것!!

 

Class 클래스

  • 모르는 클래스나 인터페이스의 정보를 사용할 경우 해당정보를 가져오는데(찾는데) 사용
1. Object 클래스의 getClass( ) 메서드 사용

String s = new String("abc"); 	// 인스턴스 생성이 필수!!
Class c = s.getClass( );	//반환형은 Class
2. 클래스 파일 이름을 Class 변수에 직접 대입

Class c = String.Class;
3. Class.forName("클래스 이름") 메서드 사용

Class c = class.forName("java.lang.String");

 

리플렉션

  • 사용하려는 클래스의 자료형을 모르는 상태에서 Class 클래스를 호출하여 그 클래스의 정보를 얻고, 이 정보를 활용하여 인스턴스를 생성하거나 메서드를 호출하는 방식

 

newInstance( )

  • Class 클래스로 얻은 정보를 바탕으로 인스턴스를 생성
  • 항상 Object형으로 반환되므로 생성된 객체형으로 형변환을 해야한다.

 

Class.forName( )

  • 동적으로 로딩할 수 있다.
String className = "classex.Person";
Class pClass = Class.forName(className);
  • 유의사항
    1. forName("클래스이름") 에서 클래스 이름은 문자열 값이므로 문자열에 요류가 있어도 오류를 파악할 수 없다.
    2. 동적 로딩을 통해 Class 클래스를 가져올 수 있으면 리플렉션 프로그래밍으로 객체를 생성하고 활용할 수 있다.
728x90
반응형

댓글

💲 추천 글