상속 (Inheritance)
부모 클래스 : 상위, super 클래스라고도 한다.
자식 클래스 : 하위, 파생 클래스라도도 한다.
부모 클래스의 필드와 메소드를 자식 클래스에서 물려받아, 사용 할 수 있는 것을 말한다.
현실과는 다르게 상속의 권한은 자식에게 있다. (Extends)
상속 받은 재산을 자식이 마음대로 사용할 수 있듯이, 자식은 상속받은 필드와 메소드의 내용을 마음대로
변경이 가능하다. (메소드 재정의, 오버라이딩)
부모 클래스 또한, 일부, 또는 클래스 전체를 상속 거부할 수 있게 만드는 기능이 있다.(final)
부모 클래스는, 자식 클래스를 제외한 모든 클래스가 접근을 막게 할 수있다.(protected)
자식 클래스 타입의 메소드나 필드는 부모 클래스 타입의 변수에 대입시에 자동적으로 부모 클래스 타입으로 변환된다.(자동 타입 변환)
상속 : 자식 클래스를 선언할 때, 상속받을 부모 클래스의 이름을 extends 뒤에 기술한다. 다만 다중 상속은 불가능 하므로, 부모 클래스명을
2개 이상 기재하는 것은 안된다.
부모 클래스 |
핸드폰 |
자식 클래스 |
갤럭시s8, 아이폰x |
자식 객체를 생성할 때는 반드시 부모 객체가 생성되고, 자식 객체가 생성된다.
따라서 내부적으로는 자식 클래스의 생성자에 super() 라는 생성자 메소드가 자동적으로 첨부되게 된다.
이 메소드는 갤럭시s8이라는 클래스의 부모 클래스가 있다면, 핸드폰이라는 부모 클래스의 생성자를 호출하여 그 객체를 자동으로 생성한다.
만일, 명시적으로 부모 클래스의 생성자를 호출하고 싶다면, (ex 부모 클래스의 생성자가 오버로딩이 되어있을 경우) 따로 작성하면 된다.
ex) super("",'',12)
이 super() 생성자 메소드는 언제나 자식 생성자 메소드 내의 첫 줄에 위치하여야 한다! 그렇지 않으면 컴파일시 에러가 발생한다.
메소드 오버라이딩 : 자식 객체에서 부모 클래스의 메소드를 사용하려는데, 메소드의 내용을 수정하고 싶을 수가 있다.
이런 경우를 위해 만들어진 기능이, 메소드 오버라이딩 기능이다.
자식 클래스를 작성할 때, 부모 클래스의 메소드명은 그대로 가져오고, 메소드 내의 내용만 수정한다.
그리고, 자식 객체를 생성해서 메소드를 호출하면 부모 클래스의 메소드는 숨겨지게 되고, 자식 클래스의 메소드가 호출되어 실행이 된다.
만일 부모 클래스의 메소드를 그대로 호출 해야 할 상황이라면, super.메소드명() 으로 호출하면 사용할 수 있다.
final : final 키워드는 상수를 만들 때도 사용하지만, 클래스와 메소드에 붙여서 선언한다면, 상속이 불가능하게 만드는 효과가 있다.
이는 자식 클래스에서 클래스 전체나 일부 메소드의 내용을 변경(오버라이딩) 하여 사용할 수 없게 만드는 것으로, 특정 클래스가 고정된 작
업만 수행하게 하는 역할을 한다. (최종)
protected : 이 접근 제한자가 붙은 필드 , 메소드, 생성자는 오로지 상속받은 클래스에서만 참조할 수 있다.
자동 타입 변환 : 자식 클래스는 부모 클래스의 필드, 생성자, 메소드를 상속 받은 상태이므로, 다시 부모 클래스의 타입으로 변환이 가능하
다. 라고 생각 할 수 있다. 실제로, 자식 클래스의 필드, 생성자, 메소드는 부모 클래스를 참조하고 있다. (비교연산자 == 체크)
그러므로 실제로 이것이 가능한 것이다.
ex) Phone phone = galaxys8.call();
이 자동 타입 변환은 상속 계층에서 여러번 상속된 상위 클래스로도 이루어 진다. A-B-C로 상속된 관계라면, C는 B나 A 어떤것으로든 타입 변
환이 가능하다.