[인프런 Java] 클래스와 인터페이스 활용

코드 속의 "진돌"·2024년 3월 27일
0
post-thumbnail

✅ 클래스와 인터페이스 활용


클래스 상속과 인터페이스 구현을 함께 사용하는 예를 알아보자.

  • AbstractAnimal은 추상 클래스이다.
    • sound() : 동물의 소리를 내기 위한 sound() 추상 메서드를 제공한다.
    • move() : 동물의 이동을 표현하기 위한 메서드이다. 이 메서드는 추상 메서드가 아니다. 상속을 목적으로 사용된다.
  • Fly는 인터페이스이다. 나는 동물은 이 인터페이스를 구현할 수 있다.
    • Bird, Chicken은 날 수 있는 동물이다. Fly() 메서드를 구현해야 한다.




✅ 예제6


✏️ AbstractAnimal

package poly.ex6;

public abstract class AbstractAnimal {

  public abstract void sound();

  public void move() {
    System.out.println("동물이 이동합니다.");
  }
}



✏️ Fly

package poly.ex6;

public interface Fly {

  void fly();
}



✏️ Dog

package poly.ex6;

public class Dog extends AbstractAnimal {

  @Override
  public void sound() {
    System.out.println("멍멍");
  }
}

DogAbstractAnimal만 상속 받는다.



✏️ Bird

package poly.ex6;

public class Bird extends AbstractAnimal implements Fly {

  @Override
  public void sound() {
    System.out.println("짹짹");
  }

  @Override
  public void fly() {
    System.out.println("새 날기");
  }
}

BirdAbstractAnimal 클래스를 상속하고 Fly 인터페이스를 구현한다.



📚 하나의 클래스 여러 인터페이스 예시

public class Bird extends AbstractAnimal implements Fly, Swim { ... }

extends를 통한 상속은 하나만 할 수 있고 implements를 통한 인터페이스는 다중 구현 할 수 있기 때문에 둘이 함께 나온 경우 extends가 먼저 나와야 한다.



✏️ Chicken

package poly.ex6;

public class Chicken extends AbstractAnimal implements Fly {
  
  @Override
  public void sound() {
    System.out.println("꼬끼오");
  }

  @Override
  public void fly() {
    System.out.println("닭 날기");
  }
}



✏️ SoundFlyMain

package poly.ex6;

public class SoundFlyMain {

  public static void main(String[] args) {
    Dog dog = new Dog();
    Bird bird = new Bird();
    Chicken chicken = new Chicken();

    soundAnimal(dog);
    soundAnimal(bird);
    soundAnimal(chicken);

    flyAnimal(bird);
    flyAnimal(chicken);
  }

  // AbstractAnimal 사용 가능
  private static void soundAnimal(AbstractAnimal animal) {
    System.out.println("동물 소리 테스트 시작");
    animal.sound();
    System.out.println("동물 소리 테스트 종료");
  }

  // Fly 인터페이스가 있으면 사용 가능
  private static void flyAnimal(Fly fly) {
    System.out.println("날기 테스트 시작");
    fly.fly();
    System.out.println("날기 테스트 종료");
  }
}



🖥️ 실행 결과



⚙️ 메모리 구조 - 상속

soundAnimal(AbstractAnimal animal)
AbstractAnimal을 상속한 Dog, Bird, Chicken을 전달해서 실행할 수 있다.



⚙️ 실행 과정

  • soundAnimal(bird)를 호출한다고 가정하자.
  • 메서드 안에서 animal.sound()를 호출하면 참조 대상인 x001 Bird 인스턴스를 찾는다.
  • 호출한 animal 변수는 AbstractAnimal 타입이다. 따라서 AbstractAnimal.sound()를 찾는다. 해당 메서드는 Bird.sound()에 오버라이딩 되어 있다.
  • Bird.sound()가 호출된다.



⚙️ 메모리 구조 - 인터페이스

flyAnimal(Fly fly)
Fly 인터페이스를 구현한 Bird, Chicken을 전달해서 실행할 수 있다.



⚙️ 실행 과정

  • fly(bird)를 호출한다고 가정하자.
  • 메서드 안에서 fly.fly()를 호출하면 참조 대상인 x001 Bird 인스턴스를 찾는다.
  • 호출한 fly 변수는 Fly 타입이다. 따라서 Fly.fly()를 찾는다. 해당 메서드는 Bird.fly()에 오버라이딩 되어 있다.
  • Bird.fly()가 호출된다.

출처 : 김영한의 실전 자바 - 기본편
https://www.inflearn.com/course/김영한의-실전-자바-기본편/dashboard

profile
매일 성장하는 주니어 개발자의 기록📝

0개의 댓글