본문 바로가기

Dev.BackEnd/JAVA

[JAVA] 11 - 1. Object 클래스와 그 메소드들




Chapter 11 - 1. Object 클래스 .equals( ) 메소드

 Java의 모든 클래스는 하나의 동일한 클래스를 상속받는다.

이렇게 하면 최상위 클래스에 정의되어 있는 메소드를 사용할 수 있게 되는 장점이 존재한다.

Object 클래스
모든 클래스의 조상인 Object 클래스

어떠한 클래스를 정의했는데 아무 클래스도 상속받지 않고 있다면
자동적으로 Object 클래스를 상속하고 있는 것이다.
모든 클래스들이 갖고 있는 기능들.
왜?
Object 클래스에 있는 메소드들을 통해서 클래스의 기본적인 기능을 정의할 수 있기 때문이다.

Object 클래스에 선언되어 있는 메소드는 객체를 처리하기 위한 메소드스레드를 위한 메소드로 나뉜다.
쓰레드를 위한 메소드들은 final로 선언이 되어 있어서 오버라이딩 할 수 없다.
equals 또는 toString 같은 메소드는 오버라이딩해서 사용할 수 있다.


.equals(Object obj)
매개변수로 객체의 참조변수를 받아서 비교하여
그 결과를 boolean 값으로 알려주는 역할을 한다. 
code>
1
2
3
4
5
6
7
8
9
String str1 = new String("text");
String str2 = new String("text");
String str3 = "text";
String str4 = "text";
 
System.out.println(str1==str2); //false
System.out.println(str1.equals(str2)); //true
System.out.println(str3==str4);//true
System.out.println(str3.equals(str4));//true
cs

위의 예제를 통해서 알아보자.
str1과 str2는 String 객체를 통해서 생성되었다.
str3과 str4는 리터럴 방식으로 문자열을 binding 했다.
== 와 equals 메소드에 대해서 짚고 넘어가야겠다.
결론부터 말하자면 원래는 같다.
하지만 equals 메소드에 String 객체가 들어오게 되면 다른 방식으로 동작하도록 오버라이딩 되어 있다.
리터럴 방식으로 value 값을 문자열 변수에 할당해주는 것은,
컴파일 과정에서 static area에 constant로 loading된다.
그렇기 때문에 똑같은 문자열은 하나의 문자열로 인식되어
str1과 str2는 constant pool(static area)에 존재하는 "text"라는 문자열을 가리키고 있는 것이다.
다른 인스턴스이지만 참조하고 있는 문자열은 같기 때문에 == 연산값이나, equals 반환값 둘 다 true 값이 반환된다.

str1과 str2는 서로 다른 객체인 것이다.
new를 통해 다른 인스턴스를 생성했고
같은 값을 표현하고 있어도 다른 객체이기 때문에, str1 == str2는 false가 된다.
하지만 str1.equals(str2)는 true 이다.
value 값만 같으면 true를 return하도록 오버라이딩 되어 있기 때문이다.

다른 예제를 보자.
code>
1
2
3
4
5
6
7
8
Student lee1 = new Student(100"lee");
Student lee2 = new Student(100"lee");
Student lee3 = lee1;
 
System.out.println(lee1==lee2);//false
System.out.println(lee1.equals(lee2));//false
System.out.println(lee1==lee3);//true
System.out.println(lee1.equals(lee3));//true
cs

프로그래머 입장에서는 lee1와 lee2가 같다.
equals 메소드 반환값을 true로 할 수는 없을까?
이럴 때, equals 메소드를 오버라이딩 해야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override
public boolean equals(Object obj){
    //DownCasting 할 때는 방어코드를 삽입해줘야 한다.
    if(obj instanceof Student){ 
        Student student = (Student)obj;
        return (this.studentId == student.studentId);
    }
    return false;
}
 
@Override
public int hashCode() {
    return studentId;
}
cs

equals와 항상 함께 사용하는 것이 hashcode()이다.
equals을 오버라이딩을 할 때 hashcode()를 같이 구현해주어야한다.
lee1과 lee2를 studentId를 통해 동일한 객체라는 것을 인식시켰다.
instanceof 를 통해 우리가 equals 메소드를 적용할 클래스인지 먼저 확인을 하고 들어가야 한다.
그렇게 하지 않으면 Casting 하는 과정에서 JVM이 죽는다.
이클립스도 잡아주지 않는 에러이므로 주의하도록 하자.



포스팅 내용은 생활코딩의 이고잉님의 강의자료를 기준으로 작성하였습니다. 문제가 될 시 삭제하겠습니다.

Chapter 11 - 1. The End