상속
기존에 만들어진 클래스의 기능을 상속받아서 새로운 클래스를 쉽게 만들 수 있는 방법
상속이란
상위 클래스를 상속받은 하위 클래스는 상위 클래스의 속성과 기능도 이용할 수 있다
따라서 하위 클래스에서 객체를 생성하면 상위 & 하위 클래스의 모든 속성과 기능을 사용할 수 있다
상속에는 다음 두 종류가 있다
- 구현상속 : 클래스 상속
- 인터페이스 상속 : 인터페이스 상속,
EX) 리모콘 케이스(인터페이스) / 리모콘 안에 들어가는 내부회로판(클래스)은 다를 수 있다
인터페이스는 클래스가 아니기 때문에 객체생성이 불가하다
인터페이스는 클래스가 지녀야 할 것들의 약속, 약속을 지키는 행위를 하는 것은 클래스이다
메서드 선언과 정의의 차이
- method ( ); 선언 -> 추상메소드, 무슨 일을 하는지 정도만 알 수 있다
- method ( ){ } 정의
상속의 필요성
기존의 검증된 class를 이용해서 빠르고 쉽게 새로운 class를 만들 수 있다
상속 구현
extends 키워드를 이용해서 상속을 구현한다
자바에서는 단일 상속만을 지원한다
public class ParentClass {
public ParentClass() {
System.out.println("ParentClass Constructor");
}
public void parentStart() {
System.out.println("---- Parent Start ----");
}
}
public class ChildClass extends ParentClass{
public ChildClass() {
System.out.println("ChildClass Constructor");
}
public void childStart() {
System.out.println("---- Child Start ----");
}
}
ChildClass child = new ChildClass();
child.parentStart();
child.childStart();
--- result ---
ParentClass Constructor
ChildClass Constructor
---- Parent Start ----
---- Child Start ----
다중 상속을 지원하지 않는 이유?
상위 클래스로부터 상속받은 메서드를 사용할 때, 어떤 클래스에서 구현한 메서드인지 알 수 없게 되는 다이아몬드 문제가 발생한다
https://en.wikipedia.org/wiki/Multiple_inheritance
단, 인터페이스(interface)의 경우 상위 클래스에서 실질적인 구현이 이루어지지 않고 메서드에 대한 정의만 하고,
최종 구현은 구현 객체에서 이루어질 것이기 때문에 문제가 되지 않는다
부모 클래스의 private 접근자
자식 클래스는 부모 클래스의 모든 자원을 사용할 수 있지만, private 접근자의 속성과 메서드는 사용할 수 없다
public class ParentClass {
public ParentClass() {
System.out.println("ParentClass Constructor");
}
private void parentStart() {
System.out.println("---- Parent Start ----");
}
}
public class ChildClass extends ParentClass{
public ChildClass() {
System.out.println("ChildClass Constructor");
}
public void childStart() {
System.out.println("---- Child Start ----");
}
}
ChildClass child = new ChildClass();
// this method parentStart() from the type ParentClass is not visible
child.parentStart();
child.childStart();
메서드 오버라이드(Override)
부모 클래스의 기능을 자식 클래스에서 재정의해서 사용한다
public class ParentClass {
public ParentClass() {
System.out.println("ParentClass Constructor");
}
public void parentStart() {
System.out.println("---- Parent Start ----");
}
}
public class ChildClass extends ParentClass{
public ChildClass() {
System.out.println("ChildClass Constructor");
}
@Override
public void parentStart() {
System.out.println("---- Child's Parent Start ----");
}
}
ChildClass child = new ChildClass();
child.parentStart();
--- result ---
ParentClass Constructor
ChildClass Constructor
---- Child's Parent Start ----
자료형(타입)
기본 자료형처럼 클래스도 자료형이다
public class ParentClass {
public ParentClass() {
System.out.println("ParentClass Constructor");
}
public void parentStart() {
System.out.println("---- Parent Start ----");
}
}
public class ChildClass extends ParentClass{
public ChildClass() {
System.out.println("ChildClass Constructor");
}
@Override
public void parentStart() {
System.out.println("---- Child's Parent Start ----");
}
}
// ChildClass는 ParentClass를 상속받은 것이기 때문에 가능하다
ParentClass child = new ChildClass();
child.parentStart();
--- result ---
ParentClass Constructor
ChildClass Constructor
---- Child's Parent Start ----
Object 클래스
모든 클래스의 최상위 클래스는 Object 클래스이다
이클립스에서 클래스 이름을 누르고 Ctrl+T를 누르면 상속관계를 볼 수 있다
super 클래스
상위 클래스를 호출할 때 super 키워드를 이용한다
public class ParentClass {
int value = 100;
public ParentClass() {
System.out.println("ParentClass Constructor");
}
public void parentStart() {
System.out.println("---- Parent Start ----");
}
}
public class ChildClass extends ParentClass{
int value = 9999;
public ChildClass() {
System.out.println("ChildClass Constructor");
}
@Override
public void parentStart() {
System.out.println("ChildClass : "+this.value);
System.out.println("SuperClass : "+super.value);
}
}
---- result ----
ParentClass Constructor
ChildClass Constructor
ChildClass : 9999
SuperClass : 100
'Study > Java' 카테고리의 다른 글
[Java] 인터페이스와 추상클래스 (0) | 2020.07.03 |
---|---|
[Java] 내부(inner) 클래스 & 익명(Anonymous) 클래스 (0) | 2020.07.03 |
[Java] 패키지와 static, 패키지 은닉 (0) | 2020.07.02 |
[Java] 생성자와 소멸자 그리고 this 키워드 (0) | 2020.07.02 |
[Java] 메서드, 오버로딩, 오버라이딩 (0) | 2020.07.01 |
댓글