상속

Soobin Kim·2024년 4월 2일

Java

목록 보기
20/47

상속

상속(Inheritance)은 부모(Super) 클래스의 기능을 재사용하고 기능을 확장할 수 있는 객체지향 프로그래밍(OOP)의 특징이다.
  • 자식 클래스의 인스턴스는 부모 클래스와 자식 클래스의 멤버 변수와 메소드를 모두 포함하게 되므로 자식 클래스의 인스턴스가 메모리 공간에서 부모와 자식의 멤버 변수 및 메소드를 모두 포함하는 형태를 가지게 된다.

super()

상위 클래스의 기본 생성자를 호출하는 메서드.

public class A{
	protected String a; // protected는 상속관계에서 하위클래스가 
    					  // 상위 클래스의 접근을 허용하는 접근 권한
	private int b;
    
    //...
}

public class B extends A{
	public B(){
		super();		// 명시적으로 써도 되지만, 생략한다면 컴파일러가 자동으로 삽입
    					// new Employee();
	}
}
  • 역할 부모 클래스의 생성자를 호출함으로써 부모 인스턴스를 생성한다.
  • 위치 생성자 메서드에서 가장 첫 문장에 사용해야 한다.
    • 생략가능 기본적으로 컴파일 시 자동으로 삽입된다.
  • 필요성 자식 인스턴스가 메모리에 생성되려면, 부모 인스턴스가 먼저 메모리에 생성되어 있어야 하기 때문이다.
    • 이를 위해 자식 클래스 생성자의 첫 줄에 super()를 작성하고 이 구문으로 자식 클래스의 생성자가 호출될 때 부모 클래스의 인스턴스를 먼저 생성하게 하며, 이후 자식 클래스의 인스턴스가 생성되게 한다.

다형성과 형변환

Java에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현한다.
즉 부모(조상)클래스 타입의 참조변수로 자손클래스의 인스턴스 필드 or 메소드 (멤버)에 접근할 수 있다.

상속 관계에서 형변환

	Animal ani = new Dog();
  • 자식 인스턴스는 부모 클래스 타입으로 형변환이 가능하며, 그 반대는 불가능하다.

    • 동물이다 [⭕]
    • 동물이다 [❌]
  • Dog 클래스의 객체(의 참조값)가 Animal 클래스 변수 ani에 할당.


업캐스팅(upcasting), 자동 형변환

자식 클래스의 객체가 부모 클래스 타입으로 형변환 되는 것

	Animal a = new Dog();
    
    Dog d = new Dog();
	Animal ani;
	ani = d;
    
    ani.eat();  // "개처럼 먹다" 
//  ani.bark(); error
  • 컴파일 시간의 처리
    • ani 변수Animal 클래스타입으로 선언되었지만, 실제로는 Dog 클래스의 객체를 참조하고 있으므로 Animal 클래스타입eat() 메소드를 호출하는 것이 아니라, 객체의 실제 타입인 Dog 클래스eat() 메소드를 호출하여 "개처럼 먹다"가 출력된다.
  • 런타임 처리
    • ani 변수Dog 클래스의 객체를 가리키고 있더라도, 변수의 선언 타입이 Animal 클래스 타입이므로 컴파일러는 Animal 클래스에 정의된 멤버만을 허용한다. 즉, 컴파일러는 ani 변수Animal 클래스의 참조로 간주하고 처리한다.
    • 동적 바인딩과 관련이 있다.

다운캐스팅(downcasting), 강제 형변환

자식클래스의 정보를 담을 수 있는 객체의 자료형이 부모클래스로 전환되어 있던 것(업캐스팅된 객체)을 다시 되돌리는 것을 의미

	Animal ani = new Dog();
    ((Dog) ani).bark();
    Dog dog = (Dog) ani;

instanceof 연산자

타입을 변환하면 변수가 가리키는 객체의 실제 타입이 무엇인지 구별하기가 어렵다. 따라서 변수가 참조하는 객체의 실제 타입을 식별하도록 자바는 instanceof 연산자를 제공한다.

  • instanceof 연산자는 변수가 해당 타입이나 자식 타입이라면 true를 반환하고 그렇지 않다면(부모타입이라면도 포함) false를 반환한다.

0개의 댓글