컴퓨터 & 코딩/Java

[혼공학습단 10기][혼공자] 상속 / 타입 변환과 다형성 / 추상 클래스

구로그 2023. 7. 13. 15:22
728x90

✓ 상속

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

- 여러 개의 부모 클래스를 상속할 수 없다.

- 부모 클래스 중 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외된다. 

- 서로 다른 패키지에서 존재한다면 default 접근 제한을 갖는 필드와 메소드도 상속 대상에서 제외된다. 

 

 

super() 

자식 생성자를 직접 선언하고 명시적으로 부모 생성자를 호출하는 방법

super.method2() 이런식으로도 사용 가능하다 

자식클래스 ( 매개변수선언, ... ) {
    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) {
        super(name, ssn);
        this.studentNo = studentNo;
    }
}

 

 

메소드 재정의 Overriding 

상속된 일부 메소드를 수정해서 사용하는 것

- 부모 메소드와 동일한 시그니처(리턴 타입, 메소드 이름, 매개 변수 목록)를 가져야 한다

- 접근 제한을 더 강하게 재정의 할 수 없다

- 새로운 예외를 throws할 수 없다 

- 재정의 시 @Override 어노테이션을 쓰면 실수를 줄일 수 있다. 

 

 

❗️ final 키워드가 붙은 클래스: 상속할 수 없는 클래스
final 키워드가 붙은 메소드: 재정의할 수 없는 메소드
💡 protected 접근 제한자

같은 패키지 내에서는 접근 제한이 없지만 다른 패키지에서는 자식 클래스만 접근을 허용한다.  필드, 생성자, 메소드 선언에 사용될 수 있다. 

 


 

  타입 변환과 다형성

1️⃣ 자동 타입 변환: 클래스의 자동 타입 변환상속 관계에 있는 클래스 사이에서 발생한다.

 

자식은 부모 타입으로 자동 타입 변환이 가능하다. 

Cat cat = new Cat();
Animal animal = cat;

// Animal animal = new Cat(); 도 가능

cat과 animal 변수는 타입만 다를 뿐 동일한 Cat 객체를 참조한다. (cat === animal의 결과값은 true)

 

❗️ 부모 타입으로 자동 타입 변환된 후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다.

❗️ 만약 메소드가 자식 클래스에서 재정의되었다면 자식 클래스의 메소드가 대신 호출 된다. 

 

 

 

2️⃣ 필드의 다형성: 필드의 타입을 부모 타입으로 선언하면 다양한 자식 객체들이 저장될 수 있기 때문에 필드 사용 결과가 달라질 수 있다. 

 

매개 변수의 타입이 클래스일 경우, 해당 클래스의 객체뿐만 아니라 자식 객체까지도 매개값으로 사용할 수 있다. 

 

 

 

3️⃣ 강제타입변환: 부모 타입을 자식 타입으로 변환하는 것.

자식타입이 먼저 부모타입으로 자동 타입 변환된 후 다시 자식 타입으로 변환될 때 사용가능. 

// 자식타입 변수 = (자식타입) 부모타입;

Parent parent = new Child();
Child child = (Child) parent;

❗️ 강제 타입 변환을 할 경우 자식에 선언된 필드와 메소드를 사용할 수 있다. 

 

 

 

instanceof 연산자: 어떤 객체가 어떤 클래스의 인스턴스인지, 객체 타입을 확인하는 연산자
부모 변수가 참조하는 객체가 부모 객체인지 자식 객체인지 확인할 때 쓰인다. 
⇨ boolean result = 좌항(객체) instanceof 우항(타입) 

 

 

 


 

 

 추상 클래스 

- 실체 클래스: 객체를 직접 생성할 수 있는 클래스 

- 추상 클래스: 실체 클래스들의 공통적인 특성을 추출해서 선언한 클래스 

 

💡 이때 추상 클래스가 부모이고 실체 클래스가 자식이라 실체 클래스는 부모의 특성인 추상 클래스의 필드, 메소드를 물려 받는다.

 

 

추상 클래스 선언하기 

public abstract class 클래스 {
    ...
}

❗️ 자식 객체가 생성될 때 super()를 호출해서 추상 클래스 객체를 생성하므로 추상 클래스도 생성자가 반드시 있어야 한다

❗️ 추상 클래스는 실체 클래스의 공통되는 필드와 메소드를 추출해서 만들었기 때문에 객체를 직접 생성해서 사용할 수 없다.

❗️ 부모 클래스로만 사용되기 때문에 extends 뒤에만 올 수 있는 클래스이다. 

 

 

추상 메소드 선언

abstract 키워드와 함께 메소드의 선언부만 있고 메소드 실행 내용인 중괄호가 없는 메소드. 

public abstract class Animal {
    public abstract void sound();
}

 

반응형