230227 - new String()의 차이점

ghltjd369·2023년 2월 27일
0
package org.example;

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person(13);
        Person p2 = new Person(13);

        System.out.println(p1);
        System.out.println(p2);

        System.out.println("p1 == p2 : " + (p1 == p2)); // 리모콘 끼리 비교, 당연히 false
        System.out.println("p1.equals(p2) : " + p1.equals(p2)); // 객체끼리 비교, 하지만 여기서는 Person 클래스에 equals 메서드를 오버라이드 하지 않아서 false
        // 즉 객체 비교를 하려면 해당 클래스에 equals 메서드를 오버라이드 해야 한다.

class Person {
    private int age;

    public Person(int age) { this.age = age; }
}

위 코드에서 p1.equals(p2)가 true가 나오기 위해서는 Person 클래스에서 equals 메서드를 오버라이드 해야 한다.

String s1 = "하하"; // 문장객체 생성됨
String s2 = "하하"; // 여기서는 기존의 객체의 리모콘만 리턴, 이유 : 메모리 절약

System.out.println("s1 : " + s1);
System.out.println("s2 : " + s2);

System.out.println("s1 == s2 : " + (s1 == s2));				//true
System.out.println("s1.equals(s2) : " + s1.equals(s2));		//true

String s3 = new String("하하"); // 재활용 x
String s4 = new String("하하"); // 재활용 x

System.out.println("s3 : " + s3);
System.out.println("s4 : " + s4);

System.out.println("s3 == s4 : " + s3 == s4);				//false
System.out.println("s3.equals(s4) : " + s3.equals(s4));		//true

String의 경우 new String()을 안하면 자동으로 메모리를 절약하여 같은 객체를 가리키게 된다.
즉 s1과 s2는 같은 객체 "하하"를 가르킨다는 뜻.
따라서 s1 == s2를 했을 경우 true가 나오게 된다.

반면 new String()을 이용하면 s3가 가르키는 "하하"와 s4가 가르키는 "하하"는 다른 객체가 된다.
즉 두 개의 객체가 생성됐다는 뜻.
따라서 s3 == s4를 하면 false가 나온다.

0개의 댓글