상속과 생성자, 다중 상속, Specialization / Generalization , 추상 클래스, 추상화 문법, 추상 메서드
상속과 생성자
수퍼 클래스의 어떤 생성자를 호출할지 지정하지 않으면 컴파일러는 수퍼 클래스의 기본 생성자를 호출하라는 명령을 붙인다.
super();
이 경우 만일 수퍼클래스에 기본 생성자가 존재하지 않더라면 서브 클래스의 기본 생성자에 오류가 발생한다.
수퍼클래스의 어느 생성자를 호출해야하는지 명시해야한다.
super(파라미터변수);
다중상속
자바는 다중 상속을 허용하지 않는다.
같은 변수에 다른 데이터 타입의 인스턴스 변수를 생성할 가능성이 있다. 이런 모호함으로 인해 자바는 다중 상속을 허용하지 않는다.
Specialization / Generalization
Specialization(전문화) = 수퍼 클래스를 상속받아 서브클래스를 만드는 것
Generalization (일반화) = 서브클래스들의 공통 코드를 추출하여 수퍼클래스를 만드는 것
수퍼클래스를 상속받아 좀 더 특별한 역할을 하는 서브 클래스를 만드는 것!
==> Specialization
Car 클래스 -> Sedan dosunroof(); , run();
-> Truck dump(); , run();
run(); = 역할에 맞게 기존 기능을 재정의(overriding)
리팩토링 과정에 수행하는 방법으로 서브클래스들의 공통 분모를 추출하여 수퍼클래스를 정의하는 방법을 말한다.
==> Generalization
Sedan (extends Car) -> dosunroof(); , run();(overriding)
Truck (extends Car) -> dump(); , run();(overriding)
ㅣ
Car -> start(); , shutdown(); , run();
추상클래스, 추상화 문법
이 Car 클래스는 Sedan 과 Truck의 공통 코드를 좀 더 쉽게 관리하기 위해 만든 것이다.
즉, 직접 사용하기 위해 만든 클래스가 아니다.
이런 클래스는 직접 사용할 수 없도록 제약을 가하는 것이 유지보수에 좋다
이러한 제약을 가하는 것을 '추상클래스' 문법이라 한다.
보통 '일반화(generalization)' 과정에서 생성되는 클래스를 추상 클래스로 만든다.
문법 abstract class 클래스명 {...}
이런 추상 클래스는 new 명령을 통해 인스턴스를 만들 수 없다.
추상 메서드
위의 예시에서 run(); 과 같이 서브 클래스에 따라 동작이 다르다면 즉, 서브클래스에서 '반드시' overriding 되는 메서드라면 굳이 수퍼클래스에서 구체적으로 정의할 필요 없다.
단지 이런 메서드가 있어야한다는 표시만 하면 된다. 이를 위한 문법이 바로 '추상 메서드' 문법이다.
이런 추상 메서드는 메서드 바디 {} 가 없다.
서브클래스의 역할에 따라 재정의하는 메서드
서브 클래스에서 overriding 할 것이라면 굳이 수퍼클래스에서 구현할 필요 없다. 혹은 서브클래스에서 구현하도록 강제하고 싶다면 추상메서드로 만든다. 추상 메서드를 상속 받는 서브클래스는 반드시 구현해야 한다. 만약 구현하지 않으면 추상 메서드인채로 남아 있기 떄문에 서브클래스도 추상클래스가 되어야 한다.
일반 클래스는 인스턴스를 생성하여 메서드를 호출하기 때문에 구현되지 않은 메서드를 갖는 것은 오류이다.
그래서 일반 클래스는 추상 메서드를 가질 수 없다.
=> 추상 메서드가 있다는 것은 해당 메서드를 실행할 수 없다는 것이고 실행할 수 없는 메서드를 갖는 클래스는 인스턴스를 생성해서는 안되기 때문에 추상메서드를 갖는 클래스는 반드시 추상클래스여야 한다.