기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것
class 자식클래스 extends 부모클래스{ ... }
🔸 조상클래스 = 부모클래스, 상위클래스, 기반클래스
🔸 자손클래스 = 자식클래스, 하위클래스, 파생된 클래스
- 코드의 재사용성을 높인다.
- 코드의 중복을 제거한다.
- 조상클래스만 변경해도 모든 자손클래스, 자손의 자손클래스에 영향을 미친다.
- 자손클래스들의 공통 부분들은 조상클래스에서 관리, 자손 클래스들은 나머지 자신들에게 정의된 멤버만
관리하면 된다.➡️ 이를 통해 생산성과 유지보수를 한결 쉽게 하는데 도움을 준다.
// 부모클래스(멤버 5개) class Tv{ boolean power; // on/off int channel; void power(){ power != power; } void channelUp(){ ++channel; } void channelDown(){ --channel; } } // Tv클래스를 상속한 자식클래스(총 멤버 7개 : 부모 5개 + 자식 2개) class CaptionTv extends Tv{ boolean caption; void displayCaption(String text){ if(caption){ System.out.println(text); } } } class CaptionTvTest{ public static void main(String args[]){ CaptionTv ctv = new CaptionTv(); ctv.channel = 10; ctv.channelUp(); System.out.println(ctv.channel); // 11 ctv.caption = true; ctv.displayCaption("Hello World!"); // Hello World! 출력 } }
🔸 자손 클래스의 인스턴스를 생성하면 상속받은 조상클래스의 멤버도 같이 생성되기 때문에 따로 조상클래스의 인스턴스를 생성할 필요없이 사용할 수 있다.
🔸 포함관계 : 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것
➡️ 하나의 큰 크기의 클래스를 작성하는 것 보다 단위별로 쪼개서 여러개의 클래스를 작성 후 포함관계로 사용하면 간결하게 작성할 수 있고, 재사용성도 높아진다.class Car{ Engine e = new Engine(); Door[] d = new Door[4]; .... }
🔸 포함관계, 상속관계의 결정
- 스포츠카는 차이다. ➡️ 상속관계(꼭 필요한 경우에만 사용)
- Deck은 Card를 가지고 있다. ➡️ 포함관계class Card{ static final int KIND_MAX = 4; static final int NUM_MAX = 13; static final int SPADE = 4; static final int DIAMOND = 3; static final int HEART = 2; static final int CLOVER = 1; int kind; int number; Card(){ this(SPADE, 1); } ... } // 포함관계일 때 class Deck{ final int CARD_NUM = 52; Card cardArr[] = new Card[CARD_NUM]; // Deck 클래스는 Card객체 배열을 포함한다. Deck(){ int i = 0; for(int k = Card.KIND_MAX; k > 0; k--){ for(int n = 0; n < Card.NUM_MAX; n++) cardArr[i++] = new Card(k, n+1); } } Card pick(int index){ return cardArr[index]; } ... }
자바에서는 단일 상속만을 허용한다.
➡️ 다중 상속의 단점 : 클래스간 관계가 매우 복잡해지고 상속받은 멤버간의 이름이 같은 경우, 구별할 수 없다.
Object클래스 : 모든 클래스의 최상위에 있는 조상클래스
class Card{ // 컴파일러가 'extends Object' 자동으로 추가해서 Object를 상속받도록하여 컴파일한다. ... }