[이펙티브 자바 3장] 모든 객체의 공통 메서드
1. 아이템13 81P
: 배열의 clone 메소드는 깊은복사를 해서 배열의 clone 메서드는 사용 권장한다는 말까지는 이해 되었는데, "배열의 clone 은 런타임 타입과 컴파일타임 타입 모두가 원본 배열과 똑같은 배열을 반환한다" 라는 말을 이해하지 못하겠습니다 ..!
=> 자바 1.5부터 배열에 clone을 호출하면 반환되는 배열의 컴파일 시점 자료형은 복제 대상 배열의 자료형과 같기 때문에 컴파일 시점에 결정된 배열은 런타임 시점 타입과 동일하다.
2. 아이템13
: clone 메소드에 대해서 좀 보다가 사용하는 곳을 찾아보았는데
OOOService.java 의
Entity ent = entList.get(i).clone();
요기는 clone 해서 사용하는 이유가 뭘까욤..??
=> HashMap의 clone은 얕은 복사를 한다. 즉, 복사 대상 객체의 주소 값을 복사하기 때문에 원복 값이 변경되면 clone한 객체도 변경되고 clone 객체 변경 시 원복 객체도 변경된다. *얕은 복사(shallow copy), 깊은 복사(deep copy)의 차이
ent.put("qty", 1); // 수량
으로 값을 put하는데 얕은 복사를 하여 원복 hashmap까지 변경된다. 이 경우 깊은 복사를 하려고 했던 것으로 보이는데 clone을 잘 못 사용한 것으로 보인다.
3. 아이템14 - 91p
: compareTo 메소드에서 관계 연산자 < 와 > 를 사용하는 이전 방식은 거추장스럽고 오류를 유발한다 -> 시스템 내 compareTo 메소드에서 <, > 사용하는 소스가 많은데 특정 케이스에서만 오류가 나는걸까요?? 동일한 질문으로
박싱된 기본 타입 클래스들에 새로 추가된 정적 메서드인 compare를 이용하면 되는 것이다. 관계 연산자 <,> 와 다르게 래퍼클래스들의 compare가 더 신뢰도 높은 것은 어디서 기인하는 걸까요?
=> 두 수의 대소비교 시 두 수의 차를 통한 음수, 0, 양수는 비교 시 뺄셈 과정에서 자료형의 범위를 넘어버릴 수 있다.
int min = Integer.MIN_VALUE; // MIN_VALUE는 -2,147,483,648 이다.
int max = Integer.MAX_VALUE; // MAX_VALUE는 2,147,483,647 이다.
max - min = 2,147,483,647 - (-2,147,483,648) = 4,294,967,295 을 예상하지만 overflow가 발생한다. int의 최대값은 2,147,483,647이기 때문에..(int의 범위는 -2,147,483,648 ~ 2,147,483,647 이다.)
compareTo를 통해 <,> 연산자로 값을 비교할 때 Overflow,Underflow가 발생할 수 있다.
1. 아이템 11 (p.70)
그 과정에 비결정적(undeterministic) 요소는 전혀 없으므로 동치인 PhoneNumber 인스턴스들은 같은 해시코드를 가질 것이 확실하다.
비결정적 요소란 무엇이고, 그것이 해시코드에 미치는 영향이란 무엇일까요?
=> 비결정적 요소는 확률적인 요소를 의미하는 것으로 PhoneNumber의 해시코드를 구할 때 3개의 요소는 난수로 생성되는 것이 아닌 인자로 받아 이미 고정된 값을 의미. 따라서 동치 관계의 phoneNumber는 동일한 해시코드를 가진다.
2. 아이템 13 (p.81)
Cloneable 아키텍쳐는 '가변 객체를 참조하는 필드는 final로 선언하라'는 일반 용법과 충돌한다.
=> 위 소스 코드와 연관지어 살펴보면 가변 객체를 참조하는 필드인 elements를 final로 선언하게 되면 this.elements = elements.clone;를 사용할 수 없다.
Clone을 사용하려고 하면 가변 객체를 참조하는 필드를 final로 만들 수 없다는 의미
'IT 개발 > 개념 정리' 카테고리의 다른 글
[아이템 17] 변경 가능성을 최소화하라 (0) | 2022.05.14 |
---|---|
[아이템 16] public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 (0) | 2022.05.14 |
[아이템 15] 클래스와 멤버의 접근 권한을 최소화하라 (0) | 2022.05.13 |
[ssh known_hosts] (0) | 2022.03.16 |
[네트워크] telnet, netstat -tnlp 명령어 (0) | 2022.03.04 |