반응형

안녕들 하시죠!

이번시간에는 Java의 equals 메소드에 대해 알아보겠습니다.

 

ㆍ boolean equals(Object obj)

 

equals 메소드는 인자로 건네진 obj가 가리키는 객체와 현재 객체를 비교하여 같으면 true를 리턴한다.

java.lang 패키지의 Object 클래스에 속해있는 메소드이다.

 

 우리가 흔히 알고있는 == 연산자와 equals는 어떻게 다를까?

 

==은 비교 연산자로서 두 개의 피연산자를 비교하여 true 또는 false의 논리 값을 내는 연산자 입니다.

 

1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args) {
 
    int a = 5;
    int b = 7;
        
    if (a == b) {
        System.out.println("true");
    } else {
        System.out.println("false");
    }
}
cs

 

위의 코드에서 보면 변수 a,b에 있는 값을 비교하여 논리 값을 내는 연산자입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class numberEx {
    int x;
    int y;
 
    public numberEx(int x, int y) {
        this.x = x;
        this.y = y;
    }
 
    public static void main(String[] args) {
 
        numberEx a = new numberEx(12);
        numberEx b = new numberEx(12);
        numberEx c = a;
        
        if (a == b) {
            System.out.println("a==b // true");
        }
        if (a.equals(b)) {
            System.out.println("a.euqals(b) // true");
        }
        if (a.equals(c)) {
            System.out.println("a.equals(c) // true");
        }
        if (a == c) {
            System.out.println("a==c // true");
        }
    }
}
cs

 

위에있는 코드에선 numberEx의 객체 2개를 생성하고 레퍼런스 a와 b는 이들을 각각 가리킵니다.

 

a와 b의 레퍼런스 값이 다르기 때문에 a == b의 결과값은 false입니다.

c에는 a의 레퍼런스가 대입되었기 때문에, a == c의 결과는 true입니다.

 

이것으로 보아 == 연산자는 두 레퍼런스가 동일한 객체를 가리키는지 비교한다는 것을 알 수 있습니다.

 

 

ㆍ String 클래스의 객체비교

 

1
2
3
4
5
6
7
8
9
10
11
12
public static void main(String[] args) {
 
    String a = new String("hongpossible");        
    String b = new String("hongpossible");
        
    if(a==b) {
        System.out.println("a==b");
    }
    if(a.equals(b)){
        System.out.println("a.equals(b) // true");
    }
}
cs

 

 

위에있는 코드를 보시면 a와 b는 다른 객체를 가리키고 있으므로 a==b의 결과는 false입니다.

a와 b가 다른 객체를 가리키고 있지만 a.equals(b) 가 true가 나온것은,

 

java.lang에 속한 Object 클래스의 equals(Object object) 메소드는 obj와 this(자기자신)의 레퍼런스를 ==로 단순 비교하여 결과를 리턴하도록 만들어져 있으며, 내용에 대해서는 비교하지 않습니다.

하지만, String클래스는 두 문자열이 같은지를 비교하도록 equals() 메소드를 오버라이딩하여 가지고 있습니다. 

 

ㆍ equals() 오버라이딩

 

참고서적의 예제를 통해 알아보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Rect {
    int width;
    int height;
 
    public Rect(int width, int height) {
        this.width = width;
        this.height = height;
    }
 
    public boolean equals(Object obj) { // equals 오버라이딩
        Rect r = (Rect) obj;
        if (width * height == r.width * r.height) {
            return true;
        } else {
            return false;
        }
    }
 
    public static void main(String[] args) {
        Rect a = new Rect(1020);
        Rect b = new Rect(2010);
        Rect c = new Rect(3040);
 
        if (a.equals(b)) {
            System.out.println("a와 b의 면적은 같다.");
        }
        if (b.equals(c)) {
            System.out.println("b와 c의 면적은 같다.");
        }
        if (a.equals(c)) {
            System.out.println("a와 c의 면적은 같다.");
        }
    }
}
cs

 

위의 예제와 같이 작성자가 재정의하여 사용 가능합니다.

 

아래는 백준 스택 문제를 풀며 equals를 사용한 제 블로그 자료입니다.

 

2019/05/10 - [백준 .Java] - 백준 10828번 (스택)

 

백준 10828번 (스택)

안녕들 하시죠! 이번시간에는 백준 10828번 스택 문제를 풀어보겠습니다. 스택 이란? 제일 먼저 입력된 데이터가 맨 아래에 쌓이고 가장 최근에 입력된 데이터가 가장 위에 쌓이는 후입 선출(LIFO : Last-in Fir..

hongpossible.tistory.com

 

오늘은 여기까지입니다 감사합니다 !

 

참고서적 황기태,김효수 「명품 JAVA Programming」

'Java' 카테고리의 다른 글

Java의 Math 클래스  (0) 2019.05.17
Java의 문자열 분리 (StringTokenizer)  (0) 2019.05.16
Java의 추상 클래스  (0) 2019.05.11
Java의 생성자  (0) 2019.04.29
Java의 length필드 사용법  (1) 2019.04.29

+ Recent posts