JAVA - 상속(Inheritance)

이재원·2024년 10월 17일
0

JAVA

목록 보기
6/7
post-custom-banner

클래스 상속과 객체

상속의 이점

특정 클래스가 가지는 일부 속성/행위를 다른 새 클래스에게 제공하는 것으로, 상속을 사용하게 되면 다음과 같은 이점이 생긴다.

  • 클래스의 간결화 - 멤버의 중복 작성 불필요
  • 클래스 관리 용이 - 클래스들의 계층적 분류
  • 소프트웨어의 생산성 향상 - 클래스 재사용과 확장 용이
  • 공통 규약 정의 - 비슷한 유형의 클래스 객체 간의 동작을 통일시킴

상속 선언

자바에서는 부모 클래스를 슈퍼 클래스(super class)라고 부르고, 자식 클래스는 서브 클래스(sub class)라고 부른다. 그리고 상속 키워드로는 extends를 사용해 주면 된다.

class Porint { ... }

class ColorPoint extends Point { ... }

상속시 주의할 점

상속을 할 때 주의할 점은 아무 클래스는 상속하는 것이 아닌 연관된 클래스를 상속 받아야 한다. 그 기준으로 IS-A관계로, 상속을 고려하는 클래스가 ~중의 하나인 경우 적절한 상속 관계로 표현될 수 있다.

이런 기중 속에서도 헷갈리는 관계가 있는데 HAS-A 관계읻.이는 “~을 갖는”관계로 두 클래스 간 연관성이 있어 보이지만 실제로는 별로 연관성이 없다. 예를 들어 회원 명부 안에 학생 정보가 포함된 경우 회원 명부와 학생 정보가 연관되어 보이지만 사실은 독립적인 객체이다. 학생이 아닌 회원을 포함시키기 어렵기 때문이다.

자바 상속의 특징

  • 자바의 모든 클래스는 java.lang.Object 클래스로부터 파생되었다.
    (Object 클래스는 모든 클래스의 부모 클래스로 자동으로 상속됨)
  • 자바에서는 단일 상속만 제공한다.(이를 보완하기 위해 interface 제공)
  • private 멤버도 상속이 되나 하위 클래스는 직접 참조 불가능하다.(Access 메서드로 접근)
  • 보통 하위 클래스의 생성자 첫 출에서 상위 클래스의 생성자를 명시적으로 호출
    즉, 상위 클래스의 멤버는 상위 클래스의 생성자를 통해 초기화 한다.
  • 상속받은 일부 멤버는 재정의(오버라이딩) 가능하다.
    실행시 항상 오버라이딩된 멤버만 실행되고, super 클래스의 멤버는 은폐된다.

접근지정자

private 접근지정자

어디서도 접근 불가능

default 접근지정자

같은 패키지에 있는 모든 클래스에서 접근 가능하다. 하지만 상속 관계인 클래스여도 패키지가 다르면 접근 불가능하다.

public 접근지정자

상속과 패키지 여부 상관없이 어디서든지 접근 가능하다.

protected 접근지정자

같은 패키지의 다른 클래스에서는 public처럼 자유롭게 접근 가능하다. 다른 패키지에서는 상속 관계라면 자유롭게 접근 가능하지만, 상속 관계가 아니라면 private처럼 접근 가능하다.

즉, 같은 패키지인 클래스 + 상속 관계인 클래스 만 접근 가능한 것이다.

상속과 생성자

서브 클래스 객체가 생성될 때 슈퍼 클래스의 생성자도 함께 실행된다. 서브 클래스 안에 슈퍼 클래스의 생성자도 포함되어 있기 때문이다. 그리고 이들은 서로가 필요한 초기화 작업을 독립적으로 수행한다.

생성자의 호출 순서로는 부모 생성자가 먼저 실행된 후 서브 클래스의 생성자가 실행된다.

이 경우는 명시적인 부모 생성자의 호출이 없었기에 자동으로 호출되었다. 만약 명시적으로 부모 클래스를 호출하고 싶다면 super()를 이용하면 된다.

super() 사용시 주의할 점은 무조건 서브 클래스의 생성자 첫 줄에서 실행되어야 한다는 점이다.
또한 클래스의 접근지정자가 public인 경우 생성자도 public으로 선언해 줘야 오류 없이 접근 가능하다.

this와 super

this

  • 특정 객체 내에서 객체 자신을 의미하는 참조 변수
  • 생성자 오버로딩시 사용(반드시 기존 생성자의 첫 행에 위치)
    public class A {
    	public A(int a) { ... }
    	public A() { this(a) }
    }
  • 상속받은 상위 클래스 멤버도 접근 가능(상위 클래스에서 private로 선언된 멤버 제외)
  • 매개변수가 멤버필드 이름과 같은 경우 사용

super

  • 현재 객체의 한 단계 바로 위의 상위 클래스를 의미
  • 서브 클래스에서 부모 생성자 명시적 호출시 사용
  • 메서드 오버라이딩으로 은폐된 상위 클래스의 메서드 호출시 사용

출처
명품 JAVA programming - 황기태, 김효수
https://www.youtube.com/사람만이

profile
20학번 새내기^^(였음..)
post-custom-banner

0개의 댓글