본사의 방침을 모두 갖고있으면서 자신만의 새로운 메소드를 가지는
클래스를 만드려고 할 경우 상속을 사용한다.
맥도날드와 맥도날드DT점을 생각하면 이해가 쉽다.
DT는 본사의 메뉴얼을 그대로 하면서도,
추가적으로 DT에 대한 메뉴얼이 있어야한다.
YalcoChicken을 YalcoChickenDT가 상속받기 때문에
Main 클래스에서 YalcoChickenDT의 인스턴스를 만들고
YalcoChicken의 메소드를 사용하는 것이 가능한 것이다.
다음으로 오버라이딩(@Override)이 있는데,
부모가 상속해준 메소드를 자식이 마음대로 바꿔 사용할 수 있는 기능이다.
부모의 유전자를 물려받지만,
자식 마음대로 유전자를 배합하는 거라 이해하면 된다.
아래 예시를 보면 부모 Button 클래스를
ShutDownButton과 ToggleButton이 자식클래스로서 상속받는다.
여기서 빨간 박스를 보면 부모 클래스의 func 메소드를
자식클래스에서 받는데,
@Override 어노테이션을 붙이고, 자식 마음대로
메소드를 변경한 것을 볼 수 있다.
여기서 @Override 어노테이션은 안붙여도 되지만,
부모의 어느 메소드를 상속받았는 지 명확하게 체크해주는 역할을 한다.
그리고 super의 역할은 두 가지로 나뉜다.
생성자에서 사용되는 super는 부모 클래스의 생성자를 의미하며,
부모의 생성자를 이용해서 자신을 생성한다.
일반 메소드에서 사용된 super는 부모 클래스 그 자체를 의미한다.
여기서 중요한 것이, 자식클래스의 생성자에서
부모클래스의 생성자를 받아 자신을 생성하는 super가 먼저 오고,
그 다음 자식의 생성자가 와야한다.
부모가 태어나야 그 아래 자식이 태어날 수 있는 이치라 이해하면 편하다.
이어서 같은 예제를 두고 다형성까지 볼 수 있도록
Main 클래스에 다른 코드를 추가했다.
부모 클래스에는 자식 클래스를 담을 수 있지만,
그 반대나 형제 클래스끼리 담는 것은 불가능하다.
그리고 자식 클래스를 부모 클래스의 배열에 넣고
클래스의 배열로 for-each문을 작성하는 것 역시 가능하다.
추가적으로, 부모 클래스에서 생성자가 없는 경우
자식 클래스 역시 생성자를 만들어줄 필요가 없다.
다음 다형성의 특징으로는
부모 클래스의 메소드에서 자식 클래스를 인자로 사용할 수 있다.
위의 예제를 보면, Slime의 자식 클래스로 FireSlime이 있다.
그리고 부모 클래스인 Slime클래스의 메소드에서
자식 클래스인 FireSlime을 인자로 갖다 쓰는 걸 볼 수 있다.
다음으로 instanceOf() 연산자이다.
앞전에 나왔던 예제2를 연장해서 설명하자면,
Main클래스에 instanceOf를 사용해서
생성된 인스턴스와 부모클래스를 양옆에 넣어준다.
부모클래스의 인스턴스, 혹은 자식클래스에서 생성된 인스턴스는
Button(부모 클래스)의 인스턴스로
true가 출력되지만,
그 반대로 자식 클래스에 부모 클래스 인스턴스를 넣거나
형제 클래스끼리 연산하는 것은 불가하다.
빨간 박스와 같이 instanceOf를 활용해
특정 인스턴스를 건너뛰도록 할 수도 있다.
그 반대로, 특정 인스턴스만 실행하도록 할 수도 있다.
for-each문으로 YalcoChicken은 무시하고,
YalcoChickenDT인 경우에만 오더가 실행되도록 설정했다.
여기서 store 변수에 대해 명확히 하기 위해
명시적 형 변환을 해줬다는 점 짚고 넘어가면 된다.
마지막으로, Object라는 단군할아버지 급의
최고 조상님이 있다는 점 기억하면 된다.
단군할아버지 Object는 나중에 더 자세히 다룬다.
'Back > Java' 카테고리의 다른 글
Day74_객체지향 복습_III 접근 제어자, Getter&Setter (0) | 2023.11.04 |
---|---|
Day72_객체지향 복습_II 생성자(Constructor), static (0) | 2023.10.31 |
Day71_객체지향 복습_I 객체지향 개념 (0) | 2023.10.31 |
Day70_for문 별찍기 (2) | 2023.10.27 |
Day26_Java 메서드 정리 (0) | 2023.06.17 |