[Java] 상속

rara_kim·2022년 6월 12일
0

Java

목록 보기
8/39

상속(Inheritance)

상속이란?

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

상속을 이용하면 기존에 정의되어 있는 클래스의 모든 필드와 메소드를 물려받아, 새로운 클래스를 생성할 수 있다.
이때 기존에 정의되어 있던 클래스를 부모 클래스(parent class) 또는 상위 클래스(super class)라고 한다.
그리고 상속을 통해 새롭게 작성되는 클래스를 자식 클래스(child class) 또는 하위 클래스(sub class)라고 한다.

부모 클래스를 상속 시, 변수와 메소드는 상속되지만 생성자, 초기화 블록은 상속되지 않는다.
또한 다중 상속은 불가능 하다.

class 자식클래스이름 extends 부모클래스명 {
	 ......
}

super, super()

1️⃣super
super 키워드는 부모 클래스로부터 상속받은 변수나 메소드를 자식 클래스에서 참조하는데 사용하는 참조변수이다.
부모 클래스의 멤버와 자식 클래스의 멤버 이름이 같은 경우 super 키워드를 사용하여 구별할 수 있다.

this와 마찬가지로 super 참조변수를 사용할 수 있는 대상도 인스턴스 메소드 뿐이며, 클래스 메소드에서는 사용할 수 없다.

2️⃣super()
this() 메소드가 같은 클래스의 다른 생성자를 호출할 때 사용된다면, super() 메소드는 부모 클래스의 생성자를 호출할 때 사용된다.

자식 클래스의 인스턴스를 생성하면, 해당 인스턴스에는 자식 클래스의 고유 멤버뿐만 아니라 부모 클래스의 모든 멤버까지도 포함되어 있다.

//부모 클래스
class Car {
    Car(){}
    public void horn() {
        System.out.println("빵빵!");
    }
}


//자식 클래스
class FireTruck extends Car {
    public void horn() {
        super.horn();
        System.out.println("위이잉!");
    }
}

class Ambulance extends Car {
    public void horn() {
        super.horn();
        System.out.println("삐뽀삐뽀!");
    }
}   


public class Practice2 {
    public static void main(String[] args) {
        FireTruck truck = new FireTruck();
        truck.horn();     //빵빵, 위이잉! 출력

        Ambulance amb = new Ambulance();
        amb.horn();       //빵빵, 삐뽀삐뽀! 출력
    }
}

오버라이딩(overriding)

오버라이딩(overriding)이란 상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 매개변수를 갖는 메소드로 재정의하는 것 이다.

자바에서 자식 클래스는 부모 클래스의 private멤버를 제외한 모든 메소드를 상속 받는다.
이렇게 상속받은 메소드는 그대로 사용해도 되고, 필요한 동작을 위해 재정의하여 사용할 수도 있다.

💡오버라이딩 조건
1. 메소드의 선언부는 기존 메소드와 완전히 같아야 한다.
2. 반환 타입에 한해, 부모 클래스의 반환 타입으로 변환할 수 있는 타입으로 변경할 수 있다.
3. 부모 클래스의 메소드보다 접근 제어자를 더 좁은 범위로 변경할 수 없다.
4. 부모 클래스의 메소드보다 더 큰 범위의 예외를 선언할 수 없다.
5. @Override 어노테이션을 사용하면 컴파일러가 오버라이딩한 메소드인지 체크한다.

class Car {
    Car(){}
    public void horn() {
        System.out.println("빵빵!");
    }
}


@Override
class Ambulance extends Car {
    public void horn() {
        super.horn();
        System.out.println("삐뽀삐뽀!");
    }
}
profile
느리더라도 꾸준하게

0개의 댓글