다라다라V
article thumbnail
Published 2022. 10. 24. 00:27
[JAVA] 09. 클래스 상속 코딩언어/JAVA
728x90
반응형

마트료시카는 각 객체끼리 비슷한 특징을 가집니다. 형태에 맞춰 객체별로 다른 특징을 가질 수도 있습니다.

현실의 상속은 부모의 재산을 자식이 상속받는 것을 의미합니다. 그러나 객체 지향 언어에서의 상속은 부모의 생물학적 특징을 물려받는 유전과 비슷하다고 생각하면 좋습니다. 부모 클래스에서 만들어진 특징을 자식 클래스가 물려받고, 필요에 따라 유지, 수정, 추가할 수 있습니다.

자바의 객체별로 각 클래스를 작성하다 보면 반복되는 부분이 있을 것입니다. 이러한 부분을 효율적으로 동일한 처리할 때 사용하는 클래스 상속의 개념을 배워봅시다. 또한 하위 클래스에서 상속된 상위 클래스를 접근 및 수정하는 방법을 배워봅시다.

📌 클래스 상속의 기본 개념

📚 배경

비슷한 동작을 하는 서로 다른 객체들을 작성하는 방법은 두 가지입니다.

 

 

📃 포괄적인 속성/행위를 갖는 클래스로 구현

  • 지나친 일반화로 서로 다른 객체 간에 구분이 모호하고 조작이 복잡함
  • 모든 개체가 하나의 클래스로 표현될 경우 객체 지향 언어로서 얻을 수 있는 이익이 없어 비효율적임

 

📃 독립적인 클래스로 구현

  • 비슷한 내용의 반복적인 클래스 작성에 효율적
  • 비슷한 행위에 대해 서로 다른 인터페이스 / 행위를 할 수 있음
  • 하나의 배열로 묶을 수 없음

 

두 가지 방법의 장점을 묶어 만든 것상속이라는 기능입니다. 독립적인 클래스를 작성한 것처럼 개별적인 클래스가 정의되어 구분되지만, 반복적인 코드 작성이 최소화되고 비슷한 행위에는 같은 인터페이스를 강제로 적용시킵니다. 

 


📚 클래스 상속의 기본 개념

  • 특정 클래스가 가지는 일부 속성/행위를 다른 새 클래스에게 제공하기 위해 맺는 관계
  • 객체지향의 5가지 특징 중 하나로 클래스 정의시 사용됨
  • 새로운 클래스를 위하여 이미 존재하는 클래스를 사용함
  • 기존의 클래스 멤버를 그대로 이용하되, 새로운 멤버를 추가하거나 수정할 수 있음

📚 상속의 이점 

📃 코드의 재사용

  • 비슷한 동작을 하는 코드 및 클래스를 재작성하지 않고 기존의 클래스 코드를 기반으로 하여 재작성할 수 있음
  • 검증된 코드의 재사용으로 오류를 최소화할 수 있음
  • 소스 코드 관리와 유지 보수가 용이함
  • 개발 시간이 단축됨

 

📃 연관된 일련의 크래스에 대한 공통 규약을 정의

  • 공통 부모로부터 파생된 비슷한 유형의 클래스 객체 간의 동작을 통일
  • 간결성이 제공됨
  • 동작을 통일하는 상속의 주요 이점

📚 상속의 조건: IS-A 관계

상속은 IS-A(~중의 하나) 관계가 성립할 때 상속을 기반으로 표현하기 적절합니다.

 

 

❗ 주의

📃 IS-A 관계

  • ~중의 하나

 

📃 HAS-A 관계 

  • ~을 갖는
  • 주 클래스 멤버 필드에 다른 클래스 객체를 둘 뿐 상속으로 표현하지 않음
  • 두 클래스 간의 연관성이 낮아져 변경 및 확장이 용이함
    EX) "회원 명부" 클래스의 멤버 필드에 "학생" 객체를 둠

📚 JAVA에서 상속의 특징

  • JAVA의 모든 클래스는 상속 관계를 명시하지 않아도 Object 클래스로부터 파생됨
  • JAVA에서는 단일 상속만 제공함
    *  다중 상속이 허용되는 interface 제공으로 보완함
    *  즉 부모 클래스는 한 번만 상속받을 수 있음
  • private 멤버도 상속은 되나 직접적인 참조는 불가능함
    *  상위 클래스에서 제공하는 Access 메서드를 이용하여 접근/이용 가능함
  • 보통 하위 클래스 생성자 첫 줄에서 상위 클래스 생성자를 명시적으로 호출
    *  상위 클래스의 멤버는 상위 클래스의 생성자를 통해 초기화

