250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- equals()
- 테스트코드
- 티스토리챌린지
- HttpServletResponse
- @configuration
- 코딩테스트
- 오버라이딩
- 추상클래스
- JSON
- 오블완
- http 메시지 컨버터
- 백준
- 스프링컨테이너
- 코드트리조별과제
- fielderror
- 싱글톤
- 참조변수
- 김영한
- 인터페이스
- objecterror
- DI
- 프록시
- 서블릿
- html form
- ocp
- 의존관계
- 코드트리
- java
- 다형성
- 스프링
Archives
- Today
- Total
minOS
자바의 정석 ch9-1~3 Object 클래스와 equals() 본문
728x90
ch9-1 Object클래스
- 모든 클래스의 최고 조상 , 11개의 메서드만을 가지고 있다.
- notify(),wait() 등은 쓰레드와 관련된 메서드이다.
- 이 클래스는 java.lang 패키지에 속해 있으며, 모든 객체가 공통으로 가져야 할 기본적인 메서드들을 제공합니다.
ch9-2 equals(Object obj)
- 객체 자신(this)과 주어진 객체(obj)를 비교한다. 같으면 true 다르면 false.
- Object 클래스의 equals()는 객체의 주소를 비교(참조변수 값 비교)
public boolean equals(Object obj) { if (this == obj) { return true; //주소가 같으면 true } // 추가 내용 }
예제class Value{ int value; Value(int value){ this.value =value; } } public class Ex9_1 { public static void main(String[] args) { Value v1 = new Value(10); Value v2 = new Value(10); System.out.println(v1.equals(v2)); //false 반환 } }
출력결과객체v1,v2의 주소값이 다르기 때문에 false를 반환한다. 이를 그림으로 표현해보면
힙 메모리 +----------------------------------+ | | | +----------------------------+ | | | Value 객체 | | v1 --->| 주소: 0x1234ABCD | | | | value: 10 | | | +----------------------------+ | | | | +----------------------------+ | | | Value 객체 | | v2 --->| 주소: 0x5678EFGH | | | | value: 10 | | | +----------------------------+ | | | +----------------------------------+ 스택 메모리 +----------------------------------+ | v1 (참조변수) | | 값: 0x1234ABCD | +----------------------------------+ | v2 (참조변수) | | 값: 0x5678EFGH | +----------------------------------+
서로 다른 두 객체의 주소값은 항상 다르다.
ch9-3 equals(Object obj)의 오버라이딩
- 인스턴스 변수(iv)의 값을 비교하도록 equals()를 오버라이딩해야 한다.
equals 오버라이딩해서 주소가 아닌 인스턴스를 비교하게 바꾸면
class Value { int value; Value(int value) { this.value = value; } public boolean equals(Object obj) { // return this == obj ; 주소비교 ,서로 다른 객체는 항상 거짓 // 참조변수의 형변환 전에는 반드시 instanceof로 확인해야함 if (!(obj instanceof Value)) return false; Value v = (Value) obj; return this.value == v.value; } } public class Ex9_2 { public static void main(String[] args) { Value v1 = new Value(10); Value v2 = new Value(10); System.out.println(v1.equals(v2)); //true } }
출력결과
메모리 구조
메모리 +----------------------------------+ | | | Value 인스턴스 v1 | | 주소: 0x1000 | | +----------------------------+ | | | value: 10 | | | +----------------------------+ | | | | Value 인스턴스 v2 | | 주소: 0x2000 | | +----------------------------+ | | | value: 10 | | | +----------------------------+ | | | +----------------------------------+
equals() 메서드 비교 과정
v1.equals(v2) 호출 | v +----------------------------------+ | | | 1. instanceof 검사 | | obj instanceof Value: true | | | | 2. 형변환 | | Value v = (Value) obj | | | | 3. 값 비교 | | this.value == v.value | | 10 == 10 ✓ | | | | 결과: true | | | +----------------------------------+
728x90
'TIL > 남궁성의 자바의 정석' 카테고리의 다른 글
자바의 정석 ch9-7~10 String클래스, 문자열 비교, 빈 문자열 (1) | 2024.10.10 |
---|---|
자바의 정석 ch9-4~6 hashCode(), toString() (1) | 2024.09.25 |
자바의 정석 ch8-18 연결된 예외(chained exception) (0) | 2024.09.23 |
자바의 정석 ch8-15~17 사용자 정의 예외 만들기, 예외 되던지기 (1) | 2024.09.14 |
자바의 정석 ch8-11~14 예외선언하기 ,finally블럭 (1) | 2024.09.12 |