본문 바로가기
Back-End/Java

상속 - 02

by newny 2022. 12. 22.
반응형

자동 타입변환

  • 자식 클래스는 부모의 특징과 기능을 상속받기 때문에 부모 클래스와 동일하게 취급될 수 있음
  • 바로 위의 부모가 아니더라도 상속 계층에서 상위 타입이라면 자동 타입 변환이 일어날 수 있음
  • 부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능
    (비록 변수는 자식 객체를 참조하지만 변수로 접근 가능한 멤버는 부모 클래스 멤버로 한정됨)
  • 그러나 자식 클래스에서 오버라이딩 된 메소드가 있다면 부모 메소드 대신 오버라이딩된 메소드가 호출됨
부모타입 변수 = 자식타입객체;

class Cat extends Animal {
}


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

cat == animal  // true

 

강제 타입 변환 (casting)

  • 부모 타입을 자식 타입으로 변환하는 것
  • 자식 타입이 부모 타입으로 자동 타입 변환한 후 다시 자식 타입으로 변환할 때 강제 타입 변환을 사용할 수 있음
    • 자식타입 > 부모타입변환 > 자식 타입 강제타입변환
  • 자식 클래스에 선언된 필드와 메소드를 꼭 사용해야 한다면 강제 타입 변환을 이용하여 사용
Parent parent = new Child(); // 자동 타입 변환
Child child = (Child) parent; // 강제 타입 변환

 


 

다형성

사용 방법은 동일하지만 실행 결과가 다양하게 나오는 성질

 

 

필드의 다형성 (재정의 + 타입변환)

필드 타입은 동일하지만(사용 방법은 동일하지만), 대입되는 객체가 달라져서 실행 결과가 다양하게 나올 수 있는 것을 말함

 

 

매개변수의 다형성

  • 다형성은 필드보다는 메소드 호출할 때 많이 발생
  • 메소드가 클래스 타입의 매개변수를 가지고 있을 경우, 호출할 때 동일한 타입 대신 자식 객체를 제공 할 수도 있음

 

객체 타입 확인

  • instanceof 연산자를 사용
boolean result = 객체 instanceof 타입;

 

추상(abstract) 클래스

  • 추상 : 실체 간에 공통되는 특성을 추출한 것
  • 추상 클래스 : 실체 클래스들의 공통적인 필드나 메소드를 추출해서 선언한 클래스
  • 실체 클래스의 공통되는 필드와 메소드를 추출해서 만들었기 때문에 new연산자를 사용해서 객체를 직접 생성 할 수 없고, 상속을 통해 자식 클래스만 만들 수 있음
  • 새로운 실체 클래스를 만들기 위한 부모 클래스로만 사용됨

 

추상 클래스 선언

public abstract class 클래스명 {
  //필드
  //생성자
  //메소드
}

 

추상 메소드와 재정의

  • 자식 클래스의 공통 메소드라는 것만 정의할 뿐, 실행 내용을 가지지 않음(중괄호가 없음)
  • 자식 클래스에서 반드시 재정의 하여 사용해야함
abstract 리턴타입 메소드명(매개변수,...);

 

봉인된 클래스

무분별한 자식 클래스의 생성을 막기위해 사용함

public sealed class Person permits Employee, Manager {...}
// Person 클래스는 Employee 와 Manager 만 상속하겠다

sealed~permits를 이용하여 생성한 부모 클래스를 상속받은 자식 클래스는 세가지중 한가지를 선택하여 생성할 수 있음

public sealed class Manger extends Person {...} // 똑같이 봉인시킴
public final class Employee extends Person {...} // 더이상 상속할 수 없게함
public non-sealed class Manger extends Person {...} // Manager의 자식클래스는 제한없이 만들 수 있음

 

확인문제

호출되는 각 클래스의 생성자의 순서

super(); 와 this();는 같이 사용 할 수 없음

public class ChildExample {
    Child child = new Child(); // 1
}
public class Child extends Parent {
    public String name;

    public Child() {  //2
        this("홍길동");  //3
        System.out.println("Child() call"); //14
    }

    public Child(String name) {  //4
        // super(); 컴파일러 자동 생성  //5
        this.name = name;  //12
        System.out.println("Child(String name) call");  //13
    }
}
public class Parent {
    public String nation;

    public Parent() { //6
        this("대한민국"); //7
        System.out.println("Parent() call"); //11
    }

    public Parent(String nation) {  //8
        this.nation = nation;  //9
        System.out.println("Parent(String nation) call"); //10
    }
}
반응형

'Back-End > Java' 카테고리의 다른 글

인터페이스 - 01  (0) 2023.01.05
상속 - 01  (0) 2022.12.21
클래스 - 02  (0) 2022.12.16

댓글