CH7. 상속 (1)

a.rubz·2023년 1월 9일
0

이것이 자바다

목록 보기
9/15
post-thumbnail
post-custom-banner

📝 정리

7.1 상속 개념

📌 상속 (Inheritance)

  • 부모가 자식에게 물려주는 행위

  • 부모 클래스의 필드와 메소드를 자식 클래스에게 물려줌

  • 부모 클래스 수정 -> 모든 자식 클래스 수정

  • 중복되는 코드를 줄이고 개발 시간을 단축



7.2 클래스 상속

📌 클래스 상속 방법

  • extends 부모클래스

  • 다중 상속 허용 X -> extends 뒤에 단 하나의 부모 클래스만 가능 (extends 부모1, 부모2 불가능)

public class 자식클래스 extends 부모클래스 {
   ...
}


7.3 부모 생성자 호출

📌 super()

  • 부모 객체가 먼저 생성된 후에 자식 객체 생성

  • 자식 생성자 내부 맨 첫 줄에 숨겨진 super()가 부모 생성자 호출

  • 컴파일 과정에서 자동 추가

  • 부모 클래스에 기본 생성자가 없으면 자식 생성자 선언에서 컴파일 에러

//자식 생성자 선언
public 자식클래스(...) {
    super(); //생략되어있음
    ...
}

//자식 객체 생성
자식클래스 변수 = new 자식클래스(); //자식 생성자 호출 -> 내부의 super()로 부모 생성자 호출

📌 매개변수가 있는 생성자 super()

  • 부모 클래스에 기본 생성자가 없고 매개변수를 갖는 생성자만 있을 경우 코드를 직접 넣어야함
//자식 생성자 선언
public 자식클래스(...) {
    super(매개값, ...); //생략 불가, 직접 추가하기
}


7.4 메소드 재정의

📌 메소드 오버라이딩 (Method Overriding)

  • 상속된 메소드를 자식 클래스에서 재정의하는 것

  • 부모 메소드는 숨겨지고, 자식 메소드 우선적 사용


📌 메소드 오버라이딩 규칙

  • 부모 메소드의 선언부(리턴 타입, 메소드 이름, 매개변수)와 동일해야 함

  • 접근 제한을 더 강하게 오버라이딩할 수 없음 (public -> private 변경 불가)

  • 새로운 예외를 thorws 할 수 없음


📌 @Override

  • 컴파일 시, 정확히 오버라이딩이 되었는지 체크해 줌

  • 문제가 있을 시, 컴파일 에러

  • 생략 가능

public class Computer extends Calculator {
    //메소드 오버라이딩
    @Override
    public double areaCircle(double r) {
        System.out.println("Computer의 areaCircle() 실행");
        return Math.PI * r * r;
    }
}

📌 공동 작업 처리 기법

  • 메소드 재정의 시, 일부만 변경한다고 해도 중복된 내용을 자식 메소드도 가지고 있어야 함

  • 자식 메소드 내에서 부모 메소드를 호출하여 해결 => 공동 작업 처리 기법

  • super 키워드와 도트(.) 연산자 사용

  • 부모 메소드 재사용으로 자식 메소드의 중복 작업 내용 없앰

class Parent {
 public void method() {
     ...
 }   
}

class Child extends Parent {
    @Override
    void method() {
        super.method(); //위치는 로직에 따라 적절하게 넣으면 됨
        ...
    }
}


7.5 final 클래스와 final 메소드

📌 final 클래스

  • 최종적인 클래스 -> 더 이상 상속할 수 없는 클래스

  • 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없음


📌 final 메소드

  • 최종적인 메소드 -> 오버라이딩 할 수 없는 메소드

  • 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의 불가



7.6 protected 접근 제한자

📌 protected

  • (접근 제한 강화) private << default << protected << public (접근 제한 약화)

  • 제한 대상 : 필드, 생성자, 메소드

  • 제한 범위 : 같은 패키지이거나, 자식 객체만 사용 가능

  • 다른 패키지의 자식 객체의 경우, new 연산자로 부모 객체 직접 호출 불가

  • 대신, 자식 생성자에서 super()로 생성자 호출

//protect 필드, 생성자, 메소드를 가진 부모 클래스
package package1;

public class A {
    protected String field;
    
    protected A() {
        ...
    }
    
    protected void method() {
        ...
    }
}
//protected 부모 클래스와 다른 패키지에 있는 자식 클래스
package package2;

import package1.A;

public class B extends A {
    //생성자 선언
    public B() {
        //A 생성자 호출 가능
        super();
    }
    
    //메소드 선언
    public void method1() {
        //A 필드값 변경
        this.field = "value";
        //A 메소드 호출
        this.method();
    }
    
    //new로 직접 호출 불가
    /*
    public void method2() {
        A a = new A();
        a.field = "value";
        a.method();
    }
    */
}


💡 스터디

  1. 리스코프 치환 원칙(lsp)
    오버라이딩은 SOLID에 위배됨
    자식 클래스가 부모 클래스 인스턴스 행위를 일관성 있게 실행할 수 없기 때문
    SOLID 원칙에 의해 오버라이딩을 지양 => 추가 공부 필요!
profile
🔥 개발 공부 🔥
post-custom-banner

0개의 댓글