📚 Super 클래스 VS Sub 클래스

📃 Super 클래스

  • = parent 클래스 = base 클래스
  • 자신의 멤버들을 상속해주는 클라스

 

📃 Sub 클래스

  • = child 클래스 = derived 클래스
  • super 클래스로부터 멤버들을 상속받는 클래스

📚 클래스 상속의 예

  • Person을 상속받아 대학생이나 고등학생과 같은 하위 클래스를 생성할 수 있음
  • 상속받은 부분을 추가적으로 기술할 필요 없음
  • 하위 클래스는 그 클래스만의 특징들을 추가하여 작성할 수 있음
  • UnivStudent 같은 경우 대학생만의 특징인 전공을 멤버로 추가하거나 전공을 보여주는 메서드 추가 

📚 Sub 클래스의 정의

class <subClassName> extends <superClassName> {
     // subClass에 추가될 멤버 선언
}
  • extends : super 클래스의 멤버를 sub 클래스로 상속하라
  • superClassName : 새 클래스에게 상속해줄, 이미 존재하는 클래스 이름
  • subClassName : 상속을 통해 새로 작성될 클래스의 이름

📚 Sub 클래스 객체

  • Sub 클래스의 객체는 super 클래스에서 상속받은 멤버들과 sub 클래스에 추가된 멤버들을 모두 자신의 멤버처럼 사용 가능
  • 단, super 클래스의 private 멤버는 직접 접근 불가
  • super 클래스에서 제공하는 access 메서드 이용하여 간접 접근만 가능
  • 상속받은 일부 멤버는 sub 클래스 객체의 구체화된 속성/행위에 따라 재정의 필요
  • 재정의된 super 클래스 멤버는 은폐됨

📚 protected 접근 지정자

  • default 보다 좀 더 유연한 접근 제공
  • 같은 패키지의 다른 클래스에선 public처럼 자유롭게 접근 가능
  • 다른 패키지의 다른 클래스에선 상속 관계를 가져야만 public처럼 자유롭게 접근 가능

즉, 같은 패키지 내의 클래스와 파생 클래스에선 자유롭게 접근 가능하지만 다른 패키지의 일반 클래스에서만 접근 불가한 접근 지정자입니다.


📚 메서드 오버 라이딩(Over-riding)

  • Sub 클래스에서 super 클래스에서와 같은 이름의 멤버를 다시 정의
  • 기존의 멤버를 요구사항에 맞게 수정하는 효과
  • 반드시 Super 클래스에서와 동일한 형태로 정의해야 함
  • 메서드 오버라이딩시 Super 클래스에서 상속된 멤버는 은폐됨
  • Sub 클래스 객체의 메서드에서 은폐된 멤버에 접근하기 위해 super 참조 변수 이용

📚 오버라이딩 vs 오버로딩

오버로딩과 오버라이딩은 이름은 비슷하지만 전혀 다른 기능을 함


📚 this와 super

📃 this

  • 특정 객체 내에서 객체 자신을 의미하는 참조 변수
  • 상속받은 상위 클래스 멤버도 접근 가능
  • 매개변수가 멤버 필드 이름과 같은 경우 사용

📃 super

  • 현재 객체의 한 단계 바로 위의 상위 클래스를 의미하는 참조 변수
  • 메서드 오버라이딩으로 은폐된 상위 클래스의 메서드 호출 시 사용
  • 은폐된 super 클래스 멤버를 명시적으로 참조 시에 사용

📚 java.lang.Object

  • 특별히 상속관계를 명시하지 않았을 때 기본적으로 Object로부터 상속됨
  • boolean equals(Object obj), String toString() 등은 재정의하면 좋음

 

 

반응형

'코딩언어 > JAVA' 카테고리의 다른 글

[JAVA] 11 추상 클래스와 인터페이스  (0) 2022.11.03
[JAVA] 10. 상속과 다형성  (0) 2022.10.30
[JAVA] 08. 배열  (0) 2022.10.22
[JAVA] 07-2 자바 기본 API  (0) 2022.10.20
[JAVA] 07-1 자바의 패키지와 모듈  (0) 2022.10.18
profile

다라다라V

@DaraDaraV

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!