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