본문 바로가기
JAVA 기초 정리

JAVA 객체지향과 상속성

by kjwkjw 2020. 3. 4.

객체지향 언어의 3대 속성


1. 상속성 : 클래스를 상속해서 클래스 만든다.
2. 은닉성 : 감추고 싶은건 감출 수 있다.
3. 다형성 : 하나의 심볼(이름)이 여러 실체에 매핑될 수 있다.

 

 

이번에는 상속성에 대해 정리할 것이다.

 

다음 코드가 에러가 발생하지 않은 이유는?

조상 클래스가 A라 하고 조상클래스를 상속 받은 자손 클래스를 B라 하면

클래스를 작성할 때 class B extends A라 적어야 한다.

위 코드에서 B클래스를 이용하여 t라는 인스턴스를 생성했다.

t인스턴스에는 apple이라는 멤버함수가 존재하지 않는데 왜 오류가 발생하지 않은 것일까?

 

바로 상속을 받은 자손 클래스는 조상 클래스의 멤버변수와 멤버함수를 그대로 물려받기 때문이다. 

따라서 B가 A를 상속 받은 동시에 멤버변수인 apple을 물려받아 오류가 발생하지 않고 10이 정상적으로

출력됐다. 

 

그렇다면 자손의 클래스로 생성됐을 때 조상과 자손 클래스의 생성자 호출 순서는 어떻게 될까?

 

상속관계가 존재할때 ( 조상 클래스 , 자손 클래스 ) 자손의 인스턴스를 생성하면
조상의 생성자가 먼저 호출되고 , 자손의 생성자가 호출된다.

 

생성자는 상속되지 않는다. 다만 호출될 뿐이다. 멤버함수도 아니다.
( 참조형 변수로 호출할 수 없다. )

 

override

 

조상의 클래스를 상속 받은 자손 클래스는 조상 클래스의 멤버함수와 멤버변수를 그대로 물려받는다.

하지만 자손의 클래스에서 멤버함수와 멤버변수를 재정의할 수 있을까? 

 

B에 생성자를 만들어 인스턴스를 생성할 떄 apple의 값을 재정의 할 수 있게 한다.

따라서 첫번째 출력값은 정확하게 출력됐다.

두번째 출력값이 5+2가 아닌 5-2가 출력된 이류는 자손의 클래스에서 조상에게 물려받은

멤버함수가 override(재정의)됐기 때문이다.

 

자손 클래스에서 조상 클래스의 멤버함수를 재정의 할 수 있는 조건은

재정의 할 멤버함수와 이름, 리턴타입, 매개변수가 모두 같아야 한다.

조건을 지키지 못한다면 다음과 같이 오류가 발생할 수 있다.

 

 

overload

 

overload는 override와 달리 이름만 같고 리턴타입과 매개변수가 다른 여러개의 멤버함수를 생성할수 있다는 의미다.

매개변수가 한 가지인 cal함수는 매개변수를 1번더한 값을 리턴하는 함수이므로 출력값이 정확하다.

매개변수가 두 가지인 cal함수는 두변수의 합을 리턴하는 함수이므로 출력값이 정확하다.

매개변수가 세 가지인 cal함수는 결과값을 String으로 리턴하는 함수이므로 출력값이 정확하다.

 

이와 같이 함수들을 overload할 수 있다. 

 

super

 

물려받은 자손의 메소드에서 조상의 메소드를 물려받은 자손쪽에서 물려받은 함수를 호출하고 싶을때 super 를 이용한다.

 

B로 생성된 t의 프린트 함수를 호출할 때 조상의 함수도 호출이 됐다.

 

 

클래스 B가 클래스 A를 상속받았다면

 

A t = new B(); 형태가 가능할까?

 

조상타입 변수로 자손의 인스턴스를 가리킬 수 있다.

그러나 이렇게 생성된 인스턴스는 조상의 멤버함수 또는 조상의 멤버함수를 override한 메소드만 사용할 수 있다.

또한 멤버변수는 재정의 할 수 없기 때문에 물려받은 i가 100으로 출력된 것은 옳은 것이다.

따라서 t.print2();는 옳지 않은 코드이다.

'JAVA 기초 정리' 카테고리의 다른 글

JAVA Node로 LinkedList 구현하기  (0) 2020.03.05
JAVA 객체지향과 은닉성  (0) 2020.03.04
JAVA 클래스와 사용 방법  (0) 2020.03.04
JAVA 반복문 사용하기  (0) 2020.03.04
JAVA 변수란 무엇인가  (0) 2020.03.04

댓글