[Java] 상속

Korangii·2024년 6월 28일
0

Java

목록 보기
14/24
post-thumbnail

수업 중 필기-상속

상속

  • 부모 클래스의 필드메소드를 자식 클래스에게 물려줄 수 있음
  • 상속의 이점 : 중복 코드 줄임 / 클래스 수정 최소화 / 기존 코드 재사용 가능

클래스 상속

  • 자식 클래스를 선언할 때 어떤 부모로부터 상속받을 것인지를 결정하고, 부모 클래스를 다음과 같이 extends 뒤에 기술
public class 자식클래스 extends 부모클래스 {
}
  • 다중 상속 허용하지 않음. extends 뒤에 하나의 부모 클래스만 상속

부모 생성자 호출

  • 모든 객체는 생성자를 호출해야만 생성된다.
  • 부모 생성자는 자식 생성자의 맨 첫 줄에 숨겨져 있는 super()에 의해 호출된다.
  • 부모생성자
    • 기본생성자 : 컴파일 과정에서 자동으로 추가된다. 부모의 기본 생성자를 호출한다.
    • 매개변수를 갖는 생성자 : 직접 매개변수를 입력해줘야 한다. 매개값의 타입과 개수가 일치하는 부모 생성자를 호출하다.
// 자식 생성자 선언
public 자식클래스(...) {
	super();
	...
}

// 자식 생성자 선언
public 자식클래스(...) {
	super(매개값, ...);
	...
}

메소드 재정의(Method Overriding)

  • 상속된 메소드를 자식 클래스에서 재정의해서 사용하는 것
  • 메소드가 오버라이딩되었다면 자식 메소드가 우선적으로 사용된다.
  • 오버라이딩 규칙
    • 부모 메소드의 선언부(리턴 타입, 메소드 이름, 매개변수)와 동일해야 한다.
    • 접근 제한을 더 강하게 오버라이딩할 수 없다.(public -> private으로 변경 불가)
    • 새로운 예외를 throws할 수 없다.
  • @Override : 컴파일 시 정확히 오버라이딩이 되었는지 체크해 줌 (생략 가능), 문제가 있다면 컴파일 에러 출력 / annotation
  • 부모 메소드 호출 (공동 작업 처리 기법)
    • 상속한 부모 메소드가 재정의된 경우 사용
    • 자식 메소드 내에서 부모 메소드를 호출하는 것
    • super() 키워드와 도트(.) 연산자를 사용하면 숨겨진 메소드를 호출할 수 있다.

final 클래스와 final 메소드

  • final 클래스
    • final 클래스는 최종적인 클래스이므로 더 이상 상속할 수 없다.
    • 부모클래스가 될 수 없어 자식클래스가 만들 수 없다.
public final class Member {
}
  • final 메소드
    • final 메소드는 최종적인 메소드이므로 오버라이딩 할 수 없는 메소드가 된다.
    • 부모클래스를 상속해서 자식클래스를 선언할 때, 부모클래스에 선언된 final 메소드는 자식 클래스에서 재정의할 수 없다.
public final 리턴타입 메소드(매개변수) {
}

protected 접근 제한자

  • 필드와 생성자 그리고 메소드 선언에 사용될 수 있다.
  • 같은 패키지에서는 default처럼 접근이 가능하나, 다른 패키지에서는 자식 클래스만 접근을 허용한다.
    • 동일한 패키지 : protected 필드, 생성자, 메소드 접근 가능
    • 다른 패키지 : 상속받은 자식클래스만 protected 필드, 생성자, 메소드 접근 가능
      • new 연산자로 생성자 직접 호출 불가
      • 자식 생성자에서 super()로 생성자 호출 가능
  • default는 접근 제한자가 아니라 접근 제한자가 붙지 않은 상태를 말한다.

타입 변환

  • 타입을 다른 타입으로 변환하는 것
  • 자동 타입 변환(Promotion) : 자동적으로 타입 변환이 일어나는 것을 말한다.
    • 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다.
    • 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이라면 자동 타입 변환이 일어날 수 있다.
