Java.lang 패키지

이한수·2022년 3월 13일
0

JAVA

목록 보기
6/9
post-thumbnail

혼자 공부내용 정리중입니다.
잘못된 부분이 있을 경우 댓글로 알려주신다면 감사하겠습니다!
참고 : Java의 정석(남궁성)

Object 클래스

멤버 변수가 없고 , 오직 11개의 메서드만 가지고 있다.
clone , equals , finalize , getClass, hashCode , toString , notify , notifyAll , wait등 이 있다.

이 중에 재정의하여 자주 사용하는 것만 정리해보자.

equals(Object obj)

객체의 참조 변수를 받아서 비교한뒤 그 결과를 boolean으로 반환.

객체는 비교될 때 주소값으로 비교되기 때문에 같은 내용을 가지고 있더라도 동일하다고 처리할 수 없다.

학생 클래스가 있다고 가정해보자.
멤버변수로는 학번과 이름을 가지고 있다.

Student stu1 = new Student();
stu1.setId(1);
stu1.setName("mike");

Student stu2 = new Student();
stu1.setId(1);
stu1.setName("mike");

stu1 == stu2  //false가 된다.

System.out.println(stu1);
System.out.println(stu2);
//출력해보면 각 객체가 가진 주소 값이 다르기 때문이다.

위와 같은 결과가 나온다.
== 뿐만 아니라 equals도 이용해도 주소를 비교하긴 마찬가지다.
하지만 equals는 모든 클래스의 조상 클래스이므로 , 오버라이딩을 하여 프로그래머가 재구현 할 수 있다.
(이 뿐만 아니라 Object 클래스의 모든 메소드는 오버라이딩 가능)

//Student 클래스에
@Override
public boolean equals(Object obj){
	if(obj != null &  obj instanceOf Student){
    	return this.getId() == ((Student)obj).getId();
    }else{
		return false;
    }
}

이런식으로 재구현하여 학번이 같은 경우 주소가 다르지만 , 논리적으로 같은 객체로 처리할 수 있다.

주의 : 일부 자주 사용하는 클래스들은 object의 메소드들이 일부 재구현 되어있어 ,
따로 재구현을 하지 않더라도 내부 값이 같으면 같은 객체로 인식되게끔 구현해 놓았다.
ex) 대표적 예시 String.

hashCode()

해싱 기법에 사용되는 해시함수를 구현한 것이다.
해싱 기법은 다량의 데이터를 저장하고 검색하는데 유용하다.
해시 함수는 찾고자하는 값을 입력하면 , 그 값이 저장된 위치를 알려주는 해시코드를 반환한다.

64bit Jvm에서는 8byte 주소값으로 해시코드를 만들기 때문에 , 해시코드가 중복될 수 있다.
고로 , 앞서 equals로 동일하게끔 처리된 객체는 서로 같은 hashCode를 같게끔 해줄 필요가 있다.

왜?? hashCode 메소드는 객체의 주소값으로 해시코드를 만들어 반환하기 떄문이다.

	//Student 클래스에
	@Override
    public int hashCode(){
    return id;
    }
    
    
    //main
    System.out.println(stu1);
	System.out.println(stu2);

보통 참조변수를 출력해보면 아래와 같은 주소가 나오는데 각 객체는 다른 주소를 가진다.

getClass().getName()@70dea4e
getClass().getName()@5c647e05

그러나 재정의 후에 결과는

getClass().getName()@1
getClass().getName()@1

학번값을 return했으므로 뒤에 값이 이렇게 동일하게 나온다.

만일 재정의하였지만 그럼에도 다른 객체임을 확인하고자 한다면
System.identityHashCode(Object x)를 이용하면 된다.

toString()

일반적으로 System.out.println(참조변수) 를 넣으면 객체의 주소값이 나오는데 이때 자동으로 toString()메소드가 호출된다.

	System.out.println(stu1);
    System.out.println(stu1.toString());

다시한번 말하지만 참조변수를 출력하면 객체의 주소값이 반환된다 하였는데 , 이때 hashCode에서도 간단히 보았지만 toString()의 원형은 아래와 같은 값을 String으로 return 한다.

getClass().getName() + "@" + Integer.toHexString(hashCode())

이러한 형태이므로 hashCode()를 오버라이딩하였을때 같은 값이 나올 수 있는 것이다.

사용자 편의대로 사용하면 되고 , 보통 일반적으로 나는 객체 내부의 멤버변수의 값들을 편하게 살펴보기 위해서 사용하는 편인거 같다.

	@Override
    public String toString(){
    	return "학생 학번 : " + this.getId() + " , 학생 이름 : " + this.getName();
    }

clone()

자신을 복제하여 새로운 인스턴스를 생성하는 메소드다.
원래의 인스턴스는 보존하고 같은 내부 값을 가진 새로운 인스턴스를 생성한다.

이때 복제된 객체와 기존 객체는 서로 다른 객체이며 ,
사용하기 위해서는 복제할 클래스가 Cloneable 인터페이스를 상속받아야 한다.

Cloneable 인터페이스를 상속받았다하더라도 따로 구현해야하는 메서드는 없다. 이런 인터페이스를 마커 인터페이스라고 한다.

profile
성실하게

0개의 댓글