HihoBookStudy / EffectiveJava

이펙티브 자바 북스터디입니다.
1 stars 0 forks source link

[아이템 1] 인스턴스 통제란? #1

Closed zpqmdh closed 3 months ago

zpqmdh commented 3 months ago

아이템 1은 정적 팩터리 메서드를 사용했을 때의 장점과 단점에 대해 설명하고 있습니다. 잘 이해가 되지 않는 부분이 장점 2. 호출될 때마다 인스턴스를 새로 생성하지는 않아도 된다. 라는 부분이었습니다. 해당 섹션 하단에 인스턴스 통제에 대한 설명이 나오는데, 이해가 잘 가지 않는 부분은 다음과 같습니다.

또한 불변 값 클래스(아이템 17)에서 동치인 인스턴스가 단 하나뿐임을 보장할 수 있다(a==b일 때만 a.equals(b)가 성립)

예시를 들어주시거나 부가 설명을 해주실 수 있나요?

IAGREEBUT commented 3 months ago

a==b일 때만, a.equals(b)가 성립 ⇒ 같은 내용의 인스턴스는 단 한개 존재한다 (동치인 인스턴스가 단 하나뿐임을 보장한다) 위의 내용을 이해하기 위해서 명확하게 해야할 개념이 몇가지 존재합니다.

  1. a==b VS a.equals(b)
    • a==b : 주소값을 비교 (같은 인스턴스여야함, 동일 메모리상 존재)
    • a.equals(b) : 가지고 있는 내용이 동일(ex. string이라면 같은 내용)

//두 가지 선언 방식의 차이는 아래를 참고하세요 
String a = "abc"; 
String b = "abc";  
String c = new String("abc"); //새로운 인스턴스를 생성

System.out.println(a.equals(b)); //true
System.out.println(a.equals(c)); //true
System.out.println(b.equals(c)); //true
System.out.println(a == b); //true
System.out.println(a == c); //false 


  1. String a = "abc" vs String a = new String("abc") 리터럴 선언방식 vs new연산자를 이용한 방식 스크린샷 2024-03-08 오후 2 24 40

리터럴 선언 방식

new연산자를 이용한 방식


**참고로 java의 String은 다른 참조형 클래스들과 다르게 특별한 타입입니다. 항상 new를 사용해야하는 타 참조형 클래스와는 다르게 리터럴로도 선언이 가능합니다.

하지만, 리터럴로 선언이 가능한 기본타입(int, double...) 이 Wrapper클래스로 ( new Integer(2)) 참조형 클래스처럼 선언 가능한 것과는 또 다른이야기입니다.



위의 내용을 토대로 a==b일 때만, a.equals(b)가 성립한다는 의미는 동일한 값을 가진 인스턴스는 메모리상에 단 한개 존재한다는 의미임을 알 수 있습니다.