부모타입 변수 = 자식타입객체;
// 자식타입객체에서 부모타입 변수로 자동 타입 변환
  • ❓부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다.
  • ❓변수는 자식 객체를 참조하지만 변수로 접근 가능한 멤버는 부모 클래스 멤버로 한정된다.
  • 강제 타입 변환(Casting) : 캐스팅 연산자로 강제 타입 변환시키는 것을 말한다.
  • 부모 타입은 자식 타입으로 자동 변환되지 않는다.
  • ❓자식객체가 부모 타입으로 자동 변환된 후 다시 자식 타입으로 변환할 때 강제 타입 변환을 사용할 수 있다.
  • 자동변환하면 부모타입에 선언된 필드와 메소드만 사용가능하므로, 자식타입에 선언된 필드와 메소드를 사용해야 한다면 강제 타입 변환을 해서 다시 자식 타입으로 변환해야 한다.
자식타입 변수 = (자식타입) 부모타입객체;
// 부모타입객체에서 자식타입 변수로 강제 타입 변환
// (자식타입) : 캐스팅 연산자

다형성

  • 사용방법은 동일하지만 실행 결과가 다양하게 나오는 성질을 말한다.
  • 예시) 자동차의 부품을 교환하면 성능이 다르게 나오듯이 객체는 부품과 같아서,
    프로그램을 구성하는 객체를 바꾸면 프로그램의 실행 성능이 다르게 나올 수 있다.
  • 객체 사용방법이 동일하다는 것은 동일한 메소드를 가지고 있다는 뜻이다.
  • 다형성 구현 방법 : 자동 타입 변환 + 메소드 재정의(오버라이딩)
  • 필드 다형성 : 필드 타입은 동일하지만, 대입되는 객체가 달라져서 실행결과가 다양하게 나올 수 있는 것을 말한다.
  • 매개변수 다형성 : 메소드가 클래스 타입의 매개변수를 가지고 있을 경우, 호출할 때 동일한 타입의 객체를 제공하는 것이 정석이지만 자식 객체를 제공할 수도 있다.

객체 타입 확인

  • instanceof 연산자
    • 어떤 객체가 매개값으로 제공되었는지 확인하고자 할 때 사용
    • 변수가 참조하는 객체의 타입을 확인하고자 할 때 사용
boolean result = 객체 instaceof 타입;

추상 클래스

  • 추상 클래스 : 공통적인 필드나 메소드를 추출해서 선언한 클래스
    • new 연산자를 사용해서 객체를 직접 생성할 수 없다.
    • 상속을 통해 자식 클래스만 만들 수 있다.
    • 추상 클래스는 새로운 실체 클래스를 만들기 위한 부모 클래스로만 사용된다.
    • 추상 클래스는 extends 뒤에만 올 수 있다.
    • 실체 클래스는 추상 클래스를 상속해서 공통적인 필드나 메소드를 물려받을 수 있다.
    • 추상클래스도 필드, 메소드를 선언할 수 있다.
    • 자식 객체가 생성될 때 super()로 추상 클래스의 생성자가 호출되기 때문에 생성자도 반드시 있어야 한다.
public abstract class 클래스명 {
  // 필드
  // 생성자
  // 메소드
}
  • 추상 메소드 : 메소드 선언부(리턴타입, 메소드명, 매개변수)만 동일하고 실행 내용은 자식 클래스마다 달라야 하는 경우가 많다.
    • 추상 메소드는 자식 클래스의 공통 메소드라는 것만 정의할 뿐, 실행 내용을 가지지 않는다.
    • 추상 메소드는 자식 클래스에서 반드시 재정의(오버라이딩)해서 실행 내용을 채워야 한다.
abstract 리턴타입 메소드명(매개변수, ... );

봉인된 클래스

  • sealed : 무분별한 자식 클래스 생성을 방지하기 위해 봉인된 클래스가 도입되었다.
  • final은 더 이상
profile
https://honeypeach.tistory.com/ 로 이전했습니다.

0개의 댓글