인터페이스의 기본 개념
인터페이스는 클래스와 비슷하지만, 객체를 생성할순 없다.
메서드 정의만 가능!
실제 구현은 구현하는 클래스가 제공
인터페이스 정의
EX)
public interface Animal {
void eat();
void sleep();
}
인터페이스는 interface 키워드를 사용하여 정의한다.
메서드의 서명만을 정의
메서드 구현은 x
인터페이스 구현
인터페이스를 구현하는 클래스는 implements 키워드를 사용하여 인터페이스를 구현함.
인터페이스에 정의된 모든 메서드를 구현해야 한다.
인터페이스받은 클래스의 메서드는 오버로드를 한다.
public class Dog implements Animal {
@Override
public void eat() {
System.out.println("Dog is eating.");
}
@Override
public void sleep() {
System.out.println("Dog is sleeping.");
}
}
Dog 클래스는 Animal 인터페이스를 구현하며, eat()과 sleep() 메서드를 실제로 구현한다.
인터페이스의 특징
다중 상속 지원
Java는 클래스에서 다중 상속을 지원하지 않지만, 인터페이스를 통해 다중 상속을 구현할 수 있다. 하나의 클래스는 여러 개의 인터페이스를 구현할 수 있다.
public interface Swimmer {
void swim();
}
public interface Flyer {
void fly();
}
public class Duck implements Swimmer, Flyer {
@Override
public void swim() {
System.out.println("Duck is swimming.");
}
@Override
public void fly() {
System.out.println("Duck is flying.");
}
}
Duck 클래스는 Swimmer와 Flyer 두 개의 인터페이스를 구현하고 있다.
인터페이스 상속
인터페이스는 다른 인터페이스를 상속할 수 있습니다. 인터페이스를 상속받은 인터페이스는 상속받은 모든 메서드를 구현해야 한다.
public interface Animal {
void eat();
}
public interface Pet extends Animal {
void play();
}
public class Cat implements Pet {
@Override
public void eat() {
System.out.println("Cat is eating.");
}
@Override
public void play() {
System.out.println("Cat is playing.");
}
}
Pet 인터페이스는 Animal 인터페이스를 상속받고, Cat 클래스는 Pet 인터페이스를 구현한다.
디폴트 메서드와 정적 메서드
Java 8부터 인터페이스는 메서드 구현을 가질 수 있게 되었으며, 이는 디폴트 메서드와 정적 메서드로 구분된다.
- 디폴트 메서드는 인터페이스에 기본 구현을 제공하는 메서드이다. 클래스가 이 메서드를 구현할 필요가 없지만, 필요에 따라 오버라이드할 수 있다.
public interface Animal {
void eat();
default void breathe() {
System.out.println("Animal is breathing.");
}
}
정적 메서드는 인터페이스 자체에 속하며, 구현하는 클래스와는 독립적으로 호출할 수 있다.
public interface Utility {
static void printMessage() {
System.out.println("This is a static method in an interface.");
}
}
private 메서드
Java 9부터 인터페이스는 private 메서드를 정의할 수 있으며, 이는 인터페이스의 디폴트 메서드나 정적 메서드에서만 호출될 수 있다.
public interface Example {
private void helperMethod() {
System.out.println("This is a private method.");
}
default void defaultMethod() {
helperMethod(); // 사용 가능
}
}
인터페이스 활용
인터페이스는 다음과 같은 상황에서 유용하게 사용된다:
- 다형성: 인터페이스를 통해 다양한 클래스에서 일관된 방식으로 메서드를 호출할 수 있다.
- 객체의 구현체 교환: 인터페이스를 사용하면 실제 구현을 교체하더라도 인터페이스를 통해 일관된 방식으로 상호작용할 수 있다.
- 캡슐화: 인터페이스는 클래스의 구현을 숨기고, 외부에 필요한 메서드만 공개할 수 있다.
- 콜백 메커니즘: 인터페이스는 콜백 메커니즘을 구현할 때 유용함.
예제
아래는 인터페이스를 사용하는 실제 예제이다.
public interface Payment {
void processPayment(double amount);
}
public class CreditCardPayment implements Payment {
@Override
public void processPayment(double amount) {
System.out.println("Processing credit card payment of " + amount);
}
}
public class PayPalPayment implements Payment {
@Override
public void processPayment(double amount) {
System.out.println("Processing PayPal payment of " + amount);
}
}
public class PaymentProcessor {
public void makePayment(Payment paymentMethod, double amount) {
paymentMethod.processPayment(amount);
}
}
public class Main {
public static void main(String[] args) {
Payment creditCard = new CreditCardPayment();
Payment paypal = new PayPalPayment();
PaymentProcessor processor = new PaymentProcessor();
processor.makePayment(creditCard, 100.00);
processor.makePayment(paypal, 200.00);
}
}
Payment 인터페이스: 결제 처리 메서드를 정의한다.
CreditCardPayment와 PayPalPayment 클래스: Payment 인터페이스를 구현하여 다양한 결제 방법을 제공한다.
PaymentProcessor 클래스: Payment 인터페이스를 사용하여 결제를 처리한다.
'Java 문법정리 (Array부터)' 카테고리의 다른 글
동등성, 동일성 (0) | 2024.08.09 |
---|---|
Enum (0) | 2024.08.01 |
Calendar(java 8이후는 java.time) (0) | 2024.07.26 |
기본형 매개변수, 참조형 매개변수 (2) | 2024.07.23 |
return 문 (1) | 2024.07.23 |