인터페이스 구현하기
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 참조를 사용하는 코드가 구체적인 클래스 타입을 알 필요가 없기 때문에 강력합니다. 단지 객체가 그려질 수 있다는 점만 중요하게 여깁니다.
다음 레슨에서는 하나의 클래스가 동시에 여러 인터페이스를 구현하는 방법을 알아볼 것입니다.
챌린지
쉬움클래스가 인터페이스를 어떻게 구현하는지 보여주는 스피커 시스템을 만들어 봅시다. 모든 스피커가 할 수 있는 일을 정의하는 인터페이스를 만든 다음, 이 계약을 각자의 방식으로 구현하는 두 가지 서로 다른 스피커 유형을 만들 것입니다.
코드를 네 개의 파일로 구성합니다:
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() 결과 출력
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조6인터페이스와 추상 클래스
인터페이스 소개인터페이스 구현하기다중 인터페이스 구현인터페이스의 Default 및 Static 메서드추상 클래스 vs 인터페이스함수형 인터페이스복습 - 결제 시스템