회고록 블로그

[공부 필기] Java 기본 공부하기 (15) 본문

2. 프로그래밍 언어 공부/Java

[공부 필기] Java 기본 공부하기 (15)

김간장 2021. 11. 10. 22:04

공부 중인 강의 : 윤성우 선생님, 윤성우의 열혈 Java 프로그래밍 강의.

링크 : https://cafe.naver.com/cstudyjava

 

윤성우의 프로그래밍 스터디그룹 [C/... : 네이버 카페

윤성우의 스터디 공간입니다. C와 JAVA를 공부하시는 분들은 모두 들어오세요. ^^

cafe.naver.com

 


1. '관계'의 관점에서 상속을 바라보기

- 논리적으로 상속 관계가 될 수 없는 두 클래스가 있다고 가정!

   extends 키워드를 사용하면 (논리적으로 말은 맞지 않아도) 문법적으로 에러가 발생하지는 않음

   → 예를 들면, '카라멜 마끼아또'가 '커피'의 부모 클래스가 되는게 논리적으로 말이 안되는 것 처럼...?

- 상속을 어떤 상황에서 어떻게 사용해야하는지에 대해서 학습함

- 참고로 객체지향언어는 "현실세계를 모델링해서 만들어진 언어"이기 때문에 현실적인 이야기를 좀 할 수 밖에 없음

 

1.1. 상속의 특성

  • 하위 클래스는 상위 클래스의 모든 특성을 지녀야함
  • 거기에 더해서 하위 클래스는 자신만의 추가적인 특성을 더하게 됨
  • 즉, 상속 관계에 있는 두 클래스는 IS-A 관계를 가져야함

- IS-A ?

   → "(자식 클래스)는 일종의 (부모 클래스)이다"라는 의미

- IS-A 관계가 성립될 때 상속 관계를 적용한다는 (암묵적인 개발자의) 룰이 있음

   → 주의할 점 : IS-A 관계를 갖는 클래스가 모두 상속으로 연결되는 것은 아님

   → 하지만 상속 관계의 클래스는 모두 IS-A 관계가 성립됨

- 만약 IS-A 관계를 갖지 않는다면, 적절한 상속인지 다시 생각해봐야함

- IS-A 관계가 성립하지 않는 상속은 제대로된 코드가 짜여질 수가 없음

 

 

2. 메소드 오버라이딩 (메소드 오버라이딩을 이해하기 위해서 필요한 사전 지식)

- 자식 클래스는 "부모 클래스의 참조변수"로도 접근을 할 수 있음

   → 부모 클래스 Parent와 자식 클래스 Child가 있다고 가정하면 아래와 같이 코드 사용 가능

Parent p = new Child();

- 그렇다면 참조변수의 객체 타입이 다른게 어떤 차이가 있을까

   → 아래의 코드를 비교해보자

/* 가정.
* 부모 클래스 : Parent
* 자식 클래스 : Child */

Parent var1 = new Child();
Child var2 = new Child();

   → 가장 큰 차이점으로..

         * 생성한 인스턴스를 Parent 인스턴스로 사용하려면, 참조변수 var1 처럼 정의

         * 생성한 인스턴스를 Child 인스턴스로 사용하려면, 참조변수 var2 처럼 정의

이런 상황

   → 즉, var1은 Child 인스턴스를 생성했지만 Parent처럼 사용하게 됨

        (Child 클래스에만 있는 멤버 변수/메소드는 호출하지는 못함)

        * 정확하게는 Child 클래스에 있는 멤버 변수/메소드를 가지고는 있지만, 호출은 하지 못함

   → Child 인스턴스를 생성했고, Child 인스턴스로 사용을 하고 싶다면 var2처럼 선언해야함

   → 두 참조변수가 가리키고 있는 참조값은 동일

 

- 정리

   → Case2에서 order2 참조변수가 자식 인스턴스의 메소드를 호출하면 에러가 발생함

 

- 반대의 경우 생각하기

- 반대로도 사용할 수 있는가

   → 즉, CaramelMacchiato order3 = new Coffee(); 로 사용할 수 있는가

        * (자식 인스턴스) 참조변수 = new (부모 객체)

   → 불가능함

        * Coffee order3 = new CaramelMacchiato(); 는 가능하지만

           CaramelMacchiato order3 = new Coffee(); 는 불가능

- 만약 이걸 가능하게 하려면 "강제 형변환"을 해야함

   → Java 문법을 이렇게 만들어놓은 이유는, Java 문법의 복잡도를 불필요하게 높이지 않기 위함임

- 그렇다면 이 경우는 어떻게 될까

   → Case1은 문제없이 작동함

         * 위에서 언급한 개념에 따라 전혀 이상할게 없음

   → Case2는 컴파일 오류가 발생함

         * order4에 order3을 대입하지 못하기 때문

 

- 이러한 오류가 발생하는 이유는 별도의 글에서 정리하기로 함

Comments