곽로그

[자바] Object 클래스 - equals메서드 본문

language/java

[자바] Object 클래스 - equals메서드

일도이동 2021. 4. 22. 22:15
반응형

기초 지식

1. 메모리

프로그램이 메모리를 사용하는 방식

코드실행영역

데이터 저장영역

 

객체지향 프로그램의 데이터 저장영역

코드실행영역

스태틱 영역

-클래스

스택 영역
- 메서드

힙 영역
- 객체

 

2. this

 this는 참조변수로 인스턴스 자신을 가리킨다. 다시 말하면, 힙영역에 생성된 인스턴스의 메모리 주소라고 할 수 있다. 

class Person{
	int id;
    String name;
    int age;

    Person(){
        System.out.println("this출력 : "+this);
    };
    
    Person(int id, String name, int age){
    	this.id = id;
        this.name = name;
        this.age = age;
    }

}
public class Demo {
    public static void main(String[] args) {
        Person person = new Person();
        System.out.println(person);
    }
}

 

 위의 코드에서 main을 실행할 때의 메모리 변화를 보자. 우선 전처리 과정으로 JVM이 java.lang패키지를 스태틱 영역에 로드한다. 그 다음 클래스(Person, Demo) 들을 스태틱 영역에 로드한다. 

JVM의 전처리가 끝났다면, 이제 main함수가 메모리에 로드 된다. 

 

이제 main 함수를 실행해보자. 맨 먼저 변수 arg를 위한 공간을 만든다. 그 다음 자료형이 Person인 참조변수 person을 위한 공간을 만든다. 그 다음 new person() 를 통해 힙영역에 새로운 인스턴스를 생성한다. 생성된 인스턴스의 주소를 person에 할당한다. 

this는 생성된 인스턴스의 힙메모리 주소를 반환한다. 

 

 

equals 함수

Object 클래스에 정의되어 있는 equals함수를 보면 아래와 같다. 

public boolean equals (Object obj){
	return (this == obj);
}

this란 힙에 생성된 객체의 메모리 주소를 반환한다고 했다. 따라서 위의 함수는 자신의 주소값이 매개변수로 들어온 참조변수의 참조값을 비교하여 같으면 true, 다르면 false를 반환한다고 할 수 있다. 다시말해 객체의 주소값을 비교하는 메서드이다. 

 

아래의 예제를 보자

Person person1 = new Person();
Person person2 = new Person();
        
System.out.println("person1 : "+ person1);
System.out.println("person2 : "+person2);
System.out.println(person1.equals(person2));

person1과 person2가 스태틱 메모리에 다른 위치에 생성되었기 때문에 두 인스턴스의 주소값을 다르다. 따라서 false를 반환한다

 

 

equals함수 오버라이딩

위의 Person 객체를 주민등록번호를 이용하는 프로그램에서 만들어진 클래스라고 해보자.  주민등록번호가 같으면, 같은사람으로 처리 해줘야 한다. 다시말해 person1 인스턴스와 person2인스턴스의 주민등록번호가 같으면 같다는 처리가 필요하다. 

 

 이를 위해 Person 클래스에서 equals클래스를 오버라이딩 해준다. 

@Override
public boolean equals(Object o) {
	if (this == o) return true; //주소가 같으면 같은 객체
	if (o == null || getClass() != o.getClass()) return false; //null인지여부 확인, ?
	Person person = (Person) o; //매개변수로 받은 o인스턴스의 형변환
	return id == person.id ;
}

 

그 다음, 주민등록번호가 같은 객체 2개를 생성한 뒤 비교를 해주면 true가 나온다

Person person1 = new Person(931215, "홍길동", 20);
Person person2 = new Person(931215,"홍동길", 20);
System.out.println(person1.equals(person2));

 

개명을 했다고 하더라고 주민등록번호가 같으면 같은 사람이라고 처리하는 것과 같다. 

 

 

- 참고

스프링 입문을 위한 자바 객체지향의 원리와 이해

자바의 정석

반응형
Comments