상속(Inheritance)

김민혁·2022년 1월 20일
0

상속

  • 객체의 연결을 위해서
  • 기존 클래스의 자산(멤버)을 자식 클래스에서 재사용하기 위한 것
    • 부모의 생성자와 초기화 블록은 상속하지 않는다.
  • 기존 클래스의 멤버를 물려 받기 때문에 코드의 절감(공통단)
    • 부모의 코드를 변경하면 모든 자식들에게도 적용->유지 보수성 향상
  • 상속의 적용
    • extends 키워드 사용
  public class SpiderMan extends Person{
  	boolean isSpider;
    void fireWeb(){}
    }

Person: 조상 클래스 - 부모 클래스 - 상위 클래스 - 슈퍼 클래스
SpiderMan: 자식 클래스 - 자손 클래스 - 하위 클래스 - 서브 클래스

Object 클래스

  • 모든 클래스의 조상 클래스
    • Object의 멤버는 모든 클래스의 멤버
    • 별도의 extends 선언이 없는 클래스들은 extends Object가 생략됨
    • 따라서 모든 클래스에는 Object 클래스에 정의된 메서드가 있음
  • Object 중요 메서드
    • hashCode()
    • equals()
    • toString()
    • ...

상속 관계

  • 상속의 관계는 is a 관계라고 함
    • Person is a Object, SpiderMan is a Person

단일 상속(Single Inheritance)

  • 다중 상속의 경우 여러 클래스의 기능을 물려받을 수 있으나 관계가 매우 복잡해짐
    • 동일한 이름의 메서드가 두 부모에게 있다면 자식은 어떤 메서드를 쓸 것인가?
  • 자바는 단일 상속만 지원
    • 대신 interface와 포함 관계(has a)로 단점 극복

포함 관계

  • 상속 이외에 클래스를 재활용 하는 방법
    • 2개 이상의 클래스에서 특성을 가져올 때 하나는 상속, 나머지는 멤버 변수로 처리
public class SpiderMan extends Person{
	Spider spider;
    boolean isSpider;
    
    void fireWeb(){
    	if(isSpider){
        	spider.fireWeb();
        }else{
        	System.out.println("Person은 거미줄 발사 불가");
        }
}
  • 포함 관계의 UML 표현 : 실선
  • Spider의 코드를 수정하면 SpiderMan에도 반영되므로 유지 보수성 확보
  • 어떤 클래스를 상속 받고 어떤 클래스를 포함해야 하는가?
    • 문법적인 문제는 아니며 프로젝트의 관점 문제
    • 상속: is a 관계가 성립하는가?
    • 포함: has a 관계가 성립하는가?

super 키워드

  • this를 통해 멤버에 접근했듯이 super를 통해 조상 클래스 멤버 접근
    • super.을 이용해 부모의 메서드 호출로 부모의 코드 재사용
  • super키워드는 가까운 조상부터 찾는다.
  • 자신의 조상 클래스에 없다면 조상의 조상 클래스에서 찾는다.
  • 변수의 scope
    • 사용된 위치에서 점점 확장해가며 처음 만난 선언부에 연결됨
    • method 내부 -> 해당 클래스 멤버 변수 -> 조상 클래스 멤버 변수
    • 하지만 this는 해당 클레스의 멤버에 먼저 접근하고 super는 부모 클래스의 멤버에 먼저 접근한다.
  • this()가 해당 클래스의 다른 생성자를 호출하듯 super()는 조상 클래스의 생성자 호출
    • 조상 클래스에 선언된 멤버들은 조상 클래스의 생성자에서 초기화가 이뤄지므로 이를 재활용
    • 자식 클래스에 선언된 멤버들만 자식 클래스 생성자에서 초기화
  • super()는 자식 클래스 생성자의 맨 첫 줄에서만 호출 가능
    • 즉 생성자의 첫 줄에만 this() 또는 super()가 올 수 있다.(같이 쓸 수 없음)
  • 명시적으로 this() 또는 super()를 호출하지 않는 경우 컴파일러가 super()삽입
    • 결론적으로 맨 상위의 Object까지 객체가 다 만들어지는 구조
profile
학생

0개의 댓글