상속이란?
상위 클래스의 멤버를 자식 클래스에서 재사용하기 위한 것
→ 상위 클래스의 멤버를 물려받기 때문에 코드의 절감
→ 상위 클래스의 코드를 변경하면 모든 하위 클래스들에게도 적용되므로 유지 보수성 향상
- 상위 클래스의 생성자와 초기화 블록은 상속하지 않는다.
- extends 키워드를 사용하여 상속한다.
- 상속의 관계는 is a 관계라고 한다.
- Person is a Object, SpiderMan is a Person
- 모든 클래스는 Object 클래스를 상속하고 있다.
- extends의 선언이 없는 클래스는 extends Object가 생략된 것이다.
- 자바는 단일 상속만 지원한다.
- 두 개의 상위 클래스에 동일한 이름의 메서드가 있을 경우 복잡해질 수 있기 때문이다.
- 이를 극복하기 위해서 interface와 포함 관계(has a)를 사용한다.
상위 클래스 = 조상 클래스 = 슈퍼 클래스
하위 클래스 = 자식 클래스 = 서브 클래스
메소드 오버라이딩
상위 클래스에 정의된 메소드를 자식 클래스에서 적합하게 수정하는 것
오버라이딩의 조건
- 메소드 이름이 같아야 한다.
- 매개 변수의 개수, 타입, 순서가 같아야 한다.
- 리턴 타입이 같아야 한다.
- 접근 제한자는 부모 보다 범위가 넓거나 같아야 한다.
- 부모 보다 더 큰 예외를 던질 수 없다.
오버로딩의 조건
- 메소드 이름이 같다.
- 파라미터가 다르다.
super
this를 통해 멤버에 접근하듯이 super를 통해 상위 클래스 멤버에 접근할 수 있다.
- 생성자 호출은 맨 첫 줄에서 실행해야 한다.
- 명시적으로 this() 또는 super()를 호출하지 않는 경우 컴파일러가 super() 삽입
변수의 scope
아래의 실행결과는 method, child, parent 순으로 출력될 것이다.
이때, method()의 String x = "method";를 주석처리한다면?
x값을 찾아서 돌다가 String x = "child"; 를 만나 child, child, parent 순으로 출력할 것이다.
class Parent {
String x = "parent";
}
class Child extends Prarent {
String x = "child";
void method() {
String x = "method";
System.out.println("x : " + x);
System.out.println("this.x : " + this.x);
System.out.println("super.x : " + super.x);
}
}
public class ScopeTest {
public static void main(String[] args) {
Child child = new Child();
child.method();
}
}