Java Study

상속(Inheritance)이란?

Z00_HWAN_99 2024. 6. 28. 10:40
728x90
반응형

상속

  •  상속이란?
    1. 상속은 다른 클래스 간의 관계를 설정하고 계층적 순서(is-a관계)로 정보를 관리하며 코드를 재상요하는 데 도움됨.
    2. 새로운 클래스를 만들 때, 원하는 코드 중 일부가 포함된 클래스가 이미 있는 경우, 기존 클래스에서 새 클래스를 파생(상속) 시킬 수 이있음.
    3. 기존 클래스의 멤버 변수와 메서드를 재사용할 수 있음.
  • 상속의 필요성
    1. 한 클래스가 다른 클래스의 특징(멤버 메서드와 변수)을 가져오도록 하는 자바 객체지향 프로그래밍의 필수적인 부분, 클래스 간의 관계를 더 잘 이해할 수 있음.
    2. 프로그램 구조를 더욱 조직화할 수 있기 때문에 코드의 가독성과 해석 가능성이 향상됨.
    3. 응용 프로그램의 유지 및 관리에 유용함.

클래스 상속

  • 부모 클래스의 필드와 메소드를 자식 클래스에게 물려줄 수 있음.
  • 부모 클래스 = 슈퍼 클래스, 기본 클래스
    • 다른 클래스에 멤버 요소(메서드와 변수)를 상속하는 클래스로 상위 클래스
  • 자식 클래스 = 서브 클래스, 파생 클래스
    • 다른 클래스의 멤버 요소를 상속받은 클래스로 하위 클래스
    • 자식 클래스는 부모 클래스의 모든 멤버 요소를 소유.
    • 고유한 멤버 메서드와 변수 추가 가능.
  • 자식 클래스를 선언할 때 어떤 부모로부터 상속 받을 것인지를 결정하고, 부모 클래스를 다음과 같이 extends 뒤에 기술.
public class 자식클래스 extends 부모 클래스 {
}
  • 다중 상속 허용하지 않음. extends 뒤에 하나의 부모 클래스만 상속

IS-A 관계

  • "~는 ~이다"라는 의미
  • 부모 자식 관계
  • extends, implements 키워드로 구현함.
  • 모든 클래스는 java,lang.Object의 하위 클래스임.

단일 상속

  • 클래스가 하나의 클래스에 의해서만 확장되는 것으로, 단일 수준 상속이라고도 함.
  • 단일 부모 클래스에서 자식 클래스 만들기 때문에 기본 클래스(부모 클래스)와 파생 클래스(자식 클래스)가 각각 하나뿐임.
  • 자식 클래스는 단일 클래스로부터만 속성과 행동을 상속 받고 부모 클래스의 모든 메서드와 변수에 접근할 수 있음.

다단계 상속

  • 클래스가 하나의 클래스에 상속하고, 상속받은 자식 클래스가 또 다른 클래스에 상속하는 것을 말함.
  • Ex) 손주는 아버지로부터 상속받고, 아버지는 할아버지로부터 상속받음.

계층적 상속

  • 단일 부모 클래스의 값과 메서드를 여러 자식 클래스에 전달하는 것.
  • 한 클래스가 부모 클래스로 사용되고 나머지 클래스는 자식 클래스가 됨.

부모 생성자 호출

  • 자식 객체를 생성하면 부모 객체가 먼저 생성된 다음에 자식 객체가 생성.
  • 부모 생성자는 자식 생성자의 맨 첫 줄에 숨겨져 있는 super()에 의해 호출.

super를 이용한 부모 클래스 참조

  • 자바의 상속에서 자식 클래스가 부모 클래스로부터 상속을 받으면 자식 클래스는 부모 클래스를 참조하기 위해 super 키워드를 사용.
  • super를 이용한 변수와 메서드 접근.
  • super는 부모 클래스의 멤버 요소인 변수와 메서드에 접근할 수 있는 명령어
  • 자식 클래스의 메서드에서 호출하여 부모 클래스의 변수나 메서드에 접근.
  • super()를 이용한 생성자 접근
    1. super()는 부모 클래스의 생성자를 호출하는 명령어
    2. 자식 클래스의 생성자 첫 행에 이 명령어가 있어야 한다.
    3. 자식 클래스의 생성자가 부모 클래스의 생성자를 명시적으로 호출하지 않으면 자바 컴파일러는 부모 클래스의 매개변수가 없는 생성자를 자동 호출한다.
    4. 이때 부모 클래스에 매개변수가 없는 생성자가 존재하지 않으면 컴파일 타임 오류가 발생..!!

메소드 오버라이딩

  • 상속된 메소드를 자식 클래스에서 재정의하는 것. 해당 부모 메소드는 숨겨지고, 자식 메소드가 우선적으로 사용
  • 부모 메소드의 선언부(리턴 타입, 메소드 이름, 매개변수)와 동일해야 함.
  • 접근 제한을 더 강하게 오버라이딩할 수 없음(public -> private으로 변경 불가)
  • 새로운 예외를 throws 할 수 없음.

부모 메소드 호출

  • 자식 메소드 내에서 super 키워드와 도트(.)연산자를 사용하면 수겨진 부모 메소드를 호출.
  • 부모 메소드를 재사용함으로써 자식 메소드의 중복 작업 내용을 없애는 효과.

