Language/Java

[Java] 상속(Inheritance)

1. 상속

상속 정의

- 기존 클래스의 자산을 자식 클래스에서 재사용하기 위해 사용합니다.

- 부모의 생성자와 초기화 블록은 상속되지 않습니다. 

- 부모 클래스 = 조상 클래스 = 슈퍼 클래스 = 상위 클래스

- 자식 클래스 = 자손 클래스 = 서브 클래스 = 하위 클래스

- 상속 관계는 'is a'로 표현할 수 있습니다.(ex - SpiderMan(자식) is a Person(부모))

 

상속의 장점

- 기존 클래스의 멤버를 물려받기 때문에 코드의 중복을 줄입니다.

- 부모 코드만 바꾸면 자식 코드도 함께 바뀌므로 유지 보수성이 향상됩니다.

 

상속의 예

//Person.java(부모 클래스)
public class Person {
    String name;
    
    void eat(){}
    void jump(){}
}

// SpiderMan.java(자식 클래스)
public class SpiderMan extends Person {
    boolean isSpider;
    void fireWeb(){}
}

- Person의 멤버 : name, eat(), jump()

- SpiderMan의 멤버 : name, eat(), jump(), isSpider, fireWeb()

 

Object 클래스

- 모든 클래스의 부모 클래스

- 'extends'를 따로 사용하지 않은 클래스는 'extends Object'가 생략되어있는 것입니다.

- 모든 클래스가 Object 클래스를 상속받기 때문에 Object 클래스에 정의된 메서드를 사용할 수 있습니다.

 

단일 상속(Single Inheritance)

- 자바의 경우 단일 상속만 지원(여러 개를 상속받고 싶을 때는 interface 또는 포함관계를 사용)

- 다중 상속의 경우 관계가 복잡해질 수 있기 때문에 사용하지 않습니다.

 

포함 관계(has a)

- 여러 개의 클래스에서 특성을 가져오고 싶을 때 사용

- 하나는 상속을 받고, 나머지는 멤버 변수로 받아 사용

- 어떤 클래스를 상속받고, 또는 멤버 변수로 받을지는 프로젝트의 관점에 따라 다릅니다. 'is a', 'has a' 관계를 두고 프로젝트와 가장 잘 어울리는 선택을 해야 합니다.

public class SpiderMan extends Person {	// 상속 - is a
    Spider spider;		// 멤버 변수(포함 관계) - has a
    boolean isSpider;
    
    void fireWeb() {
    	if (isSpider) {
        	spider.fireWeb();
        }else {
        	System.out.println("Person은 거미줄 발사 불가");
        }
    }
}

 

super

- this가 자신의 주소를 가리키듯, super는 부모의 주소를 가리킵니다.

- 'super. 부모 메서드'를 통해 부모의 코드를 재사용할 수 있습니다.

- super()를 이용해서 부모 클래스의 생성자를 호출할 수 있습니다.(단, 자식 클래스 생성자의 맨 첫 줄에서만 호출 가능)

// super를 사용하지 않았을 때 - 코드 중복 O
void jump() {
    if (isSpider) {
        spider.jump();
    } else {
        System.out.println("뛰기");
    }
}

// super를 사용했을 때 - 코드 중복 X
void jump() {
    if (isSpider) {
        spider.jump();
    } else {
        super.jump();
    }
}

'Language > Java' 카테고리의 다른 글

[Java] 패키지(Package)와 import  (0) 2022.01.21
[Java] 메서드 오버라이딩(Overriding)  (0) 2022.01.21
[Java] 메서드(Method)  (0) 2022.01.20
[Java] 멤버 변수와 지역 변수  (0) 2022.01.20
[Java] 객체지향 프로그래밍  (0) 2022.01.19