상속

5BRack·2022년 6월 30일

자바란?

목록 보기
12/42

상속

상속 : 부모의 재산을 물려받는다.

  • 클래스의 상속은 부모 클래스의 멤버를 내려받아 자식 클래스 내부에 포함시키는 자바 문법 요소이다.

상속의 장점

  • 코드의 중복성 제거
  • 다형적 표현 가능

    객체를 여러가지 모양으로 표현할 수 있는 특성을 "다형성" 이라 한다.


상속 문법

  • 클래스를 상속할 때는 extends 키워드를 사용하며, 클래스명 다음에 'extends 부모 클래스' 를 표기한다.
  • 클래스는 다중 상속이 불가능하다.(부모 클래스가 꼭 1개)
public class Student extends Person{ }   
//Student 클래스는 person 클래스를 상속받았다.

상속시, 메모리 구조

  • 자바 가상 머신은 자식 클래스의 객체를 생성할 때 힙영역에 부모 클래스 객체를 내부적으로 먼저 생성한 뒤 자식클래스를 외부적으로 포장한다.

클래스의 업캐스팅과 다운 캐스팅

  • 객체에서는 자식 클래스에서 부모 클래스 쪽으로 변환되는 것이 "업 캐스팅" 그 반대가 "다운 캐스팅"이다.
  • 업캐스팅은 자동형 변환이 되지만, 다운 캐스팅은 직접 명시적으로 넣어줘야 한다.
  • 클래스의 위쪽 방향 캐스팅(업캐스팅)은 관계 상관없이 무조건 허용된다.
  • Person 클래스를 상속 받는 Student 클래스가 있을 시,
    Person person = (Person) new Student(); 라는 코드는 무조건 허용된다.
  • 업캐스팅시, 업캐스팅된 타입의 클래스 재산을 바라보기 때문에 자식 클래스에서 추가된 메서드나 필드를 바라볼수는 없다.
class A{}
class B extends A{
	void add(){}            //자식 클래스에서 add메서드 추가
}

B b = new B();
A a = (A) b;
a.add();                   //error  부모클래스 타입을 
							//바라보므로 추가된 메서드나 필드 사용불가
  • 다운 캐스팅시, 부모클래스 생성자로 생성된 객체는 자식 클래스의 추가된 재산(resource)을 바라볼 수 없기 때문에 불가능하다.
  • 캐스팅의 가능 여부는 타입선언에 초점이 맞춰진 것이 아니라 어떤 생성자로 객체가 생성되었는가가 중요하다.
class A{}
class B extends A{
}

A a1 = new A();   //부모타입 A 클래스를 바라보면 A생성자로 객체 생성
B b1 = (B) a1;    // B타입으로 다운 캐스팅시, 에러발생

A a2 = new B();   // 부모타입 A클래스를 바라보며 B생성자로 객체 생성
B b2 = (B) a2; 	  // B 타입으로 다운 캐스팅가능
        

캐스팅 가능 여부를 확인하는 방법

  • 자바는 캐스팅 가능 여부를 boolean 타입으로 확인할 수 있는 문법 요소를 제공하고 있는데, 이것이 instanceof 이다.
if(b instanceof A){   //A클래스를 상속받는 B클래스생성자로 생성된 인스턴스 b가 A타입 
	A a = (A) b;     //형변환이 가능하면 true 리턴, 불가능하면 false 리턴 
					//  예제에서는 true가 리턴 되므로 업캐스팅 실행
}

0개의 댓글