💻 Java Inheritance(상속) / Composite(포함)
🎯 목표 : 클래스의 상속과 포함관계를 이해
📒 Inheritance 상속
❗특징
- 상속받은 자식클래스는 부모클래스의 모든 멤버를 상속 받는다. 단, 생성자, 초기화 블럭은 제외한다.
- 자식클래스는 부모클래스의 멤버 갯수보다 같거나 많다.
- 상속은 단일 상속만 허용한다. (여러 부모클래스는 허용안됨)
- extends 키워드를 사용하여 자식 클래스를 생성할수 있다.
- 상속 받은 클래스가 없는 모든 클래스는 Object 클래스를 상속 받는다.
👉 클래스의 상속 예제
- 상속은 extends 키워드를 사용한다.
- 부모클래스와 자식클래스의 메소드명이 같을수 있다(Overriding), 하지만 여기서 자식 클래스의 오버라이딩된 메소드는 부모클래스의 메소드 기능을 포함하거나 확장되어야 한다.
- Cycle 클래스의 type 메소드를 보면, super.를 이용하여 부모 클래스의 참조변수 역할을 한다.
- 자식 클래스 type 메소드의 기능은 같은 이름의 부모클래스 메소드 기능을 포함하고 있다.
- 오버라이딩 된 자식 메소드의 선언부는 부모메소드와 같아야한다.
- 생성자는 상속되지 않기 때문에 자식클래스의 생성자를 생성해줘야되며, 자식클래스의 생성자는 부모클래스의 생성자를 포함하여야된다.
- 자식클래스의 생성자도 부모클래스의 생성자를 포함하여 오버로딩(Overloading) 할수 있다.
class CycleProto { //Parents Class
int tire;
String body;
String handle;
CycleProto (int tire, String body, String handle) {
this.tire = tire;
this.body = body;
this.handle = handle;
}
void type () {
System.out.println(tire+"개의 타이어");
System.out.println(body +"타입의 바디");
System.out.println(handle+"타입의 핸들");
}
}
class Cycle extends CycleProto { // Child Class
String brake;
Cycle(int tire, String body, String handle) {
super(tire, body, handle); // 상속받은 클래스는 부모클래스의 생성자를 포함하여야한다.
}
Cycle(int tire, String body, String handle, String brake) {
// 상속받은 클래스도 생성자를 오버로딩 할수있다
super(tire, body, handle);
this.brake = brake;
}
void upgradebrake (String brake) {
this.brake = brake;
}
void type() {
// 상속 클래스의 오버라이드는 부모의 메소드 기능을 포함하고 확장되어야한다
super.type();
if (this.brake != null) {
System.out.println(brake+"타입의 브레이크");
}
}
}
📒 Composite 포함
❗특징
- 클래스 내의 객체 참조변수를 선언하여 다른 클래스를 멤버로 만든다.
- 작은단위의 클래스를 만들어 조합하여 클래스를 만든다. = 복잡도가 개선됨.
- 객체를 생성할때 참조변수 선언만 해서는 안되고 초기화를 반듯이 해야된다.
- 참조변수 선언시 초기화가 생략된다면 생성자를 만들어 초기화 해준다.
👉 클래스의 포함 예제
- Motorcycle 클래스에서 Cycle 클래스를 포함하기위해 참조변수 cy를 선언하여 Cycle 클래스를 초기화 한다.
- Motorcycle 클래스 내에서 Cycle 클래스에 정의된 type메소드를 참조변수를 호출하여 사용할수 있으며, 같은 이름의 메소드도 Motorcycle 클래스의 소속으로 정의 가능하다.
- Motorcycle 클래스에서 Cycle클래스의 객체를 생성할때 일반적인 객체 생성과 같이 초기화를 해준다.
class Motorcycle {
String engine;
Cycle cy = new Cycle();// 클래스 포함으로 참조변수 생성
Motorcycle(int tire, String body, String handle, String brake, String engine) {
cy.tire = tire;
cy.body = body;
cy.handle = handle;
cy.brake = brake;
this.engine = engine;
}
void type() {
cy.type();
if (this.engine != null) {
System.out.println(engine + "타입의 엔진");
}
}
}
class Cycle extends CycleProto { // Child Class
String brake;
Cycle() {
super();
}
Cycle(int tire, String body, String handle) {
super(tire, body, handle); // 상속받은 클래스는 부모클래스의 생성자를 따라야된다
}
Cycle(int tire, String body, String handle, String brake) {
// 상속받은 클래스도 생성자를 오버로딩 할수있다
super(tire, body, handle);
this.brake = brake;
}
void upgradebrake (String brake) {
this.brake = brake;
}
void type() {
// 상속 클래스의 오버라이드는 부모의 메소드 기능을 포함하고 확장되어야한다
super.type();
if (this.brake != null) {
System.out.println(brake+"타입의 브레이크");
}
}
}