Chap 04. 상속과 다형성

    1. 상속

    상속의 개념

    • 상속은 다른 클래스 간의 관계를 설정하고 계층적 순서로 정보를 관리하며 코드를 재사용하기 위함
    • 새로운 클래스를 만들 때, 원하는 코드 중 일부가 포함된 클래스가 이미 있는 경우 기존 클래스에서 새 클래스를 파생(상속) 시킬 수 있음.
    • 이렇게 함으로써 기존 클래스의 멤버 변수와 메서드를 재사용할 수 있음.

     

    • 부모 클래스 = 슈퍼 클래스, 기본 클래스
      • 다른 클래스에 멤버 요소(메서드와 변수)를 상속하는 클래스로 상위 클래스

     

    • 자식 클래스 = 서브 클래스, 파생 클래스
      • 다른 클래스의 멤버 요소를 상속받은 클래스로 하위 클래스
      • 자식 클래스는 부모 클래스의 모든 멤버 요소를 소유할 뿐만 아니라 그 밖에도 고유한 멤버 메서드와 변수를 추가할 수 있음.

    부모 클래스와 자식 클래스의 관계

     

     

     

    상속의 필요성

    • 상속: 기존 클래스의 기능을 사용하여 새 클래스를 만드는 기술
    • 한 클래스가 다른 클래스의 특징(멤버 메서드와 변수)을 가져오도록 하는 자바 객체지향 프로그래밍의 필수적인 부분임.
    • 클래스 간의 관계를 더 잘 이해할 수 있고 프로그램 구조를 더욱 조직화할 수 있기 때문에 코드의 가독성과 해석 가능성이 향상됨
    • 응용 프로그램의 유지, 관리에 유용함

     

    상속의 단점

    : 두 클래스(부모/자식)가 밀접하게 결합 → 서로 독립적일 수 없음.

     

     

    단일 상속

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

    클래스 간의 단일 상속

     

     

     

     

     

     

     

     

     


    2. 상속의 유형 (this 사용)

    ⭐ this 사용

    : 상속받은 자식 클래스 자신을 가리키는 레퍼런스 변수

    • 자식클래스의 인스턴스가 생성될 때 자동으로 생성
    public class Car{
    	String modelName;
        int modelYear;
    	
        public Car(String modelName, int modelYear) {
        	this.modelName = modelName;
            this.modelYear = modelYear; 
     	}  
     }

     

     

     

     

    ⭐ this vs this( ) 비교

    this this()
    객체 자신을 나타내는 변수,
    자신의 객체에 접근할 때 사용
    같은 클래스에서 생성자가 다른 생성자를 호출할 때 사용
    주로 멤버변수와 매개변수의 이름이 동일할 때 이를 구분하기 위해 사용 주로 코드의 중복을 줄일 목적
    (생성자 코드에서만 사용할 수 있음)

    this() : 생성자 Chain에서만 사용
    this() : 사용시 첫번째 문장으로 다른 코드부다 가장 윗줄에 위치
    static 메서드에서 사용할 수 없음

     

     

     

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

    : 자바의 상속에서 자식 클래스가 부모 클래스로부터 상속을 받으면 자식 클래스는 부모 클래스를 참조하기 위해 super 키워드를 사용

    super 키워드를 이용하여 부모 클래스의 멤버 요소에 접근

     

     

     

     

     

     

     

    ⭐ super를 이용한 부모 클래스의 생성자 접근

    • super( )는 부모 클래스의 생성자를 호출
    • 자식 클래스의 생성자 첫 행에 이 명령어(super())가 있어야 함.
    • 자식 클래스의 생성자가 부모 클래스의 생성자를 명시적으로 호출하지 않으면 자바 컴파일러는 부모 클래스의 매개변수가 없는 생성자(기본 생성자)를 자동으로 호출
    • 이때 부모 클래스에 매개변수가 없는 생성자가 존재하지 않으면 컴파일타임 오류가 발생함.

    super()를 이용하여 부모 클래스의 생성자에 접근하기

     

     

     

     

     

     

     

     

     


    3. 다형성

    다형성의 필요성

    • 하나의 객체가 여러 가지 유형을 띠는 것을 다형성이라고 함
    • 다형성을 통해 상속과 메서드 재정의를 활용함
    • 부모 클래스의 참조 변수로 자식 클래스의 객체에 접근함
    • 상위 클래스에서는 공통적인 부분을 제공하고 하위 클래스에서는 각 클래스에 맞는 기능을 구현할 수 있음.

     

     

    프로그래밍에 다형성을 적용 시 장점

    • 단일 메서드를 다른 클래스에서 다르게 작동할 수 있음
    • 동일한 구현에 대해 다른 메서드명을 선언할 필요가 없음
    • 상속을 더 쉽게 구현할 수 있음.

     

     

    다형성을 적용 시 단점

    • 다형성은 구현하기 어려운 개념
    • 프로그램의 가독성이 떨어질 수 있음
    • 런타임 다형성(오버라이딩)의 경우 컴파일러가 실행 중에 메서드의 반환 유형이 결정되므려 시스템 성능을 저하

     

     

    ⭐ 다형성의 유형

    다형성의 유형

     

    • 컴파일타임 다형성(오버 로딩)
      • 컴파일타임 다형성은 정적 다형성으로, 이러한 유형의 다형성은 연산자 오버로딩과 메서드 오버로딩으로 구현함메서드명이 같지만 다른 매개변수를 사용하는 프로세스
      • 메서드는 인수의 개수나 유형을 변경함으로써 오버로딩될 수 있으며, 컴파일러는 프로그램을 컴파일하는 동안 호출할 메서드를 결정
      • 메서드 오버로딩은 공간 효율적이고, 메서드명이 동일하여 이해하기 쉽기 때문에 프로그램 디버깅이 더 수월함
    • 런타임 다형성(오버 라이딩)
      • 동적 메서드로 재정의된 메서드에 대한 메서드 호출이 런타임에 해결되는 프로세스로, 이러한 유형의 다형성은 메서드 오버라이딩으로 구현함.
      • 부모 클래스로부터 상속받은 메서드를 자식 클래스에서 특정한 형태로 재정의
        • 자식 클래스가 부모 클래스로부터 같은 이름, 개수와 유형이 같은 인수, 같은 메서드 반환형을 가진 메서드를 상속받아서 구현하기 때문에 메서드 재정의라고도
      • 프로그램 실행 중에 호출할 메서드를 결정하는 메서드 오버라이딩은 동일한 기능을 구현한 자식 클래스에서 동일한 메서드를 사용함으로써 코드의 복잡성을 줄이고 일관성을 향상

     

    'Java' 카테고리의 다른 글

    Chap 05. 추상 클래스와 인터페이스 심화  (0) 2024.04.22
    Chap 03. 클래스/객체  (0) 2024.04.22
    Chap 02. 배열과 문자열  (1) 2024.04.20
    Chap 01. 객체지향 프로그래밍  (0) 2024.04.20
    JAVA 배열의 기초와 다차원 배열  (0) 2024.01.14

    댓글