Languages/Java

[HUFS/객체지향프로그래밍] #6 상속

성중 2022. 12. 30. 15:50

클래스 상속

이미 개발된 클래스를 상속(재사용)시켜 새로운 클래스를 만들기에 중복되는 코드를 줄일 수 있다

 

부모 클래스 수정으로 모든 자식 클래스가 수정되어 유지보수 시간 단축
클래스 상속 (extends)

  • 여러 개의 부모를 한 번에 상속받을 수 없음
  • 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드 상속 제외
  • 부모와 자식 클래스의 패키지가 다를 경우 default 접근 제한을 갖는 필드와 메소드 상속 제외

 

super를 사용해 자식 생성자에서 부모 생성자 호출 예시

package sec01.exam02;

public class People {
	public String name;
	public String ssn;
	
	public People(String name, String ssn) {
		this.name = name;
		this.ssn = ssn;
	}
}

package sec01.exam02;

public class Student extends People{
	public int studentNo;
	
	public Student(String name, String ssn, int studentNo) {
		super(name, ssn);
		this.studentNo = studentNo;
	}
}

자식 클래스에서 부모 클래스의 메소드를 수정하여 재정의(Overriding)할 수 있다

 

메소드 오버라이딩

메소드 재정의 규칙

  • 부모 메소드와 동일한 시그니처를 가져야 함
  • 접근 제한을 더 강하게 재정의할 수 없음
  • 새로운 예외를 throw할 수 없음

 

명시적으로 super를 붙여 오버라이딩 이전의 부모 메소드를 호출
final 클래스는 상속 불가
final 메소드는 재정의 불가
protected는 다른 패키지여도 자식 클래스에서 접근을 허용

타입 변환과 다형성

사용 방법은 동일하지만 다양한 객체를 활용해 여러 실행 결과가 나오도록 하는 성질을 다형성(Polymorphism)이라 하며, 메소드 재정의와 타입 변환으로 구현할 수 있다

 

부모 타입 변수에 자식 타입을 대입해 자동 타입 변환 가능 (바로 위 부모가 아니어도 됨)
부모 타입으로 변환 후에는 부모 클래스 메소드만 사용 가능 (재정의된 경우 제외)
필드 타입을 부모 타입으로 선언할 경우 다양한 객체로 필드 사용 결과가 달라질 수 있음
매개 변수를 부모 타입으로 선언하면 자동 타입 변환이 발생할 수 있음
부모 타입으로 자동 타입 변환된 자식 타입을 원래 타입으로 강제 타입 변환 가능
instanceof 연산자로 객체가 현재 어느 클래스의 인스턴스인지 확인 및 예외 처리

추상 클래스

추상 클래스는 클래스들의 공통적 특성(필드, 메소드)을 추출해 상속 관계를 가지도록 한다

 

추상 클래스
인스턴스 생성 목적이 아닌 공통 설계 규격이 목적

abstract 키워드로 구현하며 필드/생성자/메소드를 선언해 super 키워드로 호출될 수 있다

 

추상 클래스 예시

package sec03.exam01;

public abstract class Phone {
	//필드
	public String owner;
	
	//생성자
	public Phone(String owner) {
		this.owner = owner;
	}
	
	//메소드
	public void turnOn() {
		System.out.println("폰 전원을 켭니다.");
	}	
	public void turnOff() {
		System.out.println("폰 전원을 끕니다.");
	}
}

추상 메소드는 중괄호 없이 선언 ~ 자식 메소드는 반드시 재정의해 실행 내용을 채워줘야 함