본문 바로가기

IT Study/Java

상속에 대해서.. (중요)

이번에 다룰 이야기는 자바의 핵심인 상속에 대해 이야기 하려고 한다.

상속이란

 

하나의 클래스에서 다른 하나의 클래스의 모든 것들을 이어 받는 것이라고 할 수 있다.

예를 들어

부모클래스와 자식클래스가 있고 자식클래스는 부모클래스를 상속 받는다라고 할 수 있다.

자식클래스는 부모클래스의 멤버변수,멤버 메소드 모든 것을 상속 받는다.

단, private로 선언된 것들은 자식클래스에서도 접근 할 수가 없다.

protected는 자식클래스안에서 접근이 가능하다.(main에선 접근 불가능)

 

상속의 명령어는 extends로

public class AClass extends BClass{

}

위와 같은 형태로 AClass는 BClass를 상속 받게 할 수 있다.

 

A는 B클래스에서 상속받은 메소드를 오버라이드해 줄 수 있다.

오버라이드란, 상속받은 메소드의 정의를 새롭게 해주는 것이라고 보면 된다.

말 그대로 상속받은 메소드를 새롭게 만들어 주는것이다.

위의 내용이 자바의 3대 속성중 하나인 다형성의 개념이다.

 

여기까지는 기존에 알고 있던 이야기 들이었으며 추가적으로 개념이 정리된 것이.

부모클래스의 인스턴스에 자식클래스의 인스턴스를 할당하게 되면

상속되어진 것들 중 자식클래스에서 오버라이드 된 부분이 덮어 씌어진다.

예를 들어서

 

ParentClass

 

ChildClass

 

mainClass

 

 

ChildClass에서 ParentClass를 상속받고

mainClass에서

ParentClass 인스턴스에 ChildClass 인스턴스를 할당해 준 예제이다.

( 부모 인스턴스에 자식인스턴스를 할당 )

여기서 ChiledClass에선 pMethod라는 메소드를 오버라이드 해주었다.

mainClass의 20번째 라인에서 pMethod를 호출하면

ChlidClass에서 오버라이드된 부분이 호출되어진다.

추가적으로 18번재 라인에서의 func는 불러올 수가 없다.

 

위의 이유로는 자식인스턴스엔 부모 인스턴스에 대한 모든게 포함 되어 있기 때문에

부모 인스턴스에 자식 인스턴스를 할당 받는 것이 가능하게 된다.

하지만

자식의 인스턴스의 메소드는 부모 인스턴스에 없기때문에

자식의 메소드는 받을 수가 없다.

하지만 오버라이드 된 메소드는 기존의 메소드에 덮어 씌어진다.

 부모의 인스턴스의 메소드를 사용하지 않고 자식의 인스턴스의 오버라이드된 메소드를 사용한다.

<이해를 돕기 위한 예제>

Parent


Child


main



위의 예제의 출력값은 200이 나온다.

결과로 알 수 있는 것은 

over ride되지 않은 메소드를 쓰면 부모 인스턴스의 구성요소를 사용 한다는 것.

위에 예제를 보면 Child클래스의 생성자는 값을 1000을 넣고

Parent클래스의 생성자는 200을 넣는다.

그리고 Child 인스턴스를 만들고 할당받아서.

상속받은 getMethod를 호출하면 200을 출력한 다는 것을 알 수 있다.

여기서 상속을 받더라도 Parent의 영역과 Child의 영역이 나뉘어 있다는 것을 알 수 있다.

따라서 getMethod를 over ride하지 않은 상태에서 호출하면 

Parent 영역에 있는 x을 리턴해주어 200을 출력하게 된다.

번외로

Child에 오버라이드를 해주면 1000을 출력해주는 걸 확인 할 수 있다.  



반대로 자식 인스턴스에 부모 인스턴스를 할당 받는 것은 되지 않는다.

예를들어

자식에는 func에 대한 것이 있는데 부모인스턴스를 받게 되버리면 func에 대한 것은 할당 받을 수가 없다.

 

애기들 블럭 끼워맞추기로 비유하면

A홈에 A+B 블록을 사용하면

모든 A홈은 채울 수 있지만

B홈에 A블록을 사용하면 몇개는 맞을수 있겠지만 완전히 채우지는 못한다.

집에 블럭이 있으면 사진이라도 찍어서 올릴텐데 아쉽넹..

 

'IT Study > Java' 카테고리의 다른 글

야구선수(투수와타자) 관리 프로그램(상속의 개념 응용)  (0) 2018.05.31
추상 클래스(abstract) 와 interface  (0) 2018.05.31
버블정렬(Class)  (0) 2018.05.28
생성자(Constructor)  (0) 2018.05.28
static  (0) 2018.05.28