본문 바로가기
JAVA

[JAVA] Object.equals()와 String.equals(), ==연산자

by 정공자씨 2024. 4. 24.

 

[ object 클래스]

정의
- 자바 클래스들의 최상위 클래스(root class)


특징
1. object 클래스의 멤버는, 모든 클래스에서 사용 가능
2. 명시적으로 구현하지 않으면, 컴파일 시에 클래스가 자동으로 상속 받음
public class Student extends Object {  }
// Object 명시적으로 상속하지 않으면, 컴파일시 자동 추가 }​

3. object 타입의 참조변수는, 모든 클래스의 객체를 업캐스팅으로 받을 수 있음

 

 

 

Object class의 equals() 메서드

정의

  • 같은 객체인지를 확인할 때 사용하는 메서드
  • 즉, 객체의 위치값(주소값)을 비교하여 동일한 객체인지를 판별함

 

예제

class Coffee {
    private String name;
    
    public Coffee() {}
    
    public Coffee(String name) {
    	this.name = name;
    }
}

public class Test {
    public static void main(String[] args) {

        // new로 생성한 객체, 메모리가 독립적으로 생성됨
        Coffee coffee1 = new Coffee("캬라멜 막희앗또");
        Coffee coffee2 = new Coffee("캬라멜 막희앗또");

        // new로 생성한 객체이므로, 서로 위치값이 다름
        System.out.println( coffee1.equals(coffee2) );  // false			
    }
}
  • name3과 name4은 "정공자"라는 같은 이름을 가지고 있는 객체지만
  • 해당 객체는 독립적으로 메모리를 할당받아 생겼기 때문에, 객체의 주소값이 달라 false를 리턴

 

 

 

 

 

String class의 equals() 메서드

String 객체에서 equals() 메서드를 사용할 때, 주소값이 다른 객체임에도 불구하고 문자열 값이 같으면 true를 리턴하는 경우를 많이 볼 수 있음

[ 이유 ]
String 객체에서 문자열을 비교하기 위해서 equals() 메서드를 사용할 때는, 오버라이딩하여 재정의된 메서드를 사용하기 때문

 

정의

  • 값을 서로 비교함

 

예제

 

1. 문자열 리터럴의 비교

public static void main(String[] args) {
   
    // 문자열 리터럴
    String name = "정공자";
    String name2 = "정공자";

    System.out.println( name.equals(name2) );  // true
}

 

2. 문자열 객체 비교

public static void main(String[] args) {

    // new 키워드로 생성한 문자열     
    String name3 = new String("정공자");
    String name4 = new String("정공자");

    // equals로 문자열 비교시, 값을 비교
    System.out.println( name3.equals(name4) );  // true
}

 

 

 

 

==  연산자

1. 기본 타입의 데이터인 경우 : 데이터 값을 비교
2. 참조 타입의 데이터인 경우 : 객체가 생성된 메모리의 위치값(주소값)이 같은지를 비교

 

 

1. 기본 타입의 데이터를 비교

public static void main(String[] args) {

    // 1. 기본 타입의 데이터인 경우: 값을 비교
    int num = 1;
    int num2 = 2;
    int num3 = 1;

    System.out.println(num == num3);  // true
    System.out.println(num == num2);  // false    
}

 

 

2. 참조 타입의 데이터를 비교 

문자열 리터럴을 비교하기
public static void main(String[] args) {
   
    // 1. 리터럴로 문자열 생성
    // string pool에서 관리, 이미 저장된 값이 있는지를 확인하고, 있는 값을 사용
    String name = "정공자";
    String name2 = "정공자";

    System.out.println(name == name2);  // true
}
  • String literal pool이라는 공간에 해당 문자열을 할당함
  • 값이 같다면, 동일한 주소값을 참조하여 사용함

 

문자열 객체(new String) 비교하기
public static void main(String[] args) {

    // 2.new 키워드로 생성한 문자열 
    // heap영역에 별도로 생성, 각각 인스턴스가 생성되므로 다른 위치값(주소값)을 가짐
    
    String name3 = new String("정공자");
    String name4 = new String("정공자");

    System.out.println(name3 == name4);  // false
}
  • 각각 new 연산자에 의해 문자열 객체가 메모리에 각각 생성
  • 따라서 다른 주소값을 갖게 됨

 

문자열 객체 비교 시에, 객체 내의 데이터 값을 비교하기 위해 equals()를 사용하여 비교