[JAVA] 상속

dev_swanim·2023년 3월 28일

JAVA 문법

목록 보기
3/10
post-thumbnail

1. 상속이란?

  • 부모 클래스의 필드와 메소드를 자식 클래스에게 물려주는 것
  • 클래스를 재사용해서 새로운 클래스를 만들기 때문에 중복되는 코드를 줄여준다

2. 클래스 상속

  • 자식이 어떤 부모 클래스를 상속받을 것인지 결정한다.
  • 여러 개의 부모 클래스 상속은 불가능하다. (자바는 다중 상속 불가능)
public class 자식클래스 extends 부모클래스{
}

public class SmartPhone extends Phone{
}
//this.을 활용해 부모 클래스 필드와 메소드를 쓰면 된다

3. 부모 생성자 호출

  • 부모 생성자는 자식 생성자super(); 에 의해 호출된다 (직접 안 써도 자동으로 생성됨)
  • 부모 생성자에 기본 생성자가 없고 매개변수를 갖는 생성자만 있으면 super(매개값, …); 을 넣어줘야 한다
public class Smart extends Phone{
	// 자식 생성자 선언
	public Smart(String model, String color){
		super(model, color);
	}
}

4. 메소드 재정의

  • 자식 메소드가 사용하기에 부모 메소드가 적합하지 않으면 재정의 해서 사용
  • 메소드의 내용을 원하는 대로 변경하면 된다
  • @override를 붙이면 컴파일 단계에서 오버라이딩 체크를 해준다

메소드 오버라이딩 규칙

  • 부모 메소드의 선언부(리턴, 메소드명, 매개변수)와 동일해야 함
  • 접근 제한을 강하게 오버라이딩 할 수 없음(ex. public → private로 변경 불가)
  • 새로운 예외를 throw 할 수 없다

부모 메소드 호출

  • 자식 메소드에서 일부분만 수정하기를 원할 경우, 수정을 원하는 코드를 작성해주고 나머지 부분은 부모 메소드를 호출함으로써 코드 라인 수를 줄일 수 있다
@override
public void fly(){
	if(flyMode == SUPERSONIC){
	
	}
	else{
		super.fly();
	}
}

5. final 클래스와 final 메소드

1. final 클래스

  • final 클래스는 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없다
public final class 클래스명{}

2. final 메소드

  • 최종적인 메소드가 되어서 오버라이딩할 수 없게 된다
public final 리턴타입 메소드(매개변수, ...){}

6. 타입 변환

  • 타입 변환이 필요한 이유는 다형성 때문이다

자동 타입 변환

// 부모타입 변수 = 자식타입 객체;
Cat cat = new Cat();
Animal animal = cat;

→ cat과 animal 변수는 타입만 다르지 동일한 Cat 객체를 참조한다

  • animal 변수에서는 cat 객체 내용을 사용할 수 있다

강제 타입 변환

// 자식타입 변수 = (자식타입) 부모타입객체;
Parent parent = new Child(); // 자동 타입 변환
Child child = (Child) parent; // 강제 타입 변환

7. 다형성

  • 다형성 : 사용 방법은 동일하지만, 실행 결과가 다양하게 나오는 성질
  • 다형성 = 자동 타입 변환 + 메소드 오버라이딩
// Car 객체 생성
Car myCar = new Car();

// HankookTire 장착
myCar.tire = new HankookTire();

// KumhoTire 장착
myCar.tire = new KumhoTire();

→ 어떤 타이어를 장착했느냐에 따라 결과가 달라진다

매개변수 다형성

  • 메소드가 클래스 타입의 매개변수를 가지고 있을 때, 자식 객체를 제공하게 되면 다형성이다
public class Driver{
	public void drive(Vehicle vehicle){ //클래스 타입의 매개변수
		vehicle.run();
	}
}

//main
Driver driver = new Driver();

Bus bus = new Bus();
driver.drive(bus);

Taxi taxi = new Taxi();
driver.drive(taxi);

8. 객체 타입 확인

  • instanceof 연산자 : 변수가 참조하는 객체의 타입을 확인하고자 할 때 사용
public void method(Parent parent){
	if(parent instanceof Child){
		Child child = (Child) parent;
	}
}

9. 추상 클래스

  • 추상 클래스 : 객체를 생성할 수 있는 클래스의 공통적인 필드나 메소드를 추출해서 선언한 클래스
  • 실체 클래스의 부모 역할
  • 실체 클래스는 추상 클래스를 상속해서 공통적인 필드나 메소드를 물려받을 수 있다

추상 클래스 선언

  • new 연산자를 이용해 객체를 직접 만들지 못하고 상속을 통해 자식 클래스만 만들 수 있다
public abstract class 클래스명{
	// 필드
	// 생성자
	// 메소드
}

//extends를 이용해 추상 클래스 상속받기

추상 메소드와 재정의

  • 예를 들어 소리를 내는지에 대한 여부는 동물마다 다르다. 그래서 추상 클래스에서 통일해서 작성할 수 없다
  • 추상 메소드를 자식 클래스에서 사용한다면 오버라이딩으로 재정의 하여 사용하면 된다
// abstract 리턴타입 메소드명(매개변수, ...);

public abstract class Animal{
	abstract void sound();
}

10. 봉인된 클래스

  • 무분별한 자식 클래스 생성을 막기 위해 봉인된 클래스가 도입됨(Java 15부터)
// Person의 자식 클래스는 Employee, Manager만 가능
public sealed class Person permits Employee, Manager{...}

// final : 더이상 상속 불가능
public final class Employee extends Person{...} 

// non-sealed : 봉인 해제
// Manage를 부모 클래스로 하는 자식 클래스 생성 가능
public non-sealed class Manager extends Person{...}

📚참고 문헌

이것이 자바다(신용권, 임경균 지음)

profile
데이터와 백엔드를 공부하고 있습니다😌

0개의 댓글