Darren's Devlog

[자바의정석] 객체지향 다형성, 참조변수 이해하기 본문

Java/개념정리

[자바의정석] 객체지향 다형성, 참조변수 이해하기

Darren Gwon 2022. 9. 18. 20:04
반응형

네이버 블로그에서 티스토리로 이전하는 중입니다.

https://blog.naver.com/darren_gwon/222641453763

 

 

안녕하세요.

2021년 7월 27일에 공부하면서 정리했던 다형성 내용을 블로그에 옮겨봅니다.

 

그때 당시에 자바의정석 챕터9의 equals()의 오버라이딩 강의를 듣던 중

다형성 설명이 한번에 이해가 안돼서 시간을 내서 남궁성 선생님께서 말씀해주신대로

코드의 진행 과정을 그림으로 그려봤었습니다.

 

객체지향 개념을 공부하시는 다른 분들에게도 도움이 될까 싶어 블로그에도 공유를 합니다.


class Person {
	long id;

	public boolean equals(Object obj) {
		if(obj instanceof Person)
			return id==((Person)obj).id;
		else
			return false;
	}
    
	Person(long id) {
		this.id = id;
	}
}        

class Ex9_2 {
	public static void main(String[] args) {
		Person p1 = new Person(8011081111222L);
		Person p2 = new Person(8011081111222L);

		if (p1.equals(p2)){
			System.out.println("p1과 p2는 같은 사람입니다.");
		else
			System.out.println("p1과 p2는 다른 사람입니다.");
	}
}

출처: 자바의정석 3판 p.452 예제 9-2


 

 
Person p1 = new Person(8011081111222L);
Person p2 = new Person(8011081111222L);
1. 인스턴스 생성
 
위 사진과 같이, 같은 ID넘버를 가진 p1과 p2 인스턴스가 생성됩니다.​
 

if (p1.equals(p2)){
	System.out.println("p1과 p2는 같은 사람입니다.");
else
	System.out.println("p1과 p2는 다른 사람입니다.");
}
2. equals()메서드 호출

p1.equals()의 매개변수로 p2 인스턴스의 주소가 대입이 됩니다.

매개변수의 타입이 Object인데 Person객체가 대입이 가능한 이유는

Object클래스는 모든 클래스의 최고 조상이기 때문입니다.

 

조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조할 수 있도록 한 것이 다형성입니다.

 

사진과 같이 obj와 p2는 같은 객체를 가르키게 됩니다.


3. 형변환이 무엇을 의미하고, 필요한 이유

Object obj와 Person p2는 같은 객체(0x200)를 가르키고 있지만

인스턴스변수 id는 사용할 수가 없습니다.

인스턴스 변수id는 Object클래스에 정의된 멤버가 아니기 때문입니다.

 

그렇기 때문에 obj를 먼저 Person객체로 형변환을 한 후에 id를 참조할 수 있습니다.

((Person) obj) 코드에 의해 Object obj -> Person obj로 변환이 된 것입니다.


4. equals() 오버라이딩 후 결과
 
Person클래스에서 equals() 메서드를 적절히 오버라이딩 하였기 때문에
의도한 결과(true) 가 나오게됩니다.

다형성 관련 궁금하신거 있으시면 댓글 남겨주세요~

 

반응형
Comments