본문 바로가기

[TIL] 상속

인포꿀팁 발행일 : 2020-08-10

상속(Inheritance)이란?

  • 기존에 정의된 클래스에 메소드와 필드를 추가하여새로운 클래스를 만드는 것
  • 상속을 통해 연관된 일련의 클래스에 대한 공통적인 규약을 정의하고 적용하는데, 상속의 실질적인 목적이 있다.
  • java.lang.Object 클래스는 자바 클래스의 최상위 클래스로 자바 플랫폼의 모든 클래스는 object 클래스로부터 상속받는다

슈퍼 클래스(Super class)와 서브 클래스(Sub Class)

슈퍼 클래스 : 상속을 해주는 부모 클래스로 상위 클래스 또는 기반 클래스라고 한다.

서브 클래스 : 상속을 받는 자식 클래스로 하위 클래스 또는 파생 클래스라 한다.

 

is-a 관계(상속 관계)

A 클래스가 B클래스를 상속받은 경우 A는 B에 포함되기 때문에 'A는 B이다'라고 표현할 수 있는데, 이러한 관계를 is-a 관계라고 한다.  ex) 택시는 자동차다.

has-a관계(포함 관계)

하나의 클래스 다른 클래스의 멤버를 가지고 이용하는 구조. ex) 자동차는 핸들을 가지고 있다.

포함(객체합성, composite) 관계이다.

 

하위 클래스(sub Class)

하위클래스 작성 형식

특징

  • 자바는 다중 상속을 지원하지 않는다. 즉 2개 이상의 클래스를 상속 받지 못한다.
  • 상위 클래스가 가지고 있는 메소드와 필드를 상속 받는다.
  • 상위 클래스의 생성자 및 초기화 블록은 상속되지 않는다.
  • 상위 클래스의 멤버(필드 또는 메소드)가 private 접근 제어자 인경우 하위클래스는 멤버를 상속받지 못한다.
  • 상위 클래스에 정의한 멤버 변수명과 하위 클래스에 정의한 멤버 변수명이 같으면 상위 클래스 멤버 변수는 무시된다.
  • 이때 상위 클래스의 멤버 변수를접근하기 위해서는 super 키워드를 사용한다.

super 키워드

현재 클래스에서 상속받은 상위 클래스의 객체를 가리키는 키워드이다.

super 키워드는 하위 클래스에서만 사용한다.

하위 클래스의 메소드가 상위 클래스를 재정의(overridden method)한 경우, 하위 클래스에서 상위 클래스의 재정의된 재정의된 메소드를 호출할 때도 super 키워드를 사용한다.

클래스 상속과 생성자

  • Object 클래스를 제외한 모든 클래스의 생성자는 생성자 첫줄에서 this(인수);를 이용하여 자신의 클래스에 정의된 다른 생성자나 super()을 이용하여 상위 클래스의 생성자를 반드시 호출해야한다.
  • 생성자에서 this() 나 super()를 이용하여 다른 생성자를 호출하는 것은 생성자의 선두에서 한번만 가능하다.
  • 생성자에서 같은 클래스의 다른 생성자나 상위 클래스의 생성자를 호출하지 않으면 컴파일러는 자동으로 super()을 추가하여 인자가 없는 상위 클래스의 생성자를 호출한다.
  • 상위 클래스에 인자가 있는 생성자만 존재하는 경우 하위 클래스는 반드시 생성자를 선두에서 super()을 이용하여 해당 상위 클래스 생성자를 호출해야한다.

클래스 참조형 변수의 형 변환

업캐스팅 up - casting

특정 객체가 하위 클래스 형에서 상위의 클래스 형으로 캐스팅되는 것

프로그램 실행시 자동 타입 변환이 일어나므로 묵시적으로 캐스팅이 가능하다.

형식

상위클래스 객체명 = 하위클래스 객체;

안터페이스 객체명 = 구현클래스 객체;

 

다운캐스팅 down casting

상위 클래스의 객체를 하위 클래스의 객체에 대입하는 것으로 업 캐스팅한 것을 다시 원래의 형으로 변환한다.

업캐스팅된 것만 다운 캐스팅시킬 수 있다.

묵시적으로 캐스팅이 불가능하며, 반드시 명시적인 형 변환을 해야한다.

 

하위클래스 객체명 = (하위클래스) 상위클래스 객체;

구현클래스 객체명 = (구현클래스) 인터페이스 객체;

 

instanceof 연산자

주어진 객체가 어떤 클래스 또는 그 클래스가 상속하는 하위 클래스의 인스턴스 인지를 검사하기 위해 사용한다.

연산 결과는 true /false를 리턴한다.

 

객체명 instanceof 클래스명

객체명 instanceof 인터페이스명

 

메소드 오버라이딩

  • 상위 클래스를 상속 받은 하위 클래스에서 상위클래스에 정의된 메소드를 재정의 하는 것
  • 상위 클래스를 메소드 기능을 유지하면 상황에 따라 하위 클래스에서 변형된 기능을 사용할 경우 사용하며 다형성 구현의 핵심 원리이다.
  • 오버라이딩된 상위 클래스의 메소드는 숨겨지는 효과를 가져온다.

특징)

  • 메소드 이름, 리턴 타입, 파라미터 수나 타입이 완전 일치해야한다. (상위클래스와 동일한 시그니처를 가져야 한다)
  • 재정의는 반드시 상속관계가 있어야한다.
  • 재정의된 하위클래스의 메소드 접근 제어자는 상위클래스의 메소드 접근 제어자보다 크거나 같아야 한다.
  • static, final(제정의를 불가능하게 함), private 메소드는 오버라이딩 할 수 없다.
  • 상위 클래스의 메소드가 가지고 있는 기존 예외사항은 제거할 수 있어도 새로운 Exception의 추가는 불가능하다.

@Override 어노테이션

컴파일러에게 오버라이딩 메소드라는 것을 명시해주는 것으로 오버라이딩 원칙에 어긋나는 경우 오류로 알림을 준다.

 

static 수정자

댓글