JAVA_CLASS

장성욱·2025년 6월 4일

JAVA

목록 보기
8/23

상속 (Inheritance)



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으로 유연한 구조 만들기


this

  • 현재 객체 자신을 의미

  • 생략 가능
    ㄴ 매개변수와 이름이 같은 때, 객체 자신을 명확히 가리킬 땐 사용해야 함

profile
https://frost-puck-b0f.notion.site/B-2610fdaef71d80c49d1bccdcb575dcb5

0개의 댓글