☕ Java 상속 ( super, 업캐스팅 / 다운캐스팅, instanceof )

2023. 6. 15. 08:31개발/☕ JAVA

 

 

상속

: 기존의 클래스(부모 클래스)를 재사용하여 새로운 클래스(자식 클래스)를 작성하는 것

공통적인 속성(변수)과 기능(메서드)의 수정이 쉬워진다 -> 유지보수, 코드의 확장성 용이

코드의 중복을 방지한다 -> 코드 간결, 개발 시간 단축

 

1 )  용어 정리

- 조상 클래스 = 상위 클래스 = 부모 클래스 = 슈퍼 클래스

- 자손 클래스 = 하위 클래스 = 자식 클래스 = 서브 클래스

 

부모 클래스를 상속받은 자식 클래스 내부에는 부모 클래스의 모든 변수와 메소드가 존재한다

즉, 부모 클래스 ⊂ 자식 클래스

이때, 생성자와 초기화 블럭은 상속되지 않는다. 오직 멤버(변수, 메소드)만 상속된다.

 

부모 클래스의 변동은 자식 클래스에 영향을 주지만 자식 클래스의 변동은 부모 클래스에 영향을 주지 않는다

 

 

2 )  상속 선언

 

( 1 ) 클래스 상속

자식 클래스 extends 부모 클래스

* 다중 상속 불가

     

( 2 ) 인터페이스 상속

클래스 implements 인터페이스

인터페이스 extends 인터페이스

* 다중 상속 가능

 

 

3 )  상속과 접근 지정자

자식 클래스에서 접근 가능한 부모 클래스의 멤버 : public, protected, default

 

 

 

이제 상속을 구현하는 JAVA의 몇몇 개념들을 정리해보겠다

 

1 )  super

super 는 자식클래스에서 부모 클래스의 생성자를 하나 선택하여 호출하는 것을 의미한다

   - 생성자의 첫번째 코드로 작성해야 함

   - 오버로딩 : 생성자 여러 개 작성 가능(매개 변수 개수, 타입, 타입의 순서 달라야 함)

   - 객체가 생성될 때 무조건 한번 호출(생성자 작성된 게 없다면 컴파일러에서 기본 생성자 자동 호출)

 

2 )  업캐스팅 / 다운캐스팅

자식 클래스는 부모 클래스의 모든 멤버를 포함하고 부모 클래스의 객체로 취급할 수 있다

부모 클래스는 자식 클래스의 일부 멤버만 포함하고 자식 클래스의 객체로 취급할 수 없다

 

업캐스팅 : 자식 클래스 -> 부모 클래스 (자동 형변환)

다운캐스팅 : 부모 클래스 -> 자식 클래스 (강제 형변환)

 

3 ) instanceof

객체의 타입 판단하는 데 사용

객체명 instanceof 클래스 타입 -> true / false

 

interface Person{} //인터페이스


//인터페이스 상속
class Student implements Person {
	void study() {
		System.out.println("공부공부");
	}
}

//인터페이스 상속 
class Researcher implements Person {
	
	//생성자1
	public Researcher(){
		System.out.println("super 사용");
	}
	
	//생성자2
	public Researcher(String name){
		System.out.println(name + "super(String 매개변수) 사용");
	}
	
	
	void research() {
		System.out.println("연구연구");
	}
}

//클래스 상속 - Researcher의 자식 클래스 -> Researcher의 멤버 모두 사용 가능
class Professor extends Researcher {
	
	//생성자1 -> 생성자3 호출
	public Professor() {
		super();
		System.out.println("생성자3");
	}
	
	//생성자2 -> 생성자4 호출
	public Professor(String s) {
		super(s);
		System.out.println("생성자4");
	}
	
	
	void teach() {
		System.out.println("수업수업");
	}
}


public class java{
	
	public static void main(String[] args) {
		
		Student s = new Student();
		Researcher r = new Researcher();
		//생성자1
		Professor p = new Professor();
		Professor pp = new Professor("소으니");
		
		System.out.println(s instanceof Person); //true
		System.out.println(r instanceof Person); //true
		System.out.println(p instanceof Person); //true
		
		System.out.println(r instanceof Professor); //false
		System.out.println(p instanceof Researcher); //true
		
		//업캐스팅
		Researcher pr = new Professor();
		System.out.println(pr instanceof Researcher); //true
		System.out.println(pr instanceof Professor); //true
		
		//다운캐스팅
		Professor rp;
		rp = (Professor)pr;
		System.out.println(rp instanceof Researcher); //true
		System.out.println(rp instanceof Professor); //true
		
	}
}