class Main {
public static void main(String[] args) {
System.out.println("== 청둥오리 ==");
청둥오리 a청둥오리 = new 청둥오리();
a청둥오리.날다(); // 오리가 날개로 날아갑니다.
a청둥오리.수영하다(); // 오리가 물갈퀴로 수영합니다.
System.out.println("== 흰오리 ==");
흰오리 a흰오리 = new 흰오리();
a흰오리.날다(); // 오리가 날개로 날아갑니다.
a흰오리.수영하다(); // 오리가 물갈퀴로 수영합니다.
System.out.println("== 고무오리 ==");
고무오리 a고무오리 = new 고무오리();
a고무오리.날다(); // 저는 못 날아요 ㅠㅠ
a고무오리.수영하다(); // 오리가 물에 둥둥 떠다닙니다.
System.out.println("== 고무2오리 ==");
고무2오리 a고무2오리 = new 고무2오리();
a고무2오리.날다(); // 저는 못 날아요 ㅠㅠ
a고무2오리.수영하다(); // 오리가 물에 둥둥 떠다닙니다.
System.out.println("== 로봇오리 ==");
로봇오리 a로봇오리 = new 로봇오리();
a로봇오리.날다(); // 오리가 날개로 날아갑니다.
a로봇오리.수영하다(); // 오리가 물에 둥둥 떠다닙니다.
}
}
class 오리 {
void 날다() {
System.out.println("오리가 날개로 날아갑니다.");
}
void 수영하다() {
System.out.println("오리가 물갈퀴로 수영합니다.");
}
}
class 흰오리 extends 오리 {
}
class 청둥오리 extends 오리 {
}
class 고무오리 extends 오리 {
void 날다() {
System.out.println("저는 못 날아요. ㅜㅠ");
}
void 수영하다() {
System.out.println("오리가 물에 둥둥 떠다닙니다.");
}
}
class 고무2오리 extends 오리 {
고무오리 a고무오리 = new 고무오리(); // composition
void 날다 () {
a고무오리.날다();
}
void 수영하다 () {
a고무오리.수영하다();
}
}
class 로봇오리 extends 오리 {
@Override // @Override
void 수영하다 () {
System.out.println("오리가 물에 둥둥 떠다닙니다.");
}
}
extends : 상속을 나타내는 키워드 (is-a관계, A는 B)
@Override : 오버라이딩
ㄴ 부모클래스에서 만든 메서드를 자식클래스에서 재정의함
즉 같은 이름의 메서드지만 다른 행동을 할 수 있음
이것을 다향성(Polymorphism) 이라고 함
주의사항
- 메서드 이름, 매개변수,리턴 타입이 부모와 같아야 함
- @Override를 생략해도 됨
But, 실수방지와 가독성 향상을 위해 사용하는 것을 습관 들이기
composition : 객체를 포함해서 조립 (has-a관계, A는 B를 가짐)
오리는 부모클래스 청둥오리, 흰오리, 고무오리는 자식클래스
상속받은 자식클래스는 부모클래스의 메서드를 사용 가능
ㄴ 따라서 다시 정의할 필요 없음
고무오리는 오버라이딩을 통해 메서드를 재정의해
다른 행동을 할 수 있음
class Main {
public static void main(String[] args) {
동물 a동물 = new 동물();
a동물.소리내기();
강아지 a강아지 = new 강아지();
a강아지.소리내기();
고양이 a고양이 = new 고양이();
a고양이.소리내기();
}
}
class 동물 {
void 소리내기() {
System.out.println("동물이 소리를 냅니다.");
}
}
class 강아지 extends 동물{
@Override
void 소리내기(){
System.out.println("멍멍");
}
}
class 고양이 extends 동물 {
@Override
void 소리내기(){
System.out.println("야옹");
}
}
class Main {
public static void main(String[] args) {
동물[] 동물들 = {new 동물(), new 강아지(), new 고양이() };
for (동물 d : 동물들) {
d.소리내기();
}
}
}
class 동물 {
void 소리내기() {
System.out.println("동물이 소리를 냅니다.");
}
}
class 강아지 extends 동물{
@Override
void 소리내기(){
System.out.println("멍멍");
}
}
class 고양이 extends 동물 {
@Override
void 소리내기(){
System.out.println("야옹");
}
}
자바에서 다중상속은 허용되지 않음
복잡한 상속구조는 유지보수, 이해, 확장성에 불리함
ㄴ 상속은 최소한으로 대신 composition으로 유연한 구조 만들기
현재 객체 자신을 의미
생략 가능
ㄴ 매개변수와 이름이 같은 때, 객체 자신을 명확히 가리킬 땐 사용해야 함