Java

[Java] Inheritance

wwxs 2024. 9. 9. 12:42

Inheritance(상속)

  • 한 클래스의 속성과 메서드를 다른 클래스가 물려 받는 기능
  • 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것
  • 보다 적은 양의 코드로 새로운 클래스 작성 가능 → 코드의 재사용성 증가, 코드의 중복을 제거: 프로그램의 생산성을 높임

상속 구현 방법

  • extends 키워드를 사용하여 상속 구현
  • 새로 작성하고자 하는 클래스의 이름뒤에 상속하고자 하는 클래스의 이름을 키워드 extends와 함께 작성
더보기
더보기
class Parent {} // : 기존 클래스
class Child extends Parent {} // : 새로 작성하려는 클래스

상속해주는 클래스(Parent) : 조상클래스, 부모클래스, 상위클래스 기반클래스, 슈퍼클래스

상속 받는 클래스(Child): 자손클래스, 자식클래스, 하위클래스, 파생클래스, 서브클래스

 

(예제 코드)

더보기
더보기
class Animal {
	String name;
}

// Dog 자식 클래스는 Animal 부모 클래스의 상속을 받음
// : 자식 클래스는 부모 클래스의 모든 멤버를 상속 받기 때문에 
// : , 자식 클래스의 멤버(속성, 메서드) 개수는 부모 클래스보다 항상 같거나 많음
// 		>> 상속에 사용되는 키워드가 extends인 이유

class Dog extends Animal {
	// 부모 클래스의 기능을 모두 상속 받기 때문에
	// String name; (생략된 것처럼 작용)
	
	// 짖다.
	void bark() {
		System.out.println("강아지가 짖습니다.");
	}
}
class Tv {
	boolean power; // 전원 상태(on/off)
	int channel; // 채널
	
	void power() { power = !power; }
	void channelUp() { ++channel; }
	void channelDown() { --channel; }
}

class SmartTv extends Tv {
	boolean ott; // OTT 플랫폼 전원 상태(on/off)
	
	void displayOtt(String platform) {
		if (ott) { // OTT의 상태가 on(true)일 때만 platform을 보여줌
			System.out.println(platform);
		} else {
			System.out.println("OTT 연결이 되지 않았습니다.");			
		}
	}
}

public class Inheritance01 {
	public static void main(String[] args) {
		SmartTv stv = new SmartTv();
		// 자식 클래스의 인스턴스를 생성하면 부모 클래스의 멤버도 함께 생성
		// >> 따로 부모 클래스의 인스턴스를 생성하지 않고도 
		//    , 부모 클래스의 멤버들을 사용 가능
		stv.channel = 10; // 부모 클래스로부터 상속받은 멤버(변수)
		stv.channelUp(); // 부모 클래스로부터 상속받은 멈버(메서드)
		System.out.println(stv.channel);
		
		stv.displayOtt("Netflex"); // OTT 연결이 되지 않았습니다.
		stv.ott = true; // OTT 기능을 켬
		stv.displayOtt("Netflex");
	}
}

 

상속에서의 생성자

  • 상속받은 클래스에서 생성자 호출 순서는 부모 > 자식 순서로 진행
  • 자식 클래스의 객체를 생성할 때, 자식 클래스는 자식 생성자를 통해 자식 객체 생성

 

1. super() 참조 메서드

  • 부모 클래스의 생성자를 호출하는데 사용되는 메서드
  • 자식 클래스의 기본 생성자는 사용자가 정의하지 않더라도,  super() 부모 클래스 생성자 호출 키워드가 정의되어 있음

2. super 참조 변수

  • 자식 클래스에서 부모 클래스의 멤버(필드, 메서드)에 접근할 때 사
더보기
더보기
class Mammal {
	String name = "Parent";
	
	Mammal() {
		System.out.println("빈 부모 생성자");
	}
	
	// 사용자 정의 생성자
	Mammal(String name) {
		this.name = name;
		System.out.println("부모 클래스가 생성되었습니다.");
	}
}

class Cat extends Mammal {
	String name = "Child";
	// 1. super() 참조 메서드
	// 자식 클래스의 기본 생성자는 사용자가 정의하지 않더라도
	// , super() 부모 클래스 생성자 호출 키워드가 정의되어 있음
	
	// 2. super 참조 변수
	void greet() {
		// 해당 클래스가 가진 인스턴스 변수에 접근(생략)
		System.out.println("Hello " + this.name);
		// 부모 클래스가 가진 인스턴스 변수에 접근(super키워드를 사용하여 접근)
		System.out.println("Hello " + super.name);
	}
	
	Cat() {
		System.out.println("빈 자식 생성자");
	}
	
	Cat(String name) {
		// super()는 부모 클래스의 생성자를 가지고 오기 때문에
		// , 기본 생성자 또는 사용자 정의 생성자의 형태 그대로를 사용
		super(name); // 부모 클래스를 가리킴
		System.out.println("자식 클래스가 생성되었습니다.");
	}
}

public class Inheritance02 {
	public static void main(String[] args) {
		// 자식 클래스는 항상 부모 클래스의 생성자를 호출
		// : 딘, 항상 직접적으로 정의된 생성자를 필요로 하는 것은 X
		Cat voidCat = new Cat();
		Cat myCat = new Cat("choco");
		
		// 자식 클래스의 name 호출된 후
		// 위의 인스턴스 생성 시 부모 클래스로 전달했던 choco이름의
		// , 부모 클래스의 name이 호출
		myCat.greet();
	}
}

'Java' 카테고리의 다른 글

[Java] Modifier  (0) 2024.09.09
[Java] Overriding  (0) 2024.09.09
[Java] Constructor  (0) 2024.09.06
[Java] Overloading  (0) 2024.09.06
[Java] Method  (0) 2024.09.06