본문 바로가기

ETC/복습

[복습_JAVA] 24

● 상속(inheritance)

1. 기존에 선언된 클래스의 필드를 새롭게 만들 클래스의 필드로 사용하고자 할 때 사용한다.

2. 여러 클래스 선언 시 필드가 겹치는 경우, 부모 클래스를 먼저 선언하고 공통필드를 묶어서 자식 클래스에게 상속해준다.

 

 

 

● 상속 문법

- extends 키워드를 사용한다.

(ex)

class A{

    A 필드

}

class B extends A{

    A, B 필드

}

 

- A : 부모 클래스, 상위 클래스, 슈퍼 클래스, 기반 클래스

- B : 자식 클래스, 하위 클래스, 서브 클래스, 파생 클래스

 

 

 

● super()

- 부모 생성자

- 자식 클래스 타입의 객체로 부모 필드에 접근할 수 있다.

- 하지만 자식 생성자만 호출하기 때문에, 자식 필드만 메모리에 할당된다고 생각할 수 있다.

- 사실 자식 생성자는 항상 부모 생성자를 호출하기 때문에 자식 생성자 호출 시 부모와 자식 필드 모두 메모리에 할당된다.

- 이 때 부모 생성자를 호출하는 방법은 super()를 사용하는 것이다.

- super()를 작성하지 않더라도 컴파일러가 자동으로 작성해준다.

 

 

 

● 다형성(polymorphism)

1. 오버로딩

2. 오버라이딩(재정의)

- 부모 필드에서 선언한 메소드를 자식 필드에서 수정하고자할 때 재정의를 해야 한다.

- 이는 자식에서 부모 필드의 메소드와 동일한 이름으로 선언하는 것이다.

- 부모 필드가 메모리에 먼저 할당되고 a 라는 메소드가 먼저 올라간다고 하면,

   자식 필드가 메모리에 할당되면서 재정의한 a 메소드가 새롭게 만들어지는 것이 아닌

   기존에 할당된 a 메소드 저장공간에 새롭게 재정의한 소스코드의 주소가 들어가게 된다.

- 따라서 자식 객체로 a 메소드에 접근하면 자식 필드에서 재정의한 소스코드의 내용이 읽히게 된다.

 

 

 


 

실습(상속(1))

class A{

	String nameA = "A";
	int data = 10;
	
	public A() {
		System.out.println("부모 생성자 호출");
	}

}

class B extends A{

	String nameB = "B";
	
	public B() {	
		// ※ this : 접근한 객체의 주소값
		// super() : 부모 필드의 주소값, A타입이므로 A클래스(부모 클래스)의 생성자이다.
		// 자식보다 먼저 출력되야하므로 최상단에 적어준다.
		super();  //  부모 생성자, 생략 시 컴파일러가 컴파일할 때 자동으로 작성한다.
		System.out.println("자식 생성자 호출");
	}
	
	void printData() {
		System.out.println(data);
	}

}


public class InheritanceTest {
	public static void main(String[] args) {
		
		B b = new B();
		b.printData();
		System.out.println(b.nameA);
		System.out.println(b.nameB);
		
	}

}

 

결과

 

 

 

 

실습(상속(2))

//부모 클래스
class Human{

	void eat() {
		System.out.println("먹기");
	}
	
	void sleep() {
		System.out.println("자기");
	}
	
	void walk() {
		System.out.println("두 발로 걷기");
	}

}


//자식 클래스
class Monkey extends Human{

	void eatLouse() {
		System.out.println("냠냠");
	}
	
	@Override
	void walk() {
		//덮어 쓰기 전에 부모의 기능을 가져와 사용한다.
		//부모의 기능을 그대로 쓰면서 몇가지를 추가할 때 사용한다.
		//하지만 부모의 기능을 완전 다 갈아 엎을 때는 쓰지 않는다.
		super.walk();
		System.out.println("네 발로 걷기");
	}

}

public class InheritanceTest2 {
	public static void main(String[] args) {

		Monkey kingkong = new Monkey();
		kingkong.walk();

	}

}

 

결과

 

 

 

 

실습(상속(3))

1. 부모 클래스(Car) 작성하기

class Car{
	// 변수
	// 브랜드, 색상, 가격
	String brand;
	String color;
	int price; 
	
	
	// 기본 생성자
	public Car() {;}


	// 초기화 생성자
	public Car(String brand, String color, int price) {
		super();
		this.brand = brand;
		this.color = color;
		this.price = price;
	}
	
	
	// 메소드
	// "열쇠로 시동 킴" 출력
	void engineStart() {
		System.out.println("열쇠로 시동 킴");
	}
	
	
	// "열쇠로 시동 끔" 출력
	void engineStop() {
		System.out.println("열쇠로 시동 끔");
	}
	
}

 

 

 

2. 자식 클래스(SuperCar) 작성하기

class SuperCar extends Car{
	// 변수
	// 브랜드, 색상, 가격(Car 클래스와 일치하므로 따로 작성할 필요가 없다.)
	// 모드 
	String mode;
	
	
	// 기본 생성자
	public SuperCar() {;}
	
	
	// 초기화 생성자
	public SuperCar(String brand, String color, int price, String mode) {
		super(brand, color, price);  // 부모 클래스(Car)에서 작성한 정보를 가져온다.
		this.mode = mode;
	}
	
	
	// 메소드
	// "열쇠로 시동 킴", "음성으로 시동 킴" 출력
	@Override  // 재정의
	void engineStart() {
		super.engineStart();  // 부모 클래스(Car)의 engineStart() 메소드도 실행한다.
		System.out.println("음성으로 시동 킴");
	}
	
	
	// "음성으로 시동 끔" 출력
	@Override
	void engineStop() {  // 부모 클래스(Car)의 engineStop() 메소드는 실행하지 않고 재정의만 한다.
		System.out.println("음성으로 시동 끔");
	}
	
	
	// "지붕 열림" 출력
	// 부모 클래스에는 없는 새로운 메소드
	void openRoof() {
		System.out.println("지붕 열림");
	}
	
	
	// "지봉 닫힘" 출력
	// 부모 클래스에는 없는 새로운 메소드
	void closeRoof() {
		System.out.println("지붕 닫힘");
	}
	
}

 

 

 

3. main 메소드에서 실행

public class Road {
	public static void main(String[] args) {
		
		Car matiz = new Car();  // 부모
		SuperCar ferrari = new SuperCar("Ferrari", "RED", 35000, "sport");  // 자식
		
		matiz.engineStart();  // 부모
		 
		ferrari.engineStart();  // 자식
		ferrari.engineStop();  // 자식
		ferrari.openRoof();  // 자식
		ferrari.closeRoof();  // 자식
		
	}
}

 

결과

 

 

 

'ETC > 복습' 카테고리의 다른 글

[복습_JAVA] 25  (0) 2022.09.14
[복습_JAVA] 23  (0) 2022.09.07
[복습_JAVA] 22  (0) 2022.09.06
[복습_JAVA] 21  (0) 2022.09.02
[복습_JAVA] 20  (0) 2022.09.01