Backend/java

상속의 정의와 예제를 통한 이해

IT grow. 2018. 8. 8. 19:24
반응형
Is a 관계 ( 상속관계 )


// 사전 조건 Animal은 최상위 부모 클래스 이다
// Dog는 Animal의 자식 클래스이다.

 모든 객체의 DataType은 부모가 될 수 있다.
 Animal d1 = new Dog(); 가능하다 .
// 이말은 데이터의 접근이 d1 ( Animal 영역에서만 ) 가능
: 주소가 부모 Type일 때 이렇다. -->접근할 수 있는 영역이 제한된다
( 자식 클래스 접근 x )
 Dog d2 = new Animal() ; 불가능하다 , Animal은 Dog이다 .
 상속을 부여하면 하나의 부모 타입으로 두 개의 데이터 타입(자식한테)을 설정할 수 있다.
 부모클래스 변수 = new 자식클래스();
 메모리 자체에는 자식클래스 까지 올라오지만 가르키는 곳은 부모클래스로 제한되어 있기 때문에 자식클래스에 관해서는 접근하지 못한다.
캐스팅 할 수 있는 또 다른 방법 :
((Animal)d).kind : ((부모클래스)하위클래스).kind 일 경우 부모클래스 캐스팅 가능
package day08;
public class Dog extends Animal { // 딱 하나의 클래스만을 상속 받을수 있다. 자바는 단일 상속만을 상속 받을 수 있다.
// 인터페이스에서만 다중 상속을 받을 수 있다.

Animal a = new Animal(); // 부모클래스 Animal에 대한 인스턴스 변수를 선언해 주었다.
String kind = "강아지 종류"; // 멤버변수 , 전역변수로써 문자열 타입의 kind
String name ; // 멤버변수 , 전역변수로써 문자열의 name
void Print()
{
System.out.printf("%s %s", kind , name);
// this가 생략되어 있기 때문에 여기서는 "강아지 종류" , null 값 출력
// super.kind , super.name 은 "동물의 종류 " , null 값 출력
// super.kind가 나오는 이유는 부모 클래스에 kind가 "동물의 종류"로 정의 되어 있기 때문
}
Dog d = new Dog();
// 상속을 받은 Dog가 메모리에 올라 갈때 ,
// Animal의 클래스가 먼저 메모리에 올라가고 ( 동물의 종류 )
// 그 다음에 Dog 클래스가 메모리에 올라간다. ( 강아지의 종류 )
// 명시적으로 , Dog 클래스에는 기본 생성자가 있는데 Super가 생략되어 있기 때문에 Animal클래스를 먼저 갔다 온다 .
// super = 부모의 기본 생성자를 호출하겠다. 부모 클래스 갔다가 다시 돌아온다 .
// 결론적으로 Dog 의 인스턴스 d는 Animal의 주소값을 가르키게 된다.
// 고로 d는 Animal 주소값과 , Dog 주소값 둘다 가르키게 될 수 있다.
// 엑세스 할 때는 하단부 부터 상단으로 , 하단부 부터 올라가는데 하단부에 선언되어 있는 값이 없다면 상단부 엄마 클래스로 올라간다.
// d.name 은 null값으로 , d.kind 는 "강아지 종류" 출력된다.
// this 의 형태는 하단부 --> 상단부
// 그렇기 때문에 super라는 함수가 나오게 되었는데 super.kind = "동물의 종류"가 출력된다.
// static 영역에서는 super , this 사용못한다 .
// 상속의 deep 가능하다.
}


반응형