개발의 시작과 끝

2020.02.23 / Day - 10 상속, 메서드 오버라이딩 본문

자바 공부

2020.02.23 / Day - 10 상속, 메서드 오버라이딩

개발지혜 2020. 2. 23. 11:07

a9A - 7~8일차

 

상속(Inheritance)

부모 클래스의 속성들을 자식 클래스가 복사 해오는 것.

 

상속의 규칙

예를 들어 흰오리가 오리의 클래스를 물려받으면 흰오리도 오리의 일종이기 때문에 물려받을 수 있지만

오리를 없애고 흰오리에 날다를 넣고 그것을 청둥오리한테 물려받게 했을 때 자바에서는 가능 하지만

청둥오리는 흰오리가 아니기 때문에 상식적으로 상속이 불가능 하다.

이를 어긴다면 나중에 자바에서 꼬일 수가 있다.

class 오리 {
  void 날다() {
    System.out.println("오리가 날개로 날아갑니다.");
  }
}

class 흰오리 extends 오리 {
}

class 청둥오리 extends 오리 {
}


청둥오리 a청둥오리 = new 청둥오리();
a청둥오리.날다();
// 출력 : 오리가 날개로 날아갑니다.
    
흰오리 a흰오리 = new 흰오리();
a흰오리.날다();
// 출력 : 오리가 날개로 날아갑니다.

 

 

메서드 오버라이딩

이미 있는 메서드를 다시 만드는 것 또는 재정의 하는 것

class 오리 {
  void 날다() {
    System.out.println("오리가 날개로 날아갑니다.");
  }
}

// 오리 => 부모 클래스
// 흰오리 => 자식 클래스
// 흰오리 extends 오리 => 흰오리가 오리의 능력을 물려 받는다.
// "`흰오리`는 `오리`이다." 라고 자바에게 알려준다.
// `A 는 B 이다.` 테스트에 통과하는 것만 상속이 가능하다.
// 클래스와 객체는 명사이다.
// 메서드는 동사이다.
class 흰오리 extends 오리 {
  
}

class 청둥오리 extends 오리 {
}

class 고무오리 extends 오리 {
  // 메서드 재정의 라고 합니다.
  // 메서드 오버라이드 라고도 합니다.
  // 메서드 재정의 => 부모가 물려준 능력을 다시 구현한다.
  void 날다() {
    System.out.println("저는 날 수 없어요. ㅜㅠ");
  }
}

청둥오리 a청둥오리 = new 청둥오리();
a청둥오리.날다();
// 출력 : 오리가 날개로 날아갑니다.
    
흰오리 a흰오리 = new 흰오리();
a흰오리.날다();
// 출력 : 오리가 날개로 날아갑니다.
    
고무오리 a고무오리 = new 고무오리();
a고무오리.날다();
// 출력 : 저는 날 수 없어요. ㅜㅠ

 

 

상속의 한계

자바에서 다중상속은 불가능 하며, 상속에는 한계가 있다.

상황이 안되면 더 이상 상속으로 커버가 불가능 한 것이 있다.

ex ) 흰오리 extends 오리 => O  /  흰오리 extends 오리 extends 고무오리 => X\

 

상속보다는 구성

상속 : is a 관계 => a is b / a는 b이다.

구성 : has a관계 => a has b / a는 b를 가지고 있다. ex) 사람은 팔, 다리, 몸통, 머리로 구성되어 있다.