[Java] String과 객체비교

dwkim·2023년 2월 27일
String s1 = "하하"; 
  • "하하"는 s1에 저장되지 않음. s1은 그냥 객체(리모콘)
  • 즉, 모든 문장은 객체
  • 위 코드는 String s1 = new String("하하")의 줄임말.
String s = "abc";
  • "abc"는 1개의 문자가 아닌 문자 a, 문자 b, 문자 c의 조합
  • 힙에 "abc'를 만들고 이것을 리모콘 s에 넣는다
  • s는 문장을 조종하는 리모콘

객체비교

  • 객체비교는 무조건 equals()로 한다!
    cf. 변수비교는 ==로 한다
  • 모든 객체는 equals()라는 메서드 갖고있음
  • equals() : 두 개의 객체가 가리키고 있는 것이 같은지 비교 (동등성 비교)
  • == : 두 개의 변수가 완전히 동일한 존재인지 비교 (동치성 비교)
class Main {
    public static void main(String[] args) {
        char c1 = 'a';
        char c2 = 'a';
        
        System.out.println(c1 == c2); // true
        
        // String 은 char의 순서있는 조합이다.
        String s1 = "하하";      
        String s2 = "하"; // s1과 다르므로 애초에 다른 객체가 생성 (재활용 X)
        s2 += "하";

        System.out.println(s1 == s2); // false
        System.out.println(s1.equals(s2)); // true
    }
}

  • String s = "문장";String s = new String("문장");의 줄임말이지만 사실 다르다.
  • String s = "문장";메모리 절약 모드 (같은 문장을 생성하는 객체일때만 가능)
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 메서드를 오버라이드 해야 한다.

        String s1 = "하하"; // 문장객체 생성됨
        String s2 = "하하"; // 위 객체와 같은 문장 생성 -> 기존의 객체의 리모콘만 리턴 (메모리 절약 모드)

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

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

        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);
        System.out.println("s3.equals(s4) : " + s3.equals(s4));
    }
}

class Person {
    private int age;

    public Person(int age) { this.age = age; }
}
profile
예비 백엔드 개발자

0개의 댓글