Java/[국비] JAVA
[국비][JAVA] 불변 객체 String의 동일성/동등성
줌인.
2024. 6. 3. 19:54
[동등성과 동일성 비교]
동일성 (==) | 동등성 (equals) |
- 객체 '주소값' 비교 | - 논리적인 객체 내용 비교 |
※ String은 euqals를 사용(오버라이딩 되어 있음)
[String의 리터럴과 객체 생성 비교]
리터럴("winter") | 객체 생성(new String("winter")) |
- 상수 (문자열) 풀에 저장 - 같은 주소값 공유 |
- 객체 생성으로 각자의 주소값이 생김 - 다른 주소값 공유 |
[예제 코드]
public class S1Main {
public static void main(String[] args) {
Object obj = new Object();
Object obj2 = new Object();
System.out.println("객체 비교(동일성) : " + (obj == obj2)); //객체 주소값 자체 비교
System.out.println("객체 비교(동등성) : " + obj.equals(obj2)); //equals 자체가 == 를 가지고 있음
//불변객체
String n = new String("winter"); //객체 생성
String n2 = "winter"; //리터럴 생성
String n3 = "winter"; //리터럴 생성
System.out.println("객체 주소값 : " + obj);
System.out.println("객체 주소값 : " + n2); //String은 편의상 toString()오버라이딩 되어있다.
System.out.println("객체 비교(동일성) : " + (n==n2)); //객체 생성과 리터럴은 다르게 본다.
System.out.println("객체 비교(동등성) : " + n.equals(n2)); //String 자체 equals는 overriding
System.out.println("객체 비교(동일성) : " + (n2==n3)); //리터럴 생성시 같은 주소값을 참조한다.
System.out.println("객체 비교(동등성) : " + n2.equals(n3)); //값역시 동일하다
}
}
[리터럴과 객체 생성 도식화]

728x90