ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java - 기본 클래스(Objectd의 equals()메서드)2
    개발언어/JAVA 2023. 11. 4. 16:06

    equals( )메서드

    equal()메서드의 원래 기능은 두 인스턴스의 주소 값을 비교하여 boolean 값(ture/false)을 반환해주는 것이다. 주소값이 같다면 당연히 같은 인스턴스이다. 그런데 서로 다른 주소 값을 가질 때도 같은 인스턴스라고 정의할 수 있는 경우가 있다.

    따라서 논리적 동일성을 구분할 때 equals()메서드를 재정의 해서 사용한다.

     

     

    물리적 동일성을 가질때

    Student studentLee = new Student(100,"이진희");
    Student studentLee2 = new studentLee; //주소 복사

     

    위 코드 와 같이 Student 인스턴스를 두개 생성하면 생성된 인스턴스를 가리키는 참조 변수(studentLee)를 다른 변수(studentLee2)에 복사한다. 이때 두 인스턴스는 물리적 동일성을 가진다.

     

    논리적 동일성을 가질때

    Student studentLee = new Student(100,"이진희");
    Student studentLee2 = new studentLee; 
    Student studentJin = new Student(100,"이진희");

    다음 코드로 논리적으로 동일한 이름과 학번을 가진 학생을 한명더 생성하고 다른 변수(studentJin)가 가리키도록 만들었다. studentLee, studentLee2가 가리키고 있는 인스턴스와 studentJin이 가리키는 인스턴스는 서로 다른 주소를 가지고 있지만, 저장된 학생 정보는 같다. 이런 경우는 equal()를 재정의해 studentLee, studentLee2와 studentJin을 같은 학생으로 처리하는 것이 바람직하다.

     

    Object클래스의 equals()메서드 사용하기

    package object;
    
    class Student{
        int studentId;
        String studentName;
    
        public Student(int studentId, String studentName){
            this.studentId = studentId;
            this.studentName = studentName;
        }
    
        @Override
        public String toString() {
            return studentId + "," + studentName;
    
        }
    }
    
    public class EqualsTest {
        public static void main(String[] args) {
            Student studentLee = new Student(100,"이진희");
            Student studentLee2 = studentLee; // 주소복사
            Student studentJin = new Student(100,"이진희");
    
    		
            if(studentLee == studentLee2) //==기호로 비교
                System.out.println("studentLee와 studentLee2의 주소는 같다.");
            else
                System.out.println("studentLee와 studentLee2의 주소는 다르다.");
            //studentLee와 studentLee2의 주소는 같다.
    
    
            if(studentLee.equals(studentLee2)) //==equals()메서드로 비교
                System.out.println("studentLee와 studentLee2의 동일하다.");
            else
                System.out.println("studentLee와 studentLee2의 동일하지 않다..");
            //studentLee와 studentLee2의 동일하다.
            
    
            if(studentLee == studentJin) //==기호로 비교
                System.out.println("studentLee와 studentJin의 주소는 같다.");
            else
                System.out.println("studentLee와 studentJin의 주소는 다르다.");
           //studentLee와 studentJin의 주소는 다르다.
    
    
            if(studentLee.equals(studentJin)) //equals()메서드로 비교
                System.out.println("studentLee와 studentJin은 동일하다.");
            else
                System.out.println("studentLee와 studentJin은 동일하지 않다.");
           //studentLee와 studentJin은 동일하지 않다.
    
        }
    
    }

     

     

    Object의 equals메서드를 재정의해서 == 기호로는 단순히 물리적으로 같은 메모리 주소인지 여부를 확인할 수 있고, Object의 equals()메서드는 재정의를 하여 논리적으로 같은 인스턴스인지 확인하도록 구현한다.

     

    Student 클래스에서 equals()메서드 직접 재정의하기

    package object;
    
    class Student{
        int studentId;
        String studentName;
    
        public Student(int studentId, String studentName){
            this.studentId = studentId;
            this.studentName = studentName;
        }
    
        @Override
        public String toString() {
            return studentId + "," + studentName;
    
        }
    
        //equals()메서드 재정의
        @Override
        public boolean equals(Object obj){
            if(obj instanceof Student) {
                Student std = (Student) obj;
                if (this.studentId == std.studentId)
                    return true;
                else
                    return false;
            }
            return false;
        }
    }
    
    public class EqualsTest {
        public static void main(String[] args) {
            Student studentLee = new Student(100,"이진희");
            Student studentLee2 = studentLee; // 주소복사
            Student studentJin = new Student(100,"이진희");
    
    
            if(studentLee == studentLee2) //==기호로 비교
                System.out.println("studentLee와 studentLee2의 주소는 같다.");
            else
                System.out.println("studentLee와 studentLee2의 주소는 다르다.");
            //studentLee와 studentLee2의 주소는 같다.
                
    
            if(studentLee.equals(studentLee2)) //==기호로 비교
                System.out.println("studentLee와 studentLee2의 동일하다.");
            else
                System.out.println("studentLee와 studentLee2의 동일하지 않다..");
            //studentLee와 studentLee2의 동일하다.
            
            if(studentLee == studentJin) //==기호로 비교
                System.out.println("studentLee와 studentJin의 주소는 같다.");
            else
                System.out.println("studentLee와 studentJin의 주소는 다르다.");
            //studentLee와 studentJin의 주소는 다르다.
    
            if(studentLee.equals(studentJin)) //==기호로 비교
                System.out.println("studentLee와 studentJin은 동일하다.");
            else
                System.out.println("studentLee와 studentJin은 동일하지 않다.");
            //studentLee와 studentJin은 동일하다.
    
        }
    
    }

     

    Object의 equals()메서드를 재정의한 후에 main 함수의 실행 결과를 보면, studentLee와 studentJin은 서로 다른 메모리 주소에 존재하는 인스턴스이르모 == 연산의 결과 값은 false를 반환하지만, 학번이 같으므로 equals()는 true를 반환한다.

     

     

    [출저 - Do it! 자바 프로그래밍 입문 , 박은종]

    http://www.easyspub.co.kr/20_Menu/BookView/A001/267/PUB

     

    http://www.easyspub.co.kr/20_Menu/BookView/A001/267/PUB

     

    www.easyspub.co.kr

     

    댓글

Designed by Tistory.