자바에서 인터페이스는 클래스의 기능을 정의하고 구현하는 중요한 개념입니다. 인터페이스를 사용하면 다양한 클래스가 공통된 메서드 집합을 구현하도록 강제할 수 있으며, 객체 지향 프로그래밍의 다형성, 코드 재사용성, 그리고 유연성을 높일 수 있습니다.
인터페이스의 기본 개념
인터페이스 정의: 인터페이스는 메서드의 시그니처만 정의하고, 메서드의 구현은 포함하지 않습니다. 클래스가 인터페이스를 구현하면, 그 클래스는 인터페이스에서 정의된 모든 메서드를 구현해야 합니다.
형식:
java
코드 복사
public interface InterfaceName {
// 상수 정의 (optional)
int CONSTANT = 100;
// 추상 메서드 정의
void method1();
int method2(int param);
}
인터페이스 구현: 클래스가 인터페이스를 구현하면, 해당 클래스는 인터페이스에서 정의된 모든 메서드를 구체적으로 구현해야 합니다.
형식:
java
코드 복사
public class ClassName implements InterfaceName {
@Override
public void method1() {
// 메서드 구현
}
@Override
public int method2(int param) {
// 메서드 구현
return 0;
}
}
인터페이스의 주요 특징
다중 상속: 자바에서는 클래스는 단일 상속만 가능하지만, 인터페이스는 다중 상속을 지원합니다. 즉, 하나의 클래스가 여러 인터페이스를 구현할 수 있습니다.
예제:
java
코드 복사
public interface InterfaceA {
void methodA();
}
public interface InterfaceB {
void methodB();
}
public class CombinedClass implements InterfaceA, InterfaceB {
@Override
public void methodA() {
System.out.println("Method A");
}
@Override
public void methodB() {
System.out.println("Method B");
}
}
디폴트 메서드: 자바 8부터 인터페이스는 디폴트 메서드를 지원합니다. 디폴트 메서드는 인터페이스에 기본 구현을 제공할 수 있는 메서드입니다.
예제:
java
코드 복사
public interface MyInterface {
// 디폴트 메서드
default void defaultMethod() {
System.out.println("This is a default method.");
}
}
정적 메서드: 자바 8부터 인터페이스는 정적 메서드를 정의할 수 있습니다. 정적 메서드는 인터페이스 이름을 통해 직접 호출할 수 있으며, 인터페이스에 속하지만 인스턴스 메서드는 아닙니다.
예제:
java
코드 복사
public interface Utility {
static void staticMethod() {
System.out.println("This is a static method.");
}
}
상수: 인터페이스에 정의된 필드는 자동으로 public, static, final입니다. 인터페이스의 필드는 상수로 사용됩니다.
예제:
java
코드 복사
public interface Constants {
int MAX_VALUE = 100;
}
인터페이스의 사용 예
인터페이스는 주로 다음과 같은 용도로 사용됩니다:
다형성: 인터페이스를 통해 서로 다른 클래스들이 동일한 메서드 집합을 구현함으로써, 다양한 객체를 동일한 방식으로 다룰 수 있습니다.
클래스와의 분리: 인터페이스를 사용하면 클래스의 구현과 관계없이 공통된 기능을 정의할 수 있습니다. 이는 코드의 모듈화와 유지보수를 용이하게 합니다.
API 설계: 인터페이스는 API를 설계할 때, 구체적인 구현에 의존하지 않고 추상적인 동작을 정의하는 데 유용합니다.
예제:
java
코드 복사
public interface Drawable {
void draw();
}
public class Circle implements Drawable {
@Override
public void draw() {
System.out.println("Drawing a circle.");
}
}
public class Square implements Drawable {
@Override
public void draw() {
System.out.println("Drawing a square.");
}
}
public class Main {
public static void main(String[] args) {
Drawable[] shapes = { new Circle(), new Square() };
for (Drawable shape : shapes) {
shape.draw(); // 다형성: 각 객체의 draw() 메서드 호출
}
}
}
인터페이스와 추상 클래스 비교
인터페이스와 추상 클래스는 비슷한 목적을 가지고 있지만, 다음과 같은 차이점이 있습니다:
다중 상속: 인터페이스는 다중 상속을 지원하지만, 추상 클래스는 단일 상속만 지원합니다.
구현: 인터페이스는 기본적으로 메서드의 시그니처만 정의하고, 메서드의 구현은 포함하지 않습니다. 반면, 추상 클래스는 메서드의 구현을 포함할 수 있습니다.
필드: 인터페이스의 필드는 상수만 정의할 수 있으며, 추상 클래스는 일반 필드와 메서드, 그리고 추상 메서드를 정의할 수 있습니다.
사용 목적: 인터페이스는 주로 다양한 클래스들이 공통된 동작을 구현하도록 할 때 사용하며, 추상 클래스는 공통된 필드와 메서드를 여러 서브클래스에 제공할 때 사용됩니다.
요약
인터페이스는 클래스에 특정 메서드의 구현을 강제하고, 여러 클래스에서 공통된 기능을 정의할 때 사용됩니다.
다중 상속을 지원하며, 디폴트 메서드와 정적 메서드를 통해 기본 구현을 제공할 수 있습니다.
상수를 정의할 수 있으며, 다형성을 지원하여 다양한 객체를 동일한 방식으로 다룰 수 있게 합니다.
인터페이스를 통해 자바 프로그램의 유연성과 확장성을 높이고, 다양한 클래스 간의 통일된 동작을 정의할 수 있습니다.
카테고리 없음