본문 바로가기

이해를 위한 메모 공간

11.상속

객체 지향 프로그래밍의 중요한 특징 중 하나가 상속입니다.

상속은 우리가 일반적으로 알 듯 무엇인가를 무려받는다는 의미입니다.

객체 지향 프로그램은 유지보수하기 편하고 프로그램을 수정하거나 새로운 내용을 추가하는 것이 유연한데, 그 기반이 되는 기술이 바로 상속입니다.

 

상속 실습을 위해 생성한 고객 클래스

새로운 고객 등급이 필요한 경우

VIP 고객을 추가 하게 될 경우 새로운 멤버 변수가 필요합니다.

VIP 혜택

- 제품을 구매시 항상 10% 할인 혜택

- 보너스 포인트 적립율 5%

- 담당 전문 상담원을 배정함

 

이 경우 기존의 Customer 클래스가 존재하므로 Customer 클래스에 VIP 고객에게 필요한 변수와 메소드까지 함께 포함하여 구현하면 됩니다. 그런데 이렇게 구현하게되면 Customer 클래스의 코드가 복잡해집니다.

게다가 일반 고객의 인스턴스를 생성할 때는 VIP 고객과 관련된 기능은 전혀 필요 없는데 VIP 클래스를 따로 만드는 것이 좋습니다.

extends 를 사용하여 Customer 를 상속 받는다

 

상속에서 클래스 생성과 형 변환

상속받은 생성자의 호출시 상위클래스의 생성자가 먼저 호출되고 그다음에 하위 생성자가 호출이 됩니다.

기본적으로 상위클래스의 생성자의 호출시 디폴트 생성자를 호출하기 때문에 디폴트 생성자가 없다면 오류가 나게 됩니다.

 

그래서 상위클래스를 부르는 예약어에 대해 이야기 해봅시다.

 

상위 클래스를 부르는 예약어  super

자신의 클래스를 호출하는 This 와 개념이 같다고 보면 된다.

 

상위클래스로 묵시적 클래스 형변환

 

VC는 상위클래스인 Customer 형으로 선언 되었지만 생성은 VIP 인스턴스로 생성이 된다 결과 값은 VIPCustomer 기준으로 나오게됨

메소드 오버라이딩

 

같은 메소드를 사용하지만 결과 값은 다르게 나온다

상위 클래스인 Shape 클래스의 상속을 받은 Circle, Rectangle, Hexagon 은 생성된 인스턴스 기준(오른쪽)의 메소드를 사용하기 때문에 각각 원, 사각형, 육각형을 출력하게 된다

 

가상메소드

자바의 클래스는 멤버 변수와 메소드로 이루어져 있습니다. 클래스를 생성하여 인스턴스가 만들어지면 멤버 변수는 힙 메모리에 위치합니다. 그렇다면 메소드는 어디에 위치할까요? 변수가 사용하는 메모리와 메소드가 사용하는 메모리는 다릅니다. 변수는 인스턴스가 생설될 때마다 새로 생성되지만, 메소드는 실행해야 할 명령 집합이기 때문에 인스턴스가 달라도 같은 로직을 수행합니다. 즉 같은 객체의 인스턴스를 여러 개 생성한다고 해서 메소드도 여러개 생성되지 않습니다.

 

가상 메소드의 원리

일반적으로 프로그램에서 메소드를 호출한다는 것은 그 메소드의 명령 집합이 있는 메모리 위치를 참조하여 명령을 실행하는 것입니다. 그런데 가상 메소드의 경우에는 '가상 메소드 테이블'이 만들어집니다. 가상 메소드 테이블은 각 메소드 이름과 실제 메모리 주소가 짝을 이루고 있습니다. 어떤 메소드가 호출되면 이테이블에서 주소 값을 찾아서 해당 메소드의 명령을 수행합니다.

 

 

다형성

지금까지 설명한 묵시적 클래스 형 변환과 가상 메소드를 바탕으로 객체지향의 중요한 튻겅인 다형성(polymorphism)을 학습해 봅시다. 다형성이란 하나의 코드가 여러 자료형으로 구현되어 실행되는 것을 말합니다.

쉽게 말해 같은 코드에서 여러 실행 결과가 나오는 것이죠.

 

 

moveAnimal 메소드하나로 3가지의 결과값이 출력됩니다

 

'이해를 위한 메모 공간' 카테고리의 다른 글

13.추상 클래스  (0) 2020.03.31
12.다형성 활용 및 다운 캐스팅  (0) 2020.03.31
8.클래스와 객체  (0) 2020.03.27
7.생성자  (0) 2020.03.26
6.객체지향프로그래밍  (0) 2020.03.25