Menu
Coddy logo textTech

인터페이스 구현하기

Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 87개 중 35번째.

인터페이스를 사용하려면 클래스는 implements 키워드를 사용하여 해당 인터페이스를 구현해야 합니다. 그런 다음 클래스는 인터페이스에 선언된 모든 메서드에 대해 구체적인 구현을 제공합니다:

public interface Drawable {
    void draw();
}

public class Circle implements Drawable {
    private double radius;
    
    public Circle(double radius) {
        this.radius = radius;
    }
    
    @Override
    public void draw() {
        System.out.println("Drawing a circle with radius " + radius);
    }
}

클래스가 인터페이스를 구현하지만 모든 메서드에 대한 구현을 제공하지 않으면 컴파일러가 오류를 발생시킵니다. @Override 어노테이션은 선택 사항이지만 실수를 방지하는 데 도움이 되므로 권장됩니다.

추상 클래스와 마찬가지로 인터페이스를 참조 타입으로 사용할 수 있습니다. 이를 통해 동일한 인터페이스를 구현하는 서로 다른 클래스들을 일관되게 처리할 수 있는 다형성이 가능해집니다:

Drawable shape1 = new Circle(5.0);
Drawable shape2 = new Rectangle(4.0, 3.0);

shape1.draw();  // 반지름이 5.0인 원 그리기
shape2.draw();  // 4.0 x 3.0 크기의 직사각형 그리기

이것은 Drawable 참조를 사용하는 코드가 구체적인 클래스 타입을 알 필요가 없기 때문에 강력합니다. 단지 객체가 그려질 수 있다는 점만 중요하게 여깁니다.

다음 레슨에서는 하나의 클래스가 동시에 여러 인터페이스를 구현하는 방법을 알아볼 것입니다.

challenge icon

챌린지

쉬움

클래스가 인터페이스를 어떻게 구현하는지 보여주는 스피커 시스템을 만들어 봅시다. 모든 스피커가 할 수 있는 일을 정의하는 인터페이스를 만든 다음, 이 계약을 각자의 방식으로 구현하는 두 가지 서로 다른 스피커 유형을 만들 것입니다.

코드를 네 개의 파일로 구성합니다:

  • Speaker.java: 모든 스피커가 수행해야 하는 작업을 선언하는 Speaker라는 인터페이스를 정의합니다. 모든 스피커는 String을 반환하는 speak() 메서드를 가져야 합니다. 이것이 모든 구현 클래스가 충족해야 하는 계약입니다.
  • Human.java: Speaker 인터페이스를 구현하는 클래스를 만듭니다. Human은 name 필드(String)를 가집니다. 이름을 초기화하는 생성자를 포함하고, speak() 메서드를 구현하여 [name] says: Hello everyone!을 반환하도록 합니다.
  • Robot.java: Speaker 인터페이스를 구현하는 또 다른 클래스를 만듭니다. Robot은 model 필드(String)를 가집니다. 모델을 초기화하는 생성자를 포함하고, speak() 메서드를 구현하여 Robot [model] says: Beep boop!을 반환하도록 합니다.
  • Main.java: 인터페이스 기반 다형성을 사용하여 모든 것을 하나로 묶습니다. 사람의 이름과 로봇의 모델이라는 두 개의 입력을 받게 됩니다. Human과 Robot을 생성한 다음, 이들을 Speaker 참조 배열에 저장합니다. 배열을 루프하며 각 스피커에 대해 speak()를 호출한 결과를 출력합니다.

사람의 이름(String)과 로봇의 모델(String)이라는 두 개의 입력을 받게 됩니다.

출력은 각 스피커에 대해 한 줄씩, 총 두 줄로 표시되어야 합니다. Human과 Robot이 서로 완전히 다른 방식으로 말하더라도 Speaker 인터페이스를 통해 어떻게 동일하게 처리될 수 있는지 확인해 보세요!

치트 시트

클래스는 implements 키워드를 사용하여 인터페이스를 구현하며, 인터페이스에 선언된 모든 메서드에 대해 구체적인 구현을 제공해야 합니다:

public interface Drawable {
    void draw();
}

public class Circle implements Drawable {
    private double radius;
    
    public Circle(double radius) {
        this.radius = radius;
    }
    
    @Override
    public void draw() {
        System.out.println("Drawing a circle with radius " + radius);
    }
}

@Override 어노테이션은 선택 사항이지만 실수를 방지하는 데 도움이 되므로 권장됩니다.

인터페이스는 참조 타입으로 사용될 수 있으며, 동일한 인터페이스를 구현하는 서로 다른 클래스들을 일관되게 다룰 수 있는 다형성을 가능하게 합니다:

Drawable shape1 = new Circle(5.0);
Drawable shape2 = new Rectangle(4.0, 3.0);

shape1.draw();  // Drawing a circle with radius 5.0
shape2.draw();  // Drawing a rectangle 4.0 x 3.0

직접 해보기

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // 입력 읽기
        String humanName = scanner.nextLine();
        String robotModel = scanner.nextLine();
        
        // TODO: 주어진 이름으로 Human 객체 생성
        
        // TODO: 주어진 모델로 Robot 객체 생성
        
        // TODO: 두 객체를 모두 포함하는 Speaker 참조 배열 생성
        
        // TODO: 배열을 순회하며 각 스피커에 대해 speak() 결과 출력
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