Final

  • final 클래스
    • final 클래스는 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없음.
  • final 메소드
    • 메소드를 선언할 때 final 키워드를 붙이면 오버라이딩할 수 없음.
    • 부모 클래스를 상속해서 자식 클래스를 선언할 때, 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의할 수 없음.

protected 접근 제한자

  • protected는 상속과 관련이 있고, public과 default의 중간쯤에 해당하는 접근 제한.
  • protected는 같은 패키지에서는 default처럼 접근이 가능하나, 다른 패키지에서는 자식 클래스만 접근을 허용.

자동 타입 변환

  • 자동적으로 타입 변환이 일어나는 것.(부모 타입 변수 = 자식 타입 객체)
  • 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급.

강제 타입 변환

  • 부모 타입은 자식 타입으로 자동 변환되지 않음. 대신 캐스팅 연산자로 강제 타입 변환 가능.
  • 자식 객체가 부모 타입으로 자동 변환하면 부모 타입에 선언된 필드와 메소드만 사용 가능.

다형성

  • 사용 방법은 동일하지만 실행 결과가 다양하게 나오는 성질.
  • 다형성을 구현하기 위해서는 자동 타입 변화과 메소드 재정의가 필요.
  • 필드 다형성
    • 필드 타입은 동일하지만, 대입되는 객체가 달라져서 실행 결과가 다양하게 나올수 있는 것.
  • 매개 변수 다형성
    • 메소드가 클래스 타입의 매개변수를 가지고 있을 경우, 호출할 때 동일한 타입의 자식 객체를 제공할 수 있음.
    • 어떤 자식 객체가 제공되느냐에 다라서 메소드의 실행 결과가 달라짐.

instanceOf 연산자

  • 매개변수가 아니더라도 변수가 참조하는 객체의 타입을 확인할 때 instanceOf 연산자를 사용.
  • instanceOf 연산자에서 좌항의 객체가 우항의 타입이면 true를 산출하고 그렇지 않으면 false를 산출.
  • Java12부터는 instanceOf 연산의 결과가 true일 경우 우측 타입 변수를 사용할 수 있기 대문에 강제 타입 변환이 필요없음.

추상 클래스

  • 객체를 생성할 수 있는 실체 클래스들의 공통적인 필드나 메소드를 추출해서 선언한 클래스.
  • 추상 클래스는 실체 클래스의 부모 역할. 공통적인 필드나 메소드를 물려받을 수 있음.
  • 추상 클래스 선언
    • 클래스 선언에 abstract 키워드를 붙임.
    • new 연산자를 이용해서 객체를 직접 만들지 못하고 상속을 통해 자식 클래스만 만들수 있음.
  • 추상 메소드와 재정의
    • 자식 클래스들이 가지고 있는 공통 메소드를 뽑아내어 추상 클래스로 작성할 때, 메소드 선언부만 동일하고 실행 내용은 자식 클래스마다 달라야 하는 경우 추상 메소드를 선언할 수 있음.
    • 일반 메소드 선언과의 차이점은 abstract 키워드가 붙고, 메소드 실행 내용인 중괄호{}가 없다.

 

수직적 구조와 수평적 구조의 설계 방법

Q. 어떤 데이터를 담아야 하는데 나에게 바구니가 없다면 다른 사람이 가지고 있는 바구니를 사용하면 된다. 그런데 나와 다른 사람은 아무런 관계가 없기 때문에 다른 사람의 바구니를 사용하지 못한다. 하지만 나의 부모를 생각해보자. 부모에게 바구니가 있으면, 자식은 부모의 바구니를 사용할 수 있다.(허락해주면 = 상속해주면)

-->> 자식과 부모는 상속 관계이기 때문에 자식은 부모의 것을 얼마든지 사용 가능하다.(컨셉)

-->> 상속이란, 부모가 자식들에게 자신의 것을 사용하라고 허락해주는 것.

 

Q.상속에 대해 클래스 설계를 수평적 구조로 한다면?

-->> 객체를 설계하다 보면 비슷한 클래스의 경우 중복적인 경우가 발생.

-->> 객체를 수평적인 구조로 설계하면 "단점"

  1. 코드의 중복이 발생.
  2. 새로운 요구사항이 발생시 반영이 어렵다.(유지보수가 어렵다.)
  3. 확장성이 떨어진다.

Q.상속에 대해 클래스 설계를 수직적 구조로 한다면?

-->> 수직적구조 = 계층화 = 상속(Inheritance) = 클래스와 클래스의 관계 설계

-->> 코드의 중복을 최소화.

-->> 유지보수와 확장의 용이성 극대화

 

https://github.com/bottomsUp-99?tab=repositories

 

bottomsUp-99 - Overview

Backend Developer. bottomsUp-99 has 10 repositories available. Follow their code on GitHub.

github.com

 

728x90
반응형

'Java Study' 카테고리의 다른 글

추상화  (3) 2024.07.01
@Override가 있고 없고의 차이  (2) 2024.06.30
참조 타입이란?  (2) 2024.06.21
객체지향 프로그래밍에 대해서...  (0) 2024.06.21
메서드 오버로딩(Method Overloading)이란?  (0) 2024.06.20