java 상속
– 기존클래스에 새로운 변수와 메소드를 추가하여 새로운 클래스를 만드는 것
– extends 키워드를 사용
– super 키워드로 상위클래스 생성자를 호출
– private 멤버도 상속됨(직접접근불가)
상위클래스의 private 멤버는 메소드를 통한 간접접근만 허용한다.
class AA{ // 상속되어지는 상위클래스 private int num=0; // private 변수는 상속되지 않는다. String name; AA(String name){ this.name = name; } void setNum(int num){ // setNum 메소드를 하위클래스에서 호출하면 private 변수 num 으로 접근이 가능하다. this.num = num; System.out.println(this.num); } } class BB extends AA{ // extends 키워드로 AA 클래스를 상속 int phoneNum; BB(String name, int phoneNum) { super(name); // 상위클래스 생성자 호출 this.phoneNum = phoneNum; } }
– 상위클래스의 생성자는 어떤식으로든 반드시 호출됨
프로그래머가 정의하지 않으면 생성자 호출문이 자동으로 삽입된다.
class AA{ AA(){} } class BB extends AA{ BB(){ super(); // 자동으로 삽입되는 상위클래스 생성자 호출문 } }
– 상위클래스의 참조변수로 하위클래스의 인스턴스 참조가 가능
public class Test { public static void main(String[] args) { AA aa = new BB(); // 상위클래스 AA의 참조변수로 하위클래스 BB의 인스턴스를 참조 } } class AA{} class BB extends AA{}
메소드 오버라이딩(Overriding)
– 상속 관계에 있는 클래스 간에 같은 이름의 메소드를 정의하는 기술
– 상위클래스의 메소드를 하위클래스에서 다시 정의 하는것
public class Test { public static void main(String[] args) { AA aa1 = new AA(); AA aa2 = new BB(); aa1.overriding(); // AA 클래스 출력 aa2.overriding(); // BB 클래스 출력 } } class AA{ void overriding(){ System.out.println("AA 클래스"); } } class BB extends AA{ void overriding(){ System.out.println("BB 클래스"); } }
상속의 목적
– 다형성(상위클래스의 참조변수로 하위클래스의 인스턴스를 참조)과 메소드 오버라이딩(동일한 방식의 메소드 호출 가능) 을 통해서 일련의 클래스에 대한 공통의 규약을 적용
final 클래스와 final 메소드
– final 클래스는 상속을 허용하지 않는다.
– final 메소드는 오버라이딩을 허용하지 않는다.
final class AA{ // 상속 불가 final void aa(){ // 오버라이딩 불가 } }