여러가지 기본적인 java.lang 패키지의 클래스를 공부해보자.
ㅇObject 클래스 <<요거를 보자
Object 클래스
ㅡ클래스 선언시 extends로 다른 클래스를 상속하지 않는다면 -> 암시적으로 java.lang.Object클래스를 상속하는 것이다. -> 자바의 모든 클래스는 Object 클래스의 자식/자손 클래스다. Object는 최상위 부모클래스!!
혼공자 책에서 살펴보자고 하는 메소드는 다음 노란 형광펜 친 메소드.
ㅇ객체 비교 equals() 메소드
ㄴ이 메소드의 매개타입은 Object : 즉, 모든 객체가 매개값으로 대입될 수 있다. (by 자동타입변환)
ㄴ논리적으로 동등하냐 동등하지 않냐를 본다.
ㄴ논리적 동등 : 같은 객체건 다른 객체건.. 객체가 저장하고 있는 데이터가 동일하면 논리적으로 동등한 것이다.
(Object클래스의 객체비교 equals()메소드는 비교연산자 ==와 동일한 결과를 리턴한다.)
(==연산자와 동일하게 "번지를 비교한다")
ㄴ일반적으로 Object클래스의 equals()메소드는 직접 사용되지 않고 하위클래스에서 재정의하여 이용
예) String 객체의 equals() 메소드 --> 번지비교 말고 문자열비교하는 걸로 메소드를 변경한 것
equals메소드 재정의할 때 :
1. 매개값(비교객체)이 기준객체와 동일한타입인지 먼저 확인하기 ->다른 타입이면 false리턴
ㄴObject타입이므로 각종 객체가 매개값으로 들어올 수 있기 때문에
ㄴinstanceof 연산자를 통해 알아본다.
2. 동일한 타입이라면 -> 기준객체타입으로 강제타입변환해서 필드값이 동일한지 검사. 필드값이 모두 동일하다면 true 리턴, 다른게 있다면 false리턴
>>Member 클래스에서 equals() 메소드를 재정의해보자.
ㅇ매개값이 Member타입이면서 id필드값이 같을 경우 -> true리턴
ㅇ그 이외 -> false 리턴
<<객체 동등 비교 equals() 메소드 재정의해서 사용해보기>>
Member클래스에서 equals() 메소드를 재정의해보자.
ㅇ객체 해시코드 hashCode()
: 객체를 식별하는 하나의 정수값
객체의 메모리 번지를 이용 -> 해시코드를 만들어 리턴!!
객체마다 다른 값을 리턴한다 --> 논리적 동등을 비교하려면 hashCode()를 재정의해야 한다.
논리적으로 동등한 객체다 : hashCode()리턴값 동일 -> equals() 리턴값 동일
ㄴhashCode()리턴값이 같다러도 equals리턴값이 다르면 논리적으로 다른 객체다.
<<만약 hashCode()를 재정의하지 않는다면>>
(우리가 작성하는 클래스를 동등비교하는 컬렉션객체 Hashset, HashMap, Hashtable)
ㅇequals() 재정의 --> 객체타입이 같고 필드값이 같아야 한다. (필드number값으로 키를 구분할 것임 Key(1), Key(2), ...)
ㅇhashCode() 재정의 --> 필드값이 같다면 같은 해쉬코드를 리턴하도록 재정의해야한다.즉, 그 필드값의 의 해쉬코드를 리턴하도록 해야 한다.
@Overridepublic int hashCode() { return number.hashCode();}
--> HashMap의 식별키로 Key객체를 사용하고 있다. --> new Key(1)객체로 "홍길동"을 저장하고, 다시 new Key(1)객체로 저장된 "홍길동"을 읽으려고 했지만 결과는 null이다.
--> hashCode()에서 리턴하는 해시코드가 다르기 때문이다. (다른 식별키로 인식한다)
--> 저장할 때와 읽을 때의 new Key(1)은 서로 다른 객체이다.
"홍길동"을 읽어오고 싶으면
재정의한 hashCode() 메소드를 Key클래스(Object클래스의 자식)에 추가해야 한다.
해시코드 리턴값을 number필드값으로 하면 : 저장할때 new Key(1)와 읽을때 new Key(1)가 같은 해시코드를 리턴한다.
--> 저장할 때와 읽을 때의 new Key(1)은 서로 다른 객체이지만, HashMap은 다음 조건을 통해 둘을 동일한 객체로 평가한다.
ㅇhashCode()의 리턴값이 동일
ㅇequals()의 리턴값이 true
즉, 객체의 동등 비교를 위해서는
ㅇequals() 메소드의 재정의
ㅇhashCode() 메소드의 재정의
모두 필요하다!
두 객체가 사실 다른 객체이더라도
논리적으로 동등한 객체면 동일한 해시코드를 리턴하도록 hashCode()를 재정의해야 한다.
<<아까 작성한 Member클래스에서 +hashCode()를 재정의해서
id필드(String타입)값이 같은 경우 같은 해시코드를 리턴하도록 해보자.
같은 문자열일 경우 동일한 해시코드를 리턴하도록 하기 위해서 "String의 hashCode()메소드 리턴값 활용"
--> String의 hashCode()는 "같은 문자열일 경우 동일한 해시코드를 리턴한다"
객체 문자 정보 toString()
Object클래스의 toString()메소드는
ㅇ"객체의 문자정보를 리턴한다." (문자열)
ㅇ다음과 같은 문자정보를 리턴 : 클래스이름@16진수해시코드
Object obj = new Object();
System.out.println(obj.toString());
실행 결과 : java.lang.Object@de6ced
딱 보면 보이겠지만 Object의 toString()메소드는 보통 재정의하여 간결, 유익한 정보를 리턴하게끔 만들어 쓴다.
예) java.util패키지의 Date클래스는 toString()을 재정의하여 현재시스템의 날짜, 시간정보 리턴
예) String클래스는 toString()을 재정의하여 저장하고 있는 문자열을 리턴
그럼
<<Object클래스와 Date클래스의 toString()메소드 리턴값 출력해보기>>
직접 toString()메소드를 재정의해보자.
확인문제 3
어라리?? 근데 키로쓰이는 클래스에서 equals()를 재정의하는 내용에서
필드값 같은지 비교할 때..
혼공자 동영상 강의에서는 비교연산자 ==를 사용했고
책에서는 equals()메소드를 사용했다.
상관 없는 이유가 이건가?
Object클래스에서는 ==와 equals() 기능이 같기 때문??
Object클래스에서는 ==처럼 equals()도 객체의 번지를 비교하니까
같은 기능이라고 배웠는데 그래서 두개 다 사용 가능한거겠지?
음 아닌데 String클래스에서 재정의된 equals()메소드를 사용하고 있는건데..
아아 오키 아아 알겠다..
이 예제에서 Student클래스 안에 Getter 메소드를 굳이 작성한 이유를 생각해보자
이용하라고 작성을 했겠지!!
그럼 이용을 해줘보까? ^ㅡ^
아 게다가 Getter도 String 타입이고, 필드 studentNum도 String 타입이니까
String에서 재정의되는 .equals()로 필드 문자열이 같은지 확인해주는게 좋겠다!!
확인문제4
관련내용 복습 :
System.out.println()의 매개값에 객체를 주면,
객체의 toString() 메소드를 호출해서 리턴값을 받아 출력하게 되어 있다는거!!!
이거 기억해야한다!!
Object클래스 자식클래스에서 toString()을 재정의해서 사용하는 이런 상황을 잊지 말자
"객체의 문자열을 리턴"
'JAVA' 카테고리의 다른 글
[JAVA] java.lang 패키지의 Class클래스 (0) | 2020.07.23 |
---|---|
[JAVA] java.lang 패키지의 System클래스 (0) | 2020.07.23 |
[혼자 공부하는 자바] 7/21 11-1 [기본 API클래스] [java.lang 패키지] (0) | 2020.07.21 |
[혼자 공부하는 자바] 7/19 10-2 [예외 처리] (0) | 2020.07.19 |
[혼자 공부하는 자바] 7/17 10-1 [예외 처리] [예외 클래스] [일반예외] [실행예외] (0) | 2020.07.17 |