상속
상속
- 기존에 있는 클래스의 멤버 변수나 메소드를 물려받아 새로운 클래스를 만드는 것이다.
- 클래스를 계속 만들기 귀찮으니까 이미 만들어진 클래스를 재사용 하기 위해 사용한다.
- 상속을 이용하여 새로운 클래스를 정의 ->
기존의 클래스의 멤버 변수나 메소드를 수정 없이 사용 가능
| 상속 하는 클래스 | 상속 받는 클래스 |
|---|
| 수퍼 클래스 | 서브 클래스 |
| 상위 클래스 | 하위 클래스 |
| 부모 클래스 | 자식 클래스 |
- 상속 관계에 있는 클래스 간의 관계 : is - a, 서브 클래스는 수퍼 클래스이다.
ex) 택시는 자동차이다.
팩스 전화기는 전화기이다.
경영자는 고용인이다.
상속 방법
접근제어자 class 클래스명 extends 상위클래스명
- "extends" 키워드를 사용한다.
- 자바는 단일 상속만 지원 -> extends 뒤에는 하나의 클래스명만 와야한다.
- 모든 클래스는 최상위 클래스인 Object 클래스를 자동으로 상속받는다.
- 상속 관계에서 접근 제어자가 protected일 경우 하위 클래스에서 접근할 수 있지만, private일 경우는 상속 관계에서도 접근이 불가능하다.
상속과 생성자
- 상속 과정에서 생성자는 상속이 불가능하다.
- 하위 클래스 객체 생성 시 자동으로 상위 클래스 인자 없는 생성자를 호출한다.
> 생성자가 상위 클래스에 없을 때는 디폴트 생성자( 생성자명( ){ } )를 실행한다.
> 상위 클래스에 인자 있는 생성자만 있는 경우엔 에러를 발생한다.
super 키워드, super( ) 메소드
- 상속 관계에 있는 클래스에서 상위 클래스의 멤버 변수나 생성자를 호출하기 위해 사용한다.
super 키워드
super.상위 클래스의 멤버 변수
super.상위 클래스의 메소드명()
- 상위 클래스의 멤버 변수나 메소드를 명시적으로 호출할 때 사용한다.
super( ) 메소드
super()
super(인자, ...)
- 상위 클래스의 생성자를 명시적으로 호출할 때 사용한다.
- 하위 클래스의 생성자 중 제일 먼저 호출해야 한다.
상속과 메소드 오버라이딩
- 메소드 오버라이딩
> 상위 클래스에 있는 메소드와 똑같은 메소드를 하위 클래스에서 재정의하여 사용하는 것이다.
> 상위 클래스와 같은 이름으로 하위 클래스에서 메소드의 기능을 바꾸는 것이다.
> 상위 클래스에 기능을 추가하는 것이다.
- 메소드 오버라이딩이 된 경우에는 특별한 지시가 없는 한 하위 클래스의 메소드(재정의를 한 메소드)를 호출한다.
- 메소드 오버라이딩의 조건
> 상위 클래스의 메소드와 메소드명, 매개변수의 타입 · 개수, 리턴 타입이 같아야 한다.
> static, final, private 메소드는 오버라이딩 할 수 없다.
형변환
- 참조 데이터형 : 배열, 클래스 등
- 다른 참조 데이터 할당이나 다른 클래스로 객체를 생성하고자 할 때 일어난다.
- 묵지석 형변환(업 캐스팅)과 명시적 형변환(다운 캐스팅)이 있다.
- 참조 데이터 형변환의 조건
> 상속 관계에 있는 클래스 간에만 형변환이 가능하다.
> 서로 다른 종류의 클래스 간에는 형변환이 안된다.
> 상위 클래스 참조 데이터 변수는 하위 클래스 객체를 참조 가능하다.
(그 반대는 X)
업 캐스팅(Up Casting)
- 특정 객체가 하위 클래스의 형에서 상위 클래스의 형으로 형변환 하는 것이다.
- 형만 정확하다면 묵시적으로 형변환 된다.
public class Animal{}
public class Dog extends Animal{}
...
Animal a = new Dog():
다운 캐스팅(Down Casting)
- 캐스팅한 것을 원래대로 복구시킨다.
- 업 캐스팅된 것만 다운 캐스팅이 가능하다.
- 강제 캐스팅을 원칙으로 한다. (명시적)
class DownCast extends Object{..}
Object o = new DownCast();
DownCast d = (DownCast)o;
가상 메소드
- 상위 클래스의 이름으로 하위 클래스의 메소드를 호출하는 기법이다.
- 업 캐스팅 했을 때 상위 클래스의 이름으로 하위 클래스의 메소드를 호출한다.
-> 원래는 접근을 못하지만 업 캐스팅을 했기 때문에 호출 가능
class Shape{
public void draw(){
System.out.println("도형 그리기");
}
}
class Circle extends Shape{
private String type = "원";
public void draw(){
System.out.println(type + " 그리기");
}
public void painting(){
System.out.println("색 칠하기");
}
}
public class DrawingExam {
public static void main(String[] args){
Circle c = new Circle();
c.draw();
c.paining();
Shape s = new Circle();
s.draw();
}
}