코이_CO2
LIVING IS DYING
코이_CO2
전체 방문자
오늘
어제
  • 분류 전체보기 (45)
    • TIL ⚓️ (4)
      • OT주차 (1)
      • 1주차_풀스택 미니 프로젝트 (0)
      • 1주차_언어 기초(Java) (0)
      • 2주차_프로그래밍 기초 (1)
      • 3주차_주특기 입문(Spring) (0)
      • 4주차_주특기 숙련(Spring) (2)
    • WIL ⚓️ (0)
      • OT주차 (0)
      • 1주차_언어 기초(Java) (0)
      • 2주차_프로그래밍 기초 (0)
      • 3주차_주특기 입문(Spring) (0)
      • 4주차_주특기 숙련(Spring) (0)
    • Java의 정석 📖 (4)
      • Chapter 1. 자바를 시작하기 전에 (3)
      • Chapter 2. 변수 (0)
      • Chapter 3. 연산자 (0)
      • Chapter 4. 조건문과 반복문 (1)
    • Programmers (7)
      • Lv. 1 (7)
    • 혼자 공부하는 자바 📖 (8)
      • Chapter 05 참조 타입 (0)
      • Chapter 06 클래스 (3)
      • Chapter 07 상속 (1)
      • Chapter 08 인터페이스 (1)
      • Chapter 09 중첩 클래스 & 인터페이스 (0)
      • Chapter 10 예외 처리 (1)
      • Chapter 12 스레드 (1)
    • Java (2)
    • Spring (1)
    • Python (2)
    • Mysql (4)
    • Machine Learning (6)
      • 추측 통계 (2)
    • Data Analysis (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • spring
  • 혼자공부하는자바
  • 게시판 프로젝트
  • DTO
  • TIL
  • CRUD
  • PYTHON
  • java
  • 웹개발 종합반
  • 하루기록
  • 개발일지
  • 코딩
  • 항해99
  • jwt
  • 스터디
  • 프로그래머스
  • 주특기 심화주차
  • HTML
  • programmers
  • TIL/WIL
  • LV1
  • 혼자 공부하는 자바
  • 배열
  • 파이썬
  • 스프링
  • Spring Security
  • 부트스트랩
  • 개발자
  • 자바
  • sql

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
코이_CO2

LIVING IS DYING

Chapter 07-1. 상속
혼자 공부하는 자바 📖/Chapter 07 상속

Chapter 07-1. 상속

2022. 12. 5. 21:32

상속

자식이 부모가 물려준 것을 자연스럽게 이용하는 것처럼

프로그래밍에서도 이미 잘 개발된 클래스를 재사용해서 새로운 클래스를 만들기 때문에

중복되는 코드를 줄여줄 수 있고,

부모 클래스(상위 클래스)의 수정으로 모든 자식 클래스(하위 또는 파생 클래스)들도 수정되는 효과가 있어

유지 보수 시간을 최소할 수 있다

 

클래스 상속

자식 클래스를 선언할 때 어떤 부모 클래스를 상속받을 것인지 결정하고, 선택된 부모 클래스는 extends 뒤에 기술

class 자식클래스 extends 부모클래스 {
 // 필드
 // 생성자
 // 메소드
 }

특징

  • 다중 상속 허용 X : extends 뒤에 오는 부모 클래스는 여러 개일 수 없고 단 하나만 올 수 있다
  • 접근 제한자에 따른 상속 제외
    • 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속에서 제외
    • 다른 패키지에 존재한다면 default 접근 제한을 갖는 필드와 메소드도 상속 대상에서 제외

부모 생성자 호출

  • 자식 객체를 생성하면 부모 객체가 먼저 생성되고 그 다음에 자식 객체가 생성된다
  • 모든 객체는 클래스의 생성자를 호출해야만 생성되며 부모 생성자는 자식 생성자의 맨 첫 줄에서 호출됨
  • 생성자가 명시적으로 선언되지 않았다면 컴파일러는 기본 생성자 super() 생성
  • super()는 부모의 기본 생성자를 호출
  • 직접 자식 생성자를 선언하고 명시적으로 부모 생성자를 호출하고 싶은 경우 아래와 같이 작성
자식 클래스(매개변수선언, ... ) {
  super( 매개값, ... );
  ...
}
  • super(매개값, ... ) 는 매개값의 타입과 일치하는 부모 생성자를 호출, 일치하는 부모 생성자 없을 경우 컴파일 에러 발생
  • super(매개값, ... ) 생략 시 컴파일러에 의해 super()가 자동적으로 추가되기 때문에 부모의 기본 생성자가 존재해야 함
  • super(매개값, ... ) 는 반드시 자식 생성자 첫 줄에 위치해야 한다
// 부모 클래스
public class People {
    public String name;
    public String ssn;

    public People(String name, String ssn) {
        this.name = name;
        this.ssn = ssn;
    }
}
// 자식 클래스
// 명시적 호출
public class Student extends People {
    public int studentNo;

    public Student(String name, String ssn, int studentNo) {  // 매개변수로 받아서 name과 ssn은 매개값으로 넘겨줌
        super(name, ssn);  // 부모 생성자 호출
        this.studentNo = studentNo;
    }

}

 

메소드 재정의

상속된 일부 메소드가 자식 클래스의 사용에 적합하지 않을 경우 자식 클래스에서 다시 수정하여 사용

즉, 자식 클래스에서 부모 클래스의 메소드를 다시 정의하는 것을 말함

메소드가 재정의되면 부모 객체의 메소드는 숨겨지고 자식 객체에서 메소드 호출 시 재정의된 자식 메소드가 호출된다

 

메소드 재정의 방법

  • 부모의 메소드와 동일한 시그니처(리턴 타입, 메소드 이름, 매개 변수 목록)를 가져야 한다
  • 접근 제한을 더 강하게 재정의할 수 없다(반대로 약하게는 가능)
  • 새로운 예외(Exception)를 throws 할 수 없다
  • 아래 예시를 통해 메소드 재정의를 확인할 수 있다
// 부모 클래스
public class Calculator {
    double areaCircle(double r) {
        System.out.println("Carculator 객체의 areaCircle() 실행");
        return 3.14159 * r * r;
    }
}
// 자식 클래스
public class Computer extends Calculator {
    @Override  // 생략 가능하나 areaCircle() 메소드가 정확히 재정의된 것인지 컴파일러가 확인하므로 실수를 줄여줌
    double areaCircle(double r) {  // 재정의
        System.out.println("Computer 객체의 areaCircle() 실행");
        return Math.PI * r * r;
    }
}
// 메소드 재정의 테스트
public class ComputerExample {
    public static void main(String[] args) {
        int r = 10;

        Calculator calculator = new Calculator();
        System.out.println("원면적 :" + calculator.areaCircle(r));  // 기존 부모 클래스 메소드 호출
        System.out.println();

        Computer computer = new Computer();
        System.out.println("원면적 :" + computer.areaCircle(r));  // 자식 클래스에서 재정의된 메소드 호출
    }
}

실행 결과

 

부모 메소드 호출

  • 자식 클래스 내부에서 재정의된 부모 클래스의 메소드를 호출해야 할 경우 명시적으로 super 키워드를 붙여 부모 메소드를 호출
  • super는 부모 객체를 참조하고 있기 때문에 부모 메소드에 직접 접근할 수 있음
super.부모메소드();

final 클래스와 final 메소드

final 키워드는 클래스, 필드, 메소드를 선언할 때 사용 가능

해당 선언이 최종 상태이고 결코 수정될 수 없다는 의미

필드를 선언할 때 final이 지정되면 초기값 설정 후 더 이상 값을 변경할 수 없음

클래스와 메소드를 선언할 때 final이 지정되면 상속과 관련이 있음

 

상속할 수 없는 final 클래스

  • 클래스 선언 시 final 키워드를 class 앞에 붙이면 상속할 수 없는 클래스가 된다
  • 즉, final 클래스는 부모 클래스가 될 수 없어 자식 클래스를 만들 수 없음
  • 대표적으로 자바 표준 API에서 제공하는 String 클래스는 자식 클래스를 만들 수 없음
public fianl class 클래스 { ... }  // 상속할 수 없는 final 클래스 형식
public final class String { ... }  // 대표적 예시
public class NewString extends String { ... } <- X // 상속할 수 없기 때문에 성립이 되지 않음

 

 

재정의할 수 없는 final 메소드

  • 메소드 선언 시 final 키워드를 붙이면 재정의할 수 없는 메소드가 된다
  • 즉, 부모 클래스에 선언된 final 메소드는 자식 클래스에서 재정의할 수 없다
// 부모 클래스 Car의 stop() 메소드를 final로 선언했기 때문에 자식 클래스에서 재정의할 수 없음

public final 리턴타입 메소드( [매개변수, ...] ) { ... }  // final 메소드 형식

// 부모 클래스에서의 final 메소드
public class Car {
    public final void stop() {
        System.out.println("차를 멈춤");
        speed = 0;
	}
}

// 자식 클래스
public class SportsCar extends Car {
	@Override
    public void stop() {  // 재정의 불가
    	System.out.println("스포츠카를 멈춤")
        speed = 0;
    }
}

 

    코이_CO2
    코이_CO2
    나에게 찾아오는 뻔한 매일을 언제나 값지게 여길 줄 아는 내가 되기를

    티스토리툴바