인터페이스 정의
interface Calculator {
int add(int x, int y); // 추상 메서드
int subtract(int x, int y); // 추상 메서드
default int multiply(int x, int y) { // Java 8 이후 default 메서드
return x * y;
}
static int divide(int x, int y) { // Java 8 이후 static 메서드
return x / y;
}
}
인터페이스 구현체
class SimpleCalculator implements Calculator {
@Override//컴파일 단계에서 오탈자를 예방합니다
public int add(int x, int y) {
return x + y;
}
@Override
public int subtract(int x, int y) {
return x - y;
}
}
사용 코드
public class Main {
public static void main(String[] args) {
Calculator calc = new SimpleCalculator();
System.out.println("Addition: " + calc.add(10, 5));
// 구현된 메서드 호출
System.out.println("Subtraction: " + calc.subtract(10, 5));
// 구현된 메서드 호출
System.out.println("Multiplication: " + calc.multiply(10, 5));
// default 메서드 호출
System.out.println("Division: " + Calculator.divide(10, 5));
// static 메서드 호출
}
}
출력 결과
Addition: 15
Subtraction: 5
Multiplication: 50
Division: 2
즉, 무엇을 해야하는지에 대한 규칙만 적혀있다고 생각하면 됩니다.
쉽게 인터페이스는 메서드 시그니처(이름, 매개변수, 반환값 등)와 상수를 가지고
구현체(클래스)와 계약을 맺는다
라고 이해해봅시다.
인터페이스에는 계약의 규칙을 적어놓고
실제 계약을 구현하는 코드는 인터페이스를 implements
한 클래스(구현체)에서 작성합니다.
인터페이스는 메서드의 설명만 가질 수 있고 실제 구현을 가질 수 없습니다
구현부가 없는 추상 메서드만 가질 수 있습니다.
(JAVA 8 부터는 default와 static 메서드로 일부 구현 가능)
인터페이스는 상수만 가질 수 있습니다.
인터페이스의 필드는 기본적으로 public static final로 선언되며, 수정이 불가능합니다.
인터페이스는 이것을 구현하는 클래스가 강제적으로 필요함
(implements 키워드 사용)
클래스는 다중 상속이 불가능하지만 인터페이스는 다중 구현이 가능합니다
(상속은 2명의 아버지에게 받을 수 없지만 계약은 2명이상의 사람과 가능)
인터페이스를 구현할 때는 정의된 메소드를 반드시 구현해야합니다
구분 | 클래스 | 인터페이스 |
---|---|---|
구현 여부 | 구현된 메소드 포함 | 구현되지 않은 추상 메소드 만 포함 |
상속 | 한번에 하나의 클래스만 상속가능 | 여러 인터페이스 동시에 구현 가능 |
객체 생성 가능 여부 | 객체를 생성할 수 있음 | 생성자 메소드가 없으므로 객체 생성 불가 |
필드 | 멤버 변수와 상수 모두 포함 가능 | 상수만 포함 |
사용목적 | 기능 구현 및 확장 | 규약 제공 및 구현 강제 |
인터페이스도 객체이지만 구현하는 생성자가 없으므로 객체를 생성할 수 없습니다.
Java에서는 클래스가 인터페이스를 구현하기 위해 implements
키워드를 사용합니다.
implements
키워드를 통해 클래스는 인터페이스에 정의된 메서드를 반드시 구현해야 합니다.interface 인터페이스이름 {
// 추상 메서드 선언
반환타입 메서드이름(매개변수);
}
class 클래스이름 implements 인터페이스이름 {
// 인터페이스에 정의된 메서드를 반드시 구현해야 함
@Override
반환타입 메서드이름(매개변수) {
// 메서드 구현
}
}
interface Animal {
void sound(); // 동물 소리
void eat(); // 먹는 행동
}
class Dog implements Animal {
@Override
public void sound() {
System.out.println("멍멍!");
}
@Override
public void eat() {
System.out.println("강아지가 밥을 먹습니다.");
}
}
위 코드에서
Animal
은 sound
와 eat
메서드를 정의한 인터페이스입니다.Dog
클래스는 Animal
인터페이스를 구현하여 각 메서드를 실제로 정의했습니다.인터페이스와 구현 클래스는 계약과 이행의 관계입니다.
저도 처음 인터페이스를 공부할 때 추상 클래스가 있는데 이걸 왜 써야되지 싶어서 따로 찾아봤던 기억이 나네요! 잘 보고 갑니다~