회고록 블로그
[공부 필기] Java 기본 공부하기 (15) 본문
공부 중인 강의 : 윤성우 선생님, 윤성우의 열혈 Java 프로그래밍 강의.
링크 : https://cafe.naver.com/cstudyjava
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을 대입하지 못하기 때문
- 이러한 오류가 발생하는 이유는 별도의 글에서 정리하기로 함
'2. 프로그래밍 언어 공부 > Java' 카테고리의 다른 글
[공부 필기] Java 기본 공부하기 (17) (0) | 2021.11.16 |
---|---|
[공부 필기] Java 기본 공부하기 (16) (0) | 2021.11.16 |
[공부 필기] Java 기본 공부하기 (14) (0) | 2021.11.09 |
[공부 필기] Java 기본 공부하기 (13) (0) | 2021.11.08 |
[공부 필기] Java 기본 공부하기 (12) (0) | 2021.11.03 |