상속 관계

송은혜·2022년 6월 4일
0

JAVA

목록 보기
2/8

일반 적으로 상속은 부모가 자녀에게 해준다 라고 생각을 하지만, 자바에서는 자녀의 입장으로 생각해야한다. → 자녀가 부모에게 상속을 받는다.

부모의 메서드, 변수 등을 모두 상속 받고, 자녀만의 새로운 메서드를 생성 할 수 있고, 부모의 메서드를 재정의 할 수도 있다.

부모클래스 (상위 클래스)

자녀클래스 (하위 클래스)

사용법

class Children extends Parents{}

자녀클래스의 클래스 선언에 extends + 부모 클래스의 이름을 붙여 부모클래스를 상속 받을 수 있다.

단, 여러 클래스를 동시에 상속받을 순 없다! 하지만 클래스와 인터페이스를 동시에 받을 수 있고, 인터페이스는 다중 구현이 가능하다.

패키지가 달라도 상속이 가능하지만, 제어자에 따라 모든 변수 및 메서드를 전부 상속 받지 못할 수 있다.

접근 제어자상속 가능 경로
public외부 클래스 어디서나 가능.
private같은 클래스 안에서만 가능(상속받는 클래스와 클래스가 같을 순 없음으로 사실상 상속이 불가능하다.)
default(제어자가 없을때)같은 패키지 안에서만 가능.
protected같은 패키지 안에서만 가능. 상속관계가 아닌 클래스는 사용할 수 없다.

특정 변수 혹은 메서드를 아무데서나 사용이 되지 않도록 보안(?)하고 싶지만, 상속을 해야할 때는 protected 제어자를 사용해주어 상속 받지 않은 모든 클래스에서는 사용할 수 없도록 만들어주면 된다!

한 클래스가 다른 클래스를 상속 받는 동시에, 인터페이스를 구현할 수도 있다.

public class A extends B implements C {
}

한 클래스가 여러 클래스를 동시에 상속 받을 순 없지만, 한 클래스가 여러 인터페이스를 구현할 수 있다.

public class A implements C, D, E {
}

super()

super 예약어는 , 자식클래스에서 부모 클래스로 접근을 할때 사용한다.

주로 생성자를 만들때 사용하는데 , 이유는 이러하다

⇒ 클래스에 생성자를 따로 만들지 않아도, 자바에서 자동으로 디폴트 생성자를 만든다.

그런데, 상속을 받은 자녀클래스가 생성자를 만들때 컴파일러에서 자동으로 부모클래스의 디폴트 생성자를 자녀클래스의 디폴트 생성자의 최상단에 추가를 한다.

⇒ 부모클래스에서 생성자를 따로 생성했다면 해당 생성자가 자동으로 추가가되는데 , 이 과정에서 super 예약어를 사용해주어야한다.

보통 하던 방식으로 하게 되면 에러가 사라지지 않을 것 이다...


업캐스팅 (upcasting) (부모클래스로 묵시적 형변환)

자식클래스로 인스턴스를 생성할 때, 이 클래스의 자료형을 부모클래스로 형변환할 수 있지만, (=업캐스팅(upcating)) 반대로 부모클래스로 인스턴스를 생성할 때 자식클래스로 형변환은 불가능하다. → 자식은 부모의 모든걸 담고 있지만 , 부모는 자식이 +@ 시킨 성질을 가지지 못하기때문.

Parents p = new Cildren(); => 묵시적 형변환 가능. 업캐스팅.
Cildren c = new Parents(); => 불가능.
(자료형) 변수명 = 인스턴스생성자;

@Overriding 오버라이딩

오버라이딩 ⇒ 자식클래스가 상속받은 부모 클래스의 메소드를 재정의 하는 것.
(@ 는 애노테이션을 나타내주는 표시)

오버라이딩의 조건!

→ 부모 클래스의 메소드와 이름이 같아야 합니다.

→ 부모 클래스의 메소드와 매개변수가 같아야 합니다.

→ 부모 클래스의 메소드와 반환타입이 같아야 합니다.


💡 **overloading 오버로딩과 오버라이딩을 혼돈하지 말자!! 오버로딩은 한 클래스 내에 같은 이름의 메소드를 여러개 생성하는 것이다. 단, 이름은 같아도 매개변수(파라미터)의 갯수나 자료형이 달라야한다! 조건 1. 이름은 같지만, 매개변수의 자료형이 다르다 조건2. 이름이 같고 매개변수의 자료형도 같지만, 갯수가 다르다**

0개의 댓글