상속의 매우 치명적인 오해
코드의 재활용을 위한 문법입니다 . (X)
연관된 일련의 클래스들에 대해 공통적인 규약을 정의할 수 있습니다.(O)
-> 서로 다른 클래스를 상속으로 묶으면 일련의 규약을 공통적으로 적용시킬 수 있다.
Code Level에서의 상속의 예
class Man{
String name;
public void tellyourname() {
System.out.println("My name is " + name);
}
}
class BusinessMan extends Man { //extends <- 상속을 의미
String company;
String position;
public void tellyourInfo() {
System.out.println("My company is " + company);
System.out.println("My position is " + position);
tellyourname(); //상속하는 클래스의 함수 사용
}
}
상속과 생성자
그러면 어떻게 해결해야 할까 ?
상속과 생성자 호출 관계 파악하기
사진에서 보면 SubCLS(하위 클래스)의 인스턴스를 생성하는데 상위 클래스의 생성자가 호출되고, 하위클래스의 생성자가 호출 되었다.
-> 하위 클래스에서는 인스턴스 생성시 상위 클래스의 생성자를 "무조건" 호출해야 한다, 그리고 위처럼 따로 명시가 안되어있을경우 인자를 받지않는 상위클래스의 생성자가 호출된다.
상위 클래스가 먼저 생성 된 후 -> 하위 클래스가 생성되는 과정을 인지해야한다.
super();
상위 클래스의 생성자를 부를때 사용하는 문법이다.
오버로딩 되어있는 생성자를 상황에 따라 부를 수 있다.
따로 명시가 되어있지 않다면 인자를 받지않는 상위클래스의 생성자를 호출한다.
최종본
기존의 코드를 최종적으로 위와 같이 변경할 수 있다.
가장 default한 class의 정의임과 동시에 근본이 되는, 중요한 form이다.
상속을 위한 두 클래스의 관계
Java에서는 문법으로 클래스와의 연관관계를 떠나서 상속 할 수 있다.
예로, 노트북 클래스가 지우개 클래스를 상속할 수 있다. 이 뜻은 노트북은 지우개 클래스의 기능을 가진다는 뜻이며, 노트북으로 무언가를 지울 수 있다는 뜻이다.
Java는 현실세계를 기반으로 만들어진 언어라고도 한다, 그렇기 때문에 문법허용적이 아닌 현실세계를 기반으로 사실관계를 기반으로 코딩하는것이 자연스럽다.
위의 예시로 보면 스마트폰은 모바일폰을 상속한다.
문법적으로 생각해보면 스마트폰 클래스는 모바일폰 클래스의 변수와 메서드를 가지고 있는것이다. -> 하위 클래스는 상위 클래스의 모든 특성을 지닌다는 뜻이다.
스마트폰은 모바일폰의 일종이다. 이런 관계를 IS-A관계라고 부르며, 상속관계는 IS-A 관계를 가져야만 한다.
(ex> 스마트폰은 모바일폰이다, 사과는 과일이다 ...)
만약 IS-A 관계가 아닌 상속관계가 있다면 잘못된 상속관계이다.
static 과 상속
static 변수 , static 메소드 ( = 클래스 변수, 클래스 메소드) 는 상속이 되지 않는다.
프로그램 전역에 걸쳐 단 하나만 존재할 뿐더러, 다른 데이터 공간에 존재하기 때문이다.
단, 앞서 static의 기본개념을 다뤘을때 얘기하였듯이, static이 선언된 클래스 내에서는 직접접근이 가능하다, 상속이 되었을때 이 권한은 상속이 된다.
SuperCLS 클래스에서 따로 클래스명.count처럼 접근하지 않고 바로 count 를 사용할 수 있는 이유가 바로 그것이다.
출처 : 윤성우의 열혈Java 프로그래밍