본문 바로가기

JAVA

자바 기초(상속)

1. 상속(Inheritance)이란?

- 상속(inheritance)이란 기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 의미한다. 이러한 상속은 캡슐화, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나다.

 

- 상속을 이용하면 기존에 정의되어 있는 클래스의 모든 필드와 메소드를 물려받아, 새로운 클래스를 생성할 수 있다.

이때 기존에 정의되어 있던 클래스를 부모 클래스(parent class) 또는 상위 클래스(super class), 기초 클래스(base class)라고도 한다.

- 그리고 상속을 통해 새롭게 작성되는 클래스를 자식 클래스(child class) 또는 하위 클래스(sub class), 파생 클래스(derived class)라고도 한다.

 

 

2. 상속 구현 방법

class 자식클래스 extends 부모클래스{
}

 

ex)

public class Computer {
    int price;
    public void setPrice(int price){
        this.price = price;
    }
    public int getPrice() {
        return price;
    }
}
public class Mac extends Computer{
    boolean touchPad;
    boolean hasTouchPad(){
        return touchPad;
    }
}

위의 코드는 Computer 클래스와 이를 상속하는 Mac 클래스 코드다.

 

해당 코드를 다음과 같이 사용할 수 있다.

public class Main {
    public static void main(String[] args){
        
        Mac myComputer = new Mac();
        myComputer.price = 2_000_000;       //Computer에서 물려받은 필드
        int price = myComputer.getPrice();  //Computer에서 물려받은 메스도
        
        myComputer.touchPad = true;                     //Mac에 추가한 필드
        boolean touchPad = myComputer.hasTouchPad();    //Mac에 추가한 메소드
    }
}

 

3. 상속의 제한(자바)

  상속을 해도 부모 클래스의 모든 필드와 메소드들을 물려받는 것은 아니다. 다음과 같은 경우 상속이 제한된다.

 

   1) 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드

   2) 부모 클래스와 자식 클래스가 다른 패키지에 존재하며, default 접근 제한을 갖는 필드와 메소드

 

 

4. Super 키워드, 부모 생성자 호출

자바에서 자식 객체를 생성하면, 부모 객체가 먼저 생성된 후 자식 객체가 생성된다.

 

Mac myCumputer = new Mac();

모든 객체는 클래스의 생성자를 호출해야만 생성된다. 부모 객체도 예외는 아니다. 그렇다면 부모 생성자는 어디서 호출된 것일까?

부모 생성자는 자식 생성자의 맨 첫 줄에서 호출된다. 

 

부모 생성자가 명시적으로 호출되지 않으면 컴파일러는 자식 생성자의 첫 줄에 super()라는 메소드를 추가한다.

super() 메소드는 부모의 기본 생성자를 호출한다.

(기본생성자: 프로그래머가 정의한 생성자가 없는, 자동적으로 컴파일러에 의해 생성되는 생성자)

public Mac(){
    super();
}

 

 

5. 추상 클래스(Abstract Class)

사전적 의미로 추상(abstract)은 실체 간에 공통되는 특성을 추출한 것을 말한다. 객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 한다면, 이 클래스들의 공통적인 특성을 추출해 선언한 클래스를 추상 클래스라고 한다. 

 

추상 클래스와 실체 클래스는 상속 관계를 갖는다. 추상 클래스가 부모, 실체 클래스가 자식으로 구현되어 실체 클래스는 추상 클래스의 모든 특성을 물려받고 추가적인 특성을 가질 수 있다. 여기서 특성이란 필드와 메소드를 말한다.

 

추상 클래스를 선언할 때는 클래스 선언에 abstract를 붙여야 한다.

 

public abstract class 클래스{
    //필드
    //생성자
    //메소드
}

 

추상 클래스도 일반 클래스처럼 필드, 생성자, 메소드 선언을 할 수 있다. 하지만 객체를 직접 생성해서 사용할 수는 없다. 즉, new 연산자를 사용해서 인스턴스를 생성하지 못한다.

 

Computer myComputer = new Computer(); // 오류

 

new 연산자로 직접 생성자를 호출할 수는 없지만 자식 객체가 생성될 때 super()를 호출해서 추상 클래스 객체를 생성하므로 추상 클래스도 생성자가 반드시 있어야 한다.

 

public abstract class Computer {
    
    // 필드
    public String owner;
    
    //생성자
    public Computer(String owner){
        this.owner = owner;
    }
    
    //메소드
    public void turnOn(){
        System.out.println("전원 On");
    }
    
}

 

추상 클래스는 새로운 실체 클래스를 만들기 위해 부모 클래스로만 사용된다. 즉, extends 뒤에만 올 수 있다.

 

public class Mac extends Computer{
    
}

 

추상 클래스의 용도

"실체 클래스들의 공통된 필드와 메소드의 이름을 통일할 목적"

 

실체 클래스를 설계하는 사람이 여러 사람일 경우, 실체 클래스마다 필드와 메소드가 제각기 다른 이름을 가질 수 있다. 

 

예를 들어 소유자 이름을 저장하는 필드를 Mac에서는 owner로, Window에서 user라고 할 수 있다. 그리고 전원을 켜다라는 메소드를 Mac에서는 turnOn으로 설계하고, SmartPhone에서는 powerOn()이라고 설계할 수 있다.

 

이것 보다는 Computer라는 추상 클래스에 owner 필드와 turnOn() 메소드를 선언하고, Mac과 Window에 Computer를 상속함으로써 필드와 메소드 이름을 통일할 수 있다.

'JAVA' 카테고리의 다른 글

자바_커피 머신 구현  (0) 2022.02.22
자바 기초(상속_다형성)  (0) 2022.02.21
자바스크립트 기초(내장 객체)  (0) 2022.02.18
자바 기초(배열)  (0) 2022.02.18
자바 기초(Static)  (0) 2022.02.18