천천히 빛나는

Java 기초 : 상속 본문

JAVA/JAVA

Java 기초 : 상속

까만콩 •ᴥ• 2023. 7. 31. 15:43

상속 (Inheritance)

부모 클래스가 가지는 멤버(필드, 메소드)를 자식 클래스가 물려 받아 자신의 멤버인 것처럼 사용할 수 있도록 만든 기술이다. (단, 생성자는 물려 받지 않음)

public class Academy extends Company {
    // Academy가 Company의 속성을 물려받음
}

자바는 단일상속(자식 클래스는 하나의 부모 클래스만 가지는)만 지원한다. (c++은 가능하다)

부모 클래스는 extends와 같이 표시하지 않는다.

 

class Calculator {
    int left, right;
    
    public Calculator(int left, int right){ // 기본 생성자 없음
        this.left = left;
        this.right = right;
    }
    public void setOprands(int left, int right) {
        this.left = left;
        this.right = right;
    }
 
    public void sum() {
        System.out.println(this.left + this.right);
    }
 
    public void avg() {
        System.out.println((this.left + this.right) / 2);
    }
}
 
class SubstractionableCalculator extends Calculator {
    public SubstractionableCalculator(int left, int right) {
        this.left = left;
        this.right = right;
    }
 
    public void substract() {
        System.out.println(this.left - this.right);
    }
}
 
public class CalculatorConstructorDemo4 {
    public static void main(String[] args) {
        SubstractionableCalculator c1 = new SubstractionableCalculator(10, 20);
        c1.sum();
        c1.avg();
        c1.substract();
    }
}

하위 클래스가 호출될 때 자동으로 상위 클래스의 기본 생성자를 호출하게 된다. 그런데 상위 클래스에 매개변수가 있는 생성자가 있다면 자바는 자동으로 상위 클래스의 기본 생성자를 만들어주지 않는다.

 

class SubstractionableCalculator extends Calculator {
    public SubstractionableCalculator(int left, int right) {
        super(left, right);
    }
}

상위 클래스의 생성자와 하위 클래스의 생성자는 같은 기술을 하게 되는데 코드를 복사하는 대신에 하위 클래스가 생성될 때 상위 클래스의 생성자를 호출해서 실행시킬 수 있다면 중복 코드 문제를 해결할 수 있을 것이다. 

이를 할 수 있는 것이 super이다. super은 부모 클래스를 뜻하게 된다. (this가 자기 자신인 것처럼)

 

하위 클래스의 생성자에서 super를 사용할 때 주의할 점은 super가 가장 먼저 나타나야 한다는 점이다. 즉 부모가 초기화되기 전에 자식이 초기화되는 일을 방지하기 위한 정책이다.

 

final 클래스는 상속이 불가능하다.

 

 

 

Super

부모클래스의 인스턴스 주소를 보관하는 레퍼런스 변수

 

메소드 안에서 this. : 메소드를 호출하는 인스턴스

생성자 안에서 this. : 생성자를 통해 만들어질 인스턴스

생성자 안에서 this() : 자신과 같은 클래스의 생성자를 하나 사용

 

public class Car {
    private boolean isRunning; // 기본값 false

    public Car() {
        super();
        System.out.println("Car 클래스 기본 생성자 호출");
    }
}
public class FireCar extends Car {
    public FireCar() {
        super();
        System.out.println("FireCar 클래스의 기본 생성자 호출");
    }
}

상속에서는 속성과 기능은 물려주지만 생성자를 물려받진 않는다. 자식 클래스는 부모 클래스의 생성자를 super()라는 키워드로 부모 인스턴스를 먼저 만들어줘야 한다. 작성하지 않아도 자동으로 작성이 된다.

 

부모 클래스는 Object 클래스로 가게 되는데 이건 자바의 모든 클래스의 부모 클래스가 된다. 즉 extends Object가 생략되어 있다고 생각하면 된다. (컨트롤+클릭으로 확인 가능)

public class Application {
    public static void main(String[] args) {
        FireCar fireCar = new FireCar();
    }
}

부모 클래스가 먼저 생성되고 자식 클래스가 생성되게 된다 (super 생략해도 동일)

 

 

public ConputerDTO (string code, String barnd, String name, int, ram) {
    super(code, brand, name);
    this.ram = ram;
}

부모 클래스 생성자 이용방법 : super()

 

 

오버라이딩 (Overriding)

부모클래스에서 상속받은 메소드를 자식 클래스가 재정의하여 사용하기 위한 기술

 

하위 클래스에서 상의 클래스와 동일한 메소드를 정의하면 부모 클래스로부터 물려 받은 기본 동작 방법을 변경하는 효과를 갖게 된다. 

public class RacingCar extends Car {
    public RacingCar() {
        super();
        System.out.println("FireCar 클래스의 기본 생성자 호출");
    }
    @Override
    public void soundHorn() { // 오버라이딩
        System.out.println("레이싱카는 경적을 울리지 않습니다.");    
    }
}

@Override를 적지 않아도 되지만 가독성을 높이고 오타를 방지해주므로 적어주는 것이 좋다

 

오버라이딩 성립조건

  1. 메소드명 동일
  2. 메소드 리턴타입 동일
  3. 매개변수의 타입, 개수, 순서가 동일
  4. 부모 클래스의 private 메소드는 오버라이딩 불가능
  5. 부모 클래스의 final 키워드가 사용된 메소드는 오버라이딩 불가능
  6. 접근제어자는 부모 메소드와 같거나 더 넓은 범위여야 함
  7. 예외처리는 같은 예외이거나 더 구체적(하위)인 예외를 처리해야 함

 

 

 

@Override
public void toString() {
    return super.toString() + "어쩌구";  
}

부모 클래스의 함수를 사용하여 오버라이딩 하는 코드이다

 

 

'JAVA > JAVA' 카테고리의 다른 글

Java 기초 : 클래스 멤버 - static의 사용  (1) 2024.01.09
Java 기초 : 정리본 (2)  (0) 2023.08.09
Java 기초 : Enum과 객체 배열  (0) 2023.07.30
Java 기초 : 객체  (0) 2023.07.28
Java 기초 : 정리본 (1)  (0) 2023.07.27