[Java] 클래스 상속

정재현·2024년 1월 3일

Java

목록 보기
28/43
post-thumbnail

상속

  • 상속의 사전적 정의는 부모가 자식에게 물려주는 행위를 말함
  • 부모 클래스의 필드와 메서드를 자식 클래스에게 물려줄 수 있다.
  • 상속을 사용하면 적은 양의 코드로 새로운 클래스를 작성할 수도 있고 공통적인 코드를 관리하여 코드의 추가와 변경이 쉬워질 수도 있다.

방법

  • 클래스간의 상속은 extends 키워드를 사용하여 정의
	public class 자식클래스 extends 부모클래스 {

	}

클래스간의 상속

  1. 부모 클래스에 새로운 필드와 메서드가 추가되면 자식 클래스는 이를 상속받아 사용할 수 있다.
  2. 자식 클래스에 새로운 필드와 메서드가 추가되어도 부모 클래스는 어떠한 영향도 받지 않는다.
  3. 따라서 자식 클래스의 멤버 개수는 부모 클래스보다 항상 같거나 많다.

단일 상속과 다중 상속

  • Java는 다중상속을 허용하지 않음
  • Java는 단일 상속만 허용
  • 다중상속을 허용하면 클래스간의 관계가 복잡해지는 문제가 생기기 때문
    • 만약 자식 클래스에서 상속받는 서로 다른 부모 클래스들이 같은 이름의 멤버를 가지고 있다면 자식 클래스에서는 이 멤버를 구별할 수 있는 방법이 없다는 문제가 생김

final 클래스와 final 메서드

final 클래스

  • 클래스에 final 키워드를 지정하여 선언하면 최종적인 클래스가 됨으로 더 이상 상속할 수 없는 클래스가 된다.
	public final class Car {}

	...

	public class SportsCar extends Car{} // 오류가 발생합니다.

final 메서드

  • 메서드에 final 키워드를 지정하여 선언하면 최종적인 메서드가 됨으로 더 이상 오버라이딩할 수 없는 메서드가 된다.

Object

  • Object 는 말그대로 “객체”를 의미하는 단어이며 보통, Object 클래스를 의미
  • Object 클래스는 Java 내 모든 클래스들의 최상위 부모 클래스를 의미
  • 따라서, 모든 클래스는 Object의 메서드를 사용 가능
  • 부모 클래스가 없는 자식 클래스는 컴파일러에 의해 자동으로 Object 클래스를 상속받게 된다.

Object 클래스의 메서드

  • Object clone() : 해당 객체의 복제본을 생성하여 반환함.
  • boolean equals(Object object) : 해당 객체와 전달받은 객체가 같은지 여부를 반환함.
  • Class getClass() : 해당 객체의 클래스 타입을 반환함.
  • int hashCode() : 자바에서 객체를 식별하는 정수값인 해시 코드를 반환함.
  • String toString() : 해당 객체의 정보를 문자열
    로 반환함. & Object 클래스에서는 클래스이름 @해쉬코드값 리턴함.

오버라이딩

  • 부모 클래스로부터 상속받은 메서드의 내용을 재정의 하는 것
  • 부모 클래스의 메서드를 그대로 사용 가능하지만 자식 클래스의 상황에 맞게 변경을 해야하는 경우 오버라이딩을 사용

오버라이딩 조건

  1. 선언부가 부모 클래스의 메서드와 일치해야 합니다.
  2. 접근 제어자부모 클래스의 메서드 보다 좁은 범위로 변경 불가
  3. 예외는 부모 클래스의 메서드 보다 많이 선언할 수 없습니다.

super와 super()

super

  • 부모 클래스의 멤버를 참조할 수 있는 키워드
  • 객체 내부 생성자 및 메서드에서 부모 클래스의 멤버에 접근하기 위해 사용
  • 자식 클래스 내부에서 선언한 멤버와 부모 클래스에서 상속받은 멤버와 이름이 같을 경우 이를 구분하기 위해 사용

super 사용 예시

  • 자식 클래스의 메서드를 호출하면 super 키워드로 접근한 부모 클래스의 model, color 필드에 매개변수의 값이 저장
  • this 키워드로 접근한 자식 클래스의 price 필드에는 매개변수의 값이 저장
	// 부모 클래스 : Car
    String model; // 자동차 모델
	String color; // 자동차 색상
	double price; // 자동차 가격
    
    // 자식 클래스 : SportsCar
    String model = "Ferrari"; // 자동차 모델
	String color = "Red"; // 자동차 색상
	double price = 300000000; // 자동차 가격
    
    // 자식 클래스의 메서드
    public void setCarInfo(String model, String color, double price) {
    	super.model = model; // model은 부모 필드에 set
    	super.color = color; // color는 부모 필드에 set
    	this.price = price; // price는 자식 필드에 set
	}

super()

  • 부모 클래스의 생성자를 호출할 수 있는 키워드
  • 객체 내부 생성자 및 메서드에서 해당 객체의 부모 클래스의 생성자를 호출하기 위해 사용
  • 자식 클래스의 객체가 생성될 때 부모 클래스들이 모두 합쳐져서 하나의 인스턴스가 생성

super() 사용 예시

  • 부모 클래스의 멤버들의 초기화 작업이 먼저 수행이 되어야 함.
    • 자식 클래스 객체를 생성할 때 생성자 매개변수에 매개값을 받아와 super(…)를 사용해 부모 생성자의 매개변수에 매개값을 전달하여 호출하면서 부모 클래스의 멤버를 먼저 초기화
  • 자식 클래스의 생성자에서는 부모 클래스의 생성자가 호출
    • 오버로딩된 부모 클래스의 생성자가 없다고 하더라도 부모 클래스의 기본 생성자를 호출
    • 눈에 보이지는 않지만 컴파일러가 super(); 를 자식 클래스 생성자 첫 줄에 자동으로 추가해줌
  • 부모 클래스의 생성자가장 첫 줄에서 호출이 되어야한다.
	// 부모 클래스 Car 생성자
	public Car(String model, String color, double price) {
	    this.model = model;
	    this.color = color;
	    this.price = price;
	}
    
    // 자식 클래스 SportsCar 생성자
	public SportsCar(String model, String color, double price, String engine) {
     	// this.engine = engine; // 오류 발생
    	super(model, color, price);
    	this.engine = engine;
	}

정리하기

상속이란

  • 부모 클래스의 필드와 메서드를 자식 클래스에게 물려주는 행위

Object란

  • Java 내 모든 클래스들의 최상위 부모 클래스를 의미

오버라이딩이란

  • 부모 클래스로부터 상속받은 메서드의 내용을 재정의하는 것

final 메서드 vs final 클래스

  • final 메서드 : 더 이상 오버라이딩할 수 없는 메서드
  • final 클래스 : 더 이상 상속을 할 수 없는 메서드

this vs super

  • this : 자신 클래스의 메서드, 멤버 접근 키워드
  • super : 부모 클래스의 메서드, 멤버 접근 키워드

this() vs super()

  • this() : 자신 클래스의 다른 생성자를 호출하는 키워드
  • super() : 부모 클래스의 생성자를 호출하는 키워드

profile
공부 기록 보관소

0개의 댓글