개발일기/Java

헷갈리는 메모리 영역 정리 : 힙영역 + 클래스 캐스팅

민장미 2023. 4. 24. 23:31

클래스 상속 파트에 들어가면서 머릿속이 어지러워짐 분명 머리론 이해가 가면서도 엉켜서 정리가 안된 느낌?

 

종이에 손으로 그려가며 정리해봤다. 

종이에 그린 상속 관계도.

class A

class B extends A

class D extends B

class C extends A

class E extends C

 

A a1 = new B();  => A객체가 먼저 생성 후, B객체 생성.  A클래스만 참조가능

 

A a2 = new D(); => A객체가 먼저생성, B객체 생성, D객체 생성, A클래스만 참조가능

 

C c1 = new E(); => A객체가 먼저 생성, C객체 생성, E객체 생성,  A,C클래스까지 참조가능

 

D d1= new D(); => A객체가 먼저 생성, B객체 생성, D객체 생성, A,B,D 클래스 참조가능

 

** 다만 오버라이딩과 혼동하지 말 것 !!(내가 헷갈려했던 부분)

오버라이딩은 서브클래스에서 슈퍼클래스로부터 상속받은 메소드의 몸체 부분을 재정의 한 것이다.

저 위의 구역과 상관 없이, 상속 관계에 있는 클래스들에 똑같은 메소드가 있을 때, 

서브클래스의 메소드가 우선순위로 호출된다. 

 

 

 

다른 헷갈렸던 부분 : 클래스 캐스팅

*참조변수 instanceof 타입* => 참조변수가 '타입'으로 캐스팅이 가능한지 확인 가능한 함수 (중요)

 

A a2 = new D();

A instanceof D  가능? (다운캐스팅)(업캐스팅은 늘 가능하다)

1.  왼쪽의 객체 자료형 체크: A형 

2. 오른쪽의 객체 상속관계 체크 :

D는 B를 상속, B는 A를 상속 => A객체가 먼저 생성, B객체 생성, D객체 생성

D객체가 생성되어 있으므로, A와 D 객체에 공통점이 남아있다면 캐스팅 가능. 

 

책 예제 코드를 쳐보니 정리가 더 잘 되었다. 

package book;

class A{}

class B extends A{}


public class Page_327 {
/* 캐스팅의 가능여부를 확인할 수 있는 instanceof */
public static void main(String[] args) {
	//instanceof
	A aa = new A();
	A ab = new B();
	
	System.out.println(aa instanceof A);
	System.out.println(ab instanceof A);
	
	System.out.println(aa instanceof B); //주의 A객체만 만들어짐 
	System.out.println(ab instanceof B);
	
	if(aa instanceof B) {
		B b = (B) aa;
		System.out.println("aa를 B로 캐스팅 했습니다.");
	}else {
		System.out.println("aa를 B로 캐스팅 불가");
	}
	if(ab instanceof B) {
		System.out.println("ab를 B로 캐스팅");
	}else {
		System.out.println("ab를 B로 캐스팅 불가");
	}
	if("안녕" instanceof String) {
		System.out.println("안녕 은 String 클래스입니다.");
	}
}	
}