프로그래밍/JAVA

20 상속(inheritance)

윤지(●'◡'●) 2021. 4. 8. 10:22
반응형

 

 


상속(inheritance)

 

1. 기존의 클래스로 새로운 클래스를 작성하는 것

(기존에 선언된 클래스의 필드를 다른 클래스에서도 사용하고자 할 때 - 코드의 재사용)

2. 두 클래스를 부모와 자식으로 관계를 맺어주는것

 

상속은 다음과 같이 사용할 수 있다.

 

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

 

부모 클래스 A

class A{
	// A의 필드
}

 

자식 클래스 B

class B extends A{
	// B의 필드
}

 

B obj = new B();


이때, obj 객체는 실제로는 A의 필드와 B의 필드 둘다 가지고 있다.

자식 클래스에는 부모 클래스의 필드와 메소드만이 상속되며, 생성자와 초기화 블록은 상속되지 않는다.

 

 

 

부모와 자식 외에도 다양하게 불린다.

A 부모 클래스, 상위클래스, 슈퍼 클래스, 기반클래스
B 자식 클래스, 하위클래스, 서브 클래스, 파생클래스

 


자식 클래스 생성자 호출시

 

자식 클래스의 객체는 자식 생성자를 호출해서 객체화를 진행한다.
메모리에 자식 클래스의 필드만 올라갔다면 자식 객체로 절대 부모 클래스에 있는 필드에 접근할 수 없다. 

따라서 자식 생성자를 호출하게 되면 부모의 생성자가 자동으로 먼저 호출된다.
그 이후에 자식 객체는 부모 필드가 메모리에 먼저 생성되어 있기 때문에 그 필드들에 접근할 수 있게 된다
>> 자식 생성자 첫 줄에는 항상 super 클래스의 생성자가 호출된다.

     명시적으로 적지 않을시에는 보이지 않지만 super() 가 호출된다.

 

아래 예시로 살펴보자 :)

 


부모클래스 :  Car

 

public class Car {
	String brand; 
	String color;
	int price;
    
    Car(String brand, String color, int price) {
		this.brand = brand;
		this.color = color;
		this.price = price;
	}
    
    void engineStart() {
		System.out.println(brand + " 시동 켜기");
	}
	
	void enginStop() {
		System.out.println(brand + " 시동 끄기");
	}
}

 

자식클래스 :  SuperCar

 

public class SuperCar extends Car {
	String pw;

	public SuperCar() {
//		super : 부모 클래스 이름, 자동으로 되어서 생략가능하다
//		명시적으로 적지 않을 시에는 부모 클래스의 기본 생성자를 호출한다.
//		super(); == Car 
	}
	
    // 부모클래스에 있는 생성자 받아와 부모 필드 + 자신 필드 세팅하는 생성자 만들기
    public SuperCar(String brand, String color, int price, String pw) {
		super(brand, color, price);
		this.pw = pw;
	}
    
    void roofOpen() {
		System.out.println(brand + " 뚜껑 열기");
	}

	void roofClose() {
		System.out.println(brand + " 뚜껑 닫기");
	}

 

잠깐 ! 부모 클래스에 있는 생성자 받아 오는 법

 

1. 자식 클래스에서 단축키 Alt + Shift + S -> O 클릭

 

 

2. 맨 위에서 부모 생성자 선택 후 Generate

 

 

3. 완성!

 

 

 

 

다시 예제로 넘어와 위와 같이 만든 Car와 SuperCar 를 사용해 도로를 만들어보자

 

public class Road {
	public static void main(String[] args) {
		Car momcar = new Car("K7", "White", 7000);
		Car dadcar = new Car("BMW","Blue",35000);
        
		SuperCar mycar = new SuperCar("Ferrari", "Red", 65000, "abcd");
		mycar.engineStart();
		mycar.roofOpen();

	}
}

코드를 살펴보면 mycar는 SuperCar 객체지만 Car의 메소드를 사용한 것을 볼 수 있다.

이것은 위에서 설명했듯이 Car와 SuperCar가 상속관계이기 때문에 가능한 것이다.

 

mycar에서 사용가능한 변수와 메소드들

 

반응형