본문 바로가기
[ JAVA ]/JAVA

[ Java ] 상속과 다형성

by 환이s 2022. 12. 14.
CHAPTER 11. 상속과 다형성 알아가기

 

1 ) 상속(Inheritance)이란?

 

상속은 새 클래스를 작성할 때, 기존에 존재하는 클래스에서 멤버를 물려받아 생성하는 행위이다.

 

-모든 클래스의 최상위(조상) 클래스는 Object이다.

-부모 클래스의 멤버 변수와 메서드를 상속 ( private 제외 )

 

# 구문

Class Parent {}
Class Child extends Parent{}

 

- 부모 클래스는 Parent가 되고, 자식 클래스는 Child가 된다.

-자식 클래스는 부모 클래스의 함수나 변수를 그대로 가져와서 사용할 수 있지만, 부모 클래스는 자식에서 만들어진 변수나 함수를 사용할 수 없다.

-자식 클래스가 상속을 받을 때, 부모의 생성자는 상속되지 않는다.

 

2 ) Method Overriding

 

Overriding은 자식이 부모 클래스의 함수를 사용할 때 그 함수를 다시 작성하는 작업이다. 이때, 부모의 함수와 선언부가 일치하는 함수를 작성해야 한다.

 

- 자식 클래스는 부모의 멤버 변수와 메서드를 확장한다.(Overriding)

- 부모 Method가 Protected여도 자식 Method가 public이 될 수 있음!

 

 

3 ) Protected

 

- Class는 Protected 불가!

- 자식에게 상속하기 위한 접근자

- 같은 Package에서는 자식 Class가 아니라도 접근 가능!

- 부모 Method가 막히면(접근 금지면) 자식 Method가 public이라도 부모 Class Type이면 막힘!

 

4 ) Class Casting on Inheritance

 

- 자식은 부모의 Type으로 선언이 가능하다. [다형성] 

( 단, 부모는 자식의 Type 선언 안됨! )

- 자식이 부모의 Type으로 선언되어도, 본인의 메서드가 우선이다.

- 부모의 Type으로 선언될 경우 자식에게만 있는 메서드는 호출 불가이다.

 

# 구문

Parent p = new Parent();

Child c1 = new Child();
Parent c2 = new Child();

c1.childMethod(); // OK!
c2.childMethod(); // Error!!

 

5 ) this() vs super()

 

- 자신의 생성자를 호출하는 두 개의 함수이다.

- this() : 나에게 정의된 생성자 호출

- super() : 부모 클래스에 정의 된 생성자 호출

- 자식은 부모의 생성자를 부를 수 있지만, 부모는 자식의 생성자 호출 불가!

- 언제나 생성자 앞부분에서 사용!

# 구문

this();

super();

 

예시를 보면 자식 클래스 Son이 Mom클래스를 extends해서 super() 문으로 생성자 호출을 하였다. 그럼 결과를 main으로 확인해보자.

 

main에 호출 출력 값을 작성했고, 결과는 아래와 같다.

 

 

5 ) Virtual Method

 

- Java Method == Virtual Method

- Method의 정의(명세)는 Method Area이다.

- 각각의 instance는 동일한 Method 실행?! ( 같은 method지만,  this를 달고 수행한다.)

 

5-1 ) Virtual Method Table

 

- 각 instance의 method의 주소를 정의한 테이블이라고 한다.

 

6 ) 다형성(polymorphism)이란?

 

하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미한다. 자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타임의 인스턴스를 참조할 수 있도록 하여 구현하고 있다.

다형성은 상속, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나다.

 

- 다형성의 구현 방법 : 상속(extends)과 Interface를 활용한다.

 

7 )  상속과 다형성

 

상속과 다형성을 활용해서 구현해보자.

 

Ex)

Man 클래스를 상속한 우리나라 사람(Korean)과 미국 사람(American)을

정의하고, 각각의 인사말(sayHello) 함수를 정의하시오.

 

 

Korean , American => extends Man(호출하기)

 

 

대체적으로 코딩은 수정해야 할 부분이 있다면 간단하게 찾을 수 있게 함수로 빼주는 습관을 들이는 게 좋다.

결과는 아래 사진과 같다.

 

 

8 ) instanceof 연산자

 

이러한 다형성으로 인해 런타임에 참조 변수가 실제로 참조하고 있는 인스턴스의 타입을 확인할 필요성이 생긴다.

자바에서는 instanceof 연산자를 제공하여, 참조 변수가 참조하고 있는 인스턴스의 실제 타입을 확인할 수 있도록 해준다.

 

Ex) 

위 예시와 동일하게 Man Calss를 활용하여 instanceof를 활용해보자.

 

 

각 클래스를 생성하고 main으로 가서 구현해보자.

 

 

왼쪽에 전달된 참조 변수가 실제로 참조하고 있는 인스턴스의 타입이 오른쪽에 전달된 클래스 타입이면 true를 반환하고, 아니면 false를 반환한다. 그렇다면 예제에서 true가 나오면 korean은 "밥을 먹습니다."가 출력되고, American은 "빵을 먹습니다"가 출력되는데 ,

만약 false이면 "해당 인스턴스가 없습니다!"가 출력된다.

 


마치며

 

이번 포스팅은 상속과 다형성에 대해서 작성했습니다. 앞으로 나올 추상 클래스 , 인터페이스 등 extends의 활용이 많아지는데 꼭 알아가고 넘어가야 하는 부분이므로 확실하게 짚고 넘어가야 하는 부분이에요... 다음 포스팅에 뵙겠습니다..!

728x90

'[ JAVA ] > JAVA' 카테고리의 다른 글

[ Java ] Interface 1  (0) 2022.12.19
[ Java ] 추상 클래스  (0) 2022.12.15
[ Java ] 배열 ( ArrayList )  (0) 2022.12.13
[ Java ] 배열  (0) 2022.12.04
[ Java ] 클래스와 객체2  (0) 2022.11.30