hyeonga_code

Java의 신_Chapter 12_Object 본문

Java

Java의 신_Chapter 12_Object

hyeonga 2024. 3. 28. 09:59
반응형

 

2024.03.27

 

- Object 클래스

-- Java의 모든 클래스의 부모 클래스

-- 어떠한 클래스도 상속받지 않는 경우 Object 클래스를 자동으로 상속받는다.

-- 다중 상속은 불가능하지만 단계적인 상속은 가능하다.

-- 클래스의 기본적인 행동을 정의할 수 있는 클래스

Object 클래스의 메소드
    ㄴ[ 객체를 처리하기 위한 메소드 ]
    ㄴ[ 스레드를 위한 메소드 ]

 

 

-- 객체를 처리하기 위한 메소드

더보기
protected Object clone()
	// 객체의 복사본을 만들어 리턴

public boolean equals(Object obj)
	// 현재 객체와 매개 변수로 넘겨 받은 객체가 같은지 확인
    
protected void finalize()
	// 현재 객체가 쓸모 없어진 경우 가비지 컬렉터가 호출하는 메소드

public Class<?> getClass()
	// 현재 객체의 Class 클래스 객체를 리턴
 
public int hashCode()
	// 객체에 대한 해시코드 값을 리턴(16진수로 제공되는 객체의 메모리 주소)
    
public String toString()
	// 객체를 문자열로 표현하는 값을 리턴

 

-- 스레드를 처리하기 위한 메소드

더보기
public void notify()
	// 이 객체의 모니터에 대기하고 있는 단일 스레드를 깨움

public void notifyAll()
	// 이 객체의 모니터에 대기하고 있는 모든 스레드를 깨움

public void wait()
	// 다른 스레드가 현재 객체에 대한 notify()/notifyAll() 메소드를 호출할 때까지 대기

public void wait(long timeout)
	// 매개 변수에 지정된 밀리초 만큼 대기 후 스레드를 깨움(밀리초 1/1000초 단위 - 1초:1000)

public void wait(long timeout, int nanos)
	// 매개 변수에 지정된 밀리초 + 나노 초 만큼 대기 후 스레드를 깨움(나노초 1/1,000,000,000초 단위)

 

-- toString()

---- 해당 클래스가 어떤 객체인지 나타낼 수 있는 메소드

---- 자동으로 호출되는 경우

------ System.out.println() 메소드에 매개 변수로 들어가는 경우

------ 객체에 대해 더하기 연산을 하는 경우

toString()
	= getClass().getName() + '@' + Integer.toHexString(hashCode())
    
    // getClass().getName() : 현재 클래스의 패키지 이름과 클래스 이름

 

 

---- DTO를 사용할 때에는 toString()을 Overriding해야 한다.

---- 참조 자료형을 비교하는 경우 값이 아닌 주소 값을 비교해야 하므로 equals(Object obj)를 활용한다.

 

-- equals 메소드 오버라이딩

---- 객체를 비교할 때, 오류가 발생하지 않는다.

---- 오버라이딩 하지 않은 경우 객체의 해시코드 값을 비교한다.

---- equals 메소드 오버라이딩 시 만족해야하는 조건

더보기

1. 재귀_Reflexive

-- null이 아닌 a 객체의 a.equals(a) 는 항상 true를 반환해야 한다.

 

2. 대칭_Symmetric

-- null이 아닌 a 객체와 b 객체가 있을 때, a.equals(b) 가 true라면 b.equals(a) 도 true를 반환해야 한다.

 

3. 타동적_Transitive

-- null이 아닌 a,b,c가 있을 때, a.equals(b) 가 true, b.equals(c)가 true인 경우 a.equals(c) 도 true를 반환해야 한다.

 

4. 일관_Consistent

-- null이 아닌 a와 b가 있을 때, 객체가 변경되지 않은 상황에서는 몇 번을 호출해도 같은 값을 반환해야 한다.

 

5. Null 과의 비교

-- null이 아닌 a 객체의 a.equals(null)은 항상 false를 반환해야 한다.

public boolean equals(Object obj){
    if(this == obj)
    	return true;
    
    if(obj == null)
    	return false;
        
    if(getClass() != obj.getClass())
    	return false;    
    
    DTO other = (DTO)obj;
    
    if(param1 == null){
    	if(other.param1 != null)
        	return false;
    } else if (!param1.equals(other.param1))
    	return false;
    
    if(param2 == null){
    	if(other.param2 != null)
        	return false;
    } else if(!param2.equals(other.param2))
    	return false;
    
    return true;
}

 

-- equals() 메소드를 오버라이딩 하려면 hashCode() 메소드도 함께 오버라이딩 해야한다.

---- equals() 메소드를 오버라이딩하여 객체가 서로 같다고 할 수는 있으나, 값이 같다고 해서 객체의 주소 값이 같지는 않기 때문이다.

------ equals() 메소드가 true를 반환해도 hashCode()의 메소드 값이 다를 수 있다.

 

 

 

-- hashCode()

---- 객체의 메모리 주소를 16진수로 리턴한다.

---- hashCode 메소드 오버라이딩 시 만족해야하는 조건

더보기

1. 자바 애플리케이션이 수행되는 동안 메소드가 호출될 때마다 하나의 객체에 대해 같은 int 값을 리턴해야 한다.

 

2. 두 개의 객체에 대해 equals() 메소드를 사용하여 비교한 결과가 true인 경우, hashCode() 메소드를 호출하면 동일한 int 값을 리턴해야 한다.

 

3. 두 개의 객체를 equals() 메소드를 사용하여 비교한 결과가 false인 경우에도, hashCode() 메소드를 호출한 int 값이 무조건 다를 필요는 없으나, 서로 다른 int 값을 제공하면 hashtable의 성능을 향상하는 데에 도움이 된다.

public int hashCode(){
	
    final int prime = 31;
    int result = 1;
    
    result = prime * result + ((param1 == null) ? 0 : param1.hashCode());
    result = prime * result + ((param2 == null) ? 0 : param2.hashCode());
    
    return result;    
}

 

 

더보기

1. 모든 클래스의 최상위 부모 클래스인 Object 클래스는 java.lang 패키지에 선언되어 있다.

 

2. 클래스가 어떻게 선언되어 있는지 확인할 수 있는 명령어는 javap

 

3. Object 클래스에 선언되어 있는 모든 메소드를 오버라이딩하지 않아도 된다.

 

4. Object 클래스의 clone() 메소드는 객체를 복사하는 용도이다.

 

5. System.out.println() 메소드를 사용하여 클래스를 호출하는 경우 Object 클래스의 toString() 메소드가 실행된다.

 

6. 객체의 주소가 아닌 값을 비교하려면 equals() 메소드를 오버라이딩 해야 한다.

 

7. Object 클래스의 hashCode() 메소드는 int 값을 리턴한다.

반응형

'Java' 카테고리의 다른 글

Java의 신_Chapter 14_Exception  (0) 2024.03.28
Java의 신_Chapter 13_Interface, enum  (0) 2024.03.28
Java의 신_Chapter 11_API  (0) 2024.03.28
Java의 신_Chapter 10_Inheritance  (0) 2024.03.28
Java의 신_Chapter 09_Package  (0) 2024.03.28