2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

20240812_캠프 5주차 1일_자바 상속의 모든 것

2024. 8. 12. 15:03ㆍ내배캠_Java 6기/Java 문법 종합반

상속

📌 상속의 사전적 정의는 부모가 자식에게 물려주는 행위

  • 부모 클래스의 필드와 메서드를 자식 클래스에게 물려줄 수 있다.
  • 상속을 사용하면 적은 양의 코드로 새로운 클래스를 작성할 수도 있고 공통적인 코드를 관리하여 코드의 추가와 변경이 쉬워질 수도 있다.
  • 상속을 사용하면 코드의 중복이 제거되고 재사용성이 크게 증가 

 

 

클래스 간의 상속은 extends 키워드를 사용하여 정의

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

}



부모가 자식보다 큰 사람이니까 부모 클래스도 마찬가지로 자식 클래스 보다 큰 범위겠지?

 

➡️ 자식 클래스에 새로운 필드와 메서드가 추가되어도 부모 클래스는 어떠한 영향도 받지 않는다. 따라서 자식 클래스의 멤버 개수는 부모 클래스보다 항상 같거나 많다.

 

 

단일 상속과 다중 상속

 

다중 상속

 

🚫 자바는 다중 상속을 허용하지 않는다!!

 

1. 자식에 부모가 여러 명일 수는 없다.   

 

2. 다중 상속을 허용하면 클래스 간 관계가 거미줄처럼 엮여서 복잡. 

 

3. 자식 클래스에서 상속받는 서로 다른 부모 클래스들이 같은 이름의 멤버를 가지고 있다면 구분 불가 

 

final 클래스와 final 메서드

 

final 키워드를 클래스에 지정해 선언하면 최종적인 클래스가 됨으로 더 이상 상속할 수 없는 클래스

 

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

 

 

Object

Object 클래스는 Java 내 모든 클래스들의 최상위 부모 클래스 → 모든 클래스는 Object 메서드를 사용할 수 있음

🧑‍💻 Object 클래스의 메서드를 몇 가지 소개

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

 

 

오버라이딩

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

 

조건

1. 선언부가 부모 클래스의 메서드와 일치

2. 접근 제어자를 부모 클래스의 메서드 보다 좁은 범위로 변경할 수 없음

3. 예외는 부모 클래스의 메서드 보다 많이 선언할 수 없음

@Override
public double brakePedal() {
    speed = 100;
    System.out.println("스포츠카에 브레이크란 없다");
    return speed;
}

@Override
public void horn() {
    booster();
}

 

 

super 와 super()

super는 부모 클래스의 멤버를 참조할 수 있는 키워드

 

✓ 객체 내부 생성자 및 메서드에서 부모 클래스의 멤버에 접근하기 위해 사용

 

✓ 자식 클래스 내부에서 선언한 멤버와 부모 클래스에서 상속받은 멤버와 이름이 같을 경우 구분 

 

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(…)는 부모 클래스의 생성자를 호출할 수 있는 키워드

 

✓  객체 내부 생성자 및 메서드에서 해당 객체의 부모 클래스의 생성자를 호출

 

✓  자식 클래스의 객체가 생성될 때 부모 클래스들이 모두 합쳐져서 하나의 인스턴스가 생성

 

➡️  이때 부모 클래스의 멤버들의 초기화 작업이 먼저 수행

 

 

부모 클래스 생성자

// 부모 클래스 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;
}

 

 

다형성( polymorphism )

부모 타입 변수 = 자식 타입 객체; 는 자동으로 부모 타입으로 변환

 

✓ 자식 객체는 부모 객체의 멤버를 상속받기 때문에 부모와 동일하게 취급

 

✓ 부모 타입 변수로 자식 객체의 멤버에 접근 시 부모 클래스에 선언된 상속받은 멤버만 접근 

 

 

Mammal : 부모 클래스

class Mammal {
    // 포유류는 새끼를 낳고 모유수유를 한다.
    public void feeding() {
        System.out.println("모유수유를 합니다.");
    }
}

 

 

Whale : 자식 클래스

class Whale extends Mammal {
    // 고래는 포유류 이면서 바다에 살며 수영이 가능하다.
    public void swimming() {
        System.out.println("수영하다.");
    }

    @Override
    public void feeding() {
        System.out.println("고래는 모유수유를 합니다.");
    }
}

 

 

강제 타입 변환

반대로 부모 타입 객체는 자식 타입 변수로 자동으로 타입 변환되지 않음.

// 자식타입객체가 자동 타입변환된 부모타입의 변수
        Mammal mammal = new Whale();
        mammal.feeding();

// 자식객체 고래의 수영 기능을 사용하고 싶다면
// 다시 자식타입으로 강제 타입변환을 하면된다.
        Whale whale = (Whale) mammal;
        whale.swimming();

 

※ 주의

자식 타입 객체가 부모 타입 변환된 후 다시 자식 타입으로 변환될 때만 강제 타입 변환이 가능

 

 

instanceof

다형성 기능으로 인해 해당 클래스 객체의 원래 클래스명을 체크하는 것이 필요한데 이때 사용할 수 있는 명령어가 instance of 이다

{대상 객체} instance of {클래스 이름}와 같은 형태로 사용하면 응답값은 boolean

// 다형성

class Parent { }
class Child extends Parent { }
class Brother extends Parent { }


public class Main {
    public static void main(String[] args) {

				Parent pc = new Child();  // 다형성 허용 (자식 -> 부모)

        Parent p = new Parent();

        System.out.println(p instanceof Object); // true 출력
        System.out.println(p instanceof Parent); // true 출력
        System.out.println(p instanceof Child);  // false 출력

        Parent c = new Child();

        System.out.println(c instanceof Object); // true 출력
        System.out.println(c instanceof Parent); // true 출력
        System.out.println(c instanceof Child);  // true 출력

    }
}

 

728x90