개요
자바에서 인터페이스 (Interface)는 추상적인 행동을 정의하는 데 사용되는 타입이다.
인터페이스는 메서드의 시그니처만을 정의하고, 그 메서드들이 실제로 어떻게 동작하는지는 구현 클래스에서 정의한다.
인터페이스는 다형성, 코드의 재사용성, 유연성을 제공하는 중요한 자바의 특징 중 하나이다.
인터페이스는 주로 클래스들 간에 공통된 행동을 강제하기 위해 사용된다.
클래스는 인터페이스를 구현 (implement)함으로써 그 인터페이스에 정의된 메서드를 반드시 구현해야한다.
인터페이스의 주요 특징
- 추상 메서드만 포함: 인터페이스는 추상 메서드만 포함할 수 있다. (단, Java 8부터는 default 메서드와 static 메서드도 추가 가능)
- 다중 상속: 자바에서 클래스는 다중 상속을 지원하지 않지만, 인터페이스는 다중 상속이 가능하다. 즉, 하나의 클래스는 여러 인터페이스를 구현할 수 있습니다.
- 메서드 구현이 아닌 시그니처만: 인터페이스에서 정의한 메서드는 실제 구현을 포함하지 않고, 시그니처만 제공한다. 해당 메서드는 인터페이스를 구현한 클래스에서 구현된다.
- 상수: 인터페이스 내의 모든 필드는 자동으로 public static final이 된다. 즉, 상수로 취급된다.
- 다형성 구현: 인터페이스를 사용하면 서로 다른 클래스들이 동일한 메서드 시그니처를 사용하도록 강제할 수 있어, 다형성을 구현할 수 있다.
인터페이스의 주요 구성 요소
- 추상 메서드 (Abstract Method)
- 상수 (Constant)
- default 메서드 (Java 8 이상)
- static 메서드 (Java 8 이상)
인터페이스 내에서 선언된 메서드는 추상 메서드로, 구현체를 제공하지 않는다. 예: void sound();
인터페이스 내에 정의된 변수는 자동으로 public static final으로 간주되므로 상수로 취급된다. 예: int MAX_SPEED = 100;
default 키워드를 사용하면 인터페이스에서 메서드의 구현을 제공할 수 있다.
default 메서드는 인터페이스에 기본 구현을 제공하되, 이를 구현한 클래스에서 필요에 따라 오버라이드할 수 있다.
static 키워드를 사용하면 인터페이스 내에서 정적 메서드를 정의할 수 있다.
static 메서드는 인터페이스 이름으로 직접 호출할 수 있다.
인터페이스 정의
인터페이스는 interface 키워드를 사용하여 정의한다.
인터페이스 내의 메서드는 기본적으로 abstract 메서드이며, 구현을 제공하지 않는다.
// 인터페이스 정의
public interface Animal {
void sound(); // 추상 메서드 (구현하지 않음)
void eat(); // 또 다른 추상 메서드
}
인터페이스 구현
클래스는 implements 키워드를 사용하여 인터페이스를 구현한다.
인터페이스에서 정의된 모든 메서드는 반드시 구현해야한다.
// 인터페이스 구현
public class Dog implements Animal {
@Override
public void sound() {
System.out.println("Bark");
}
@Override
public void eat() {
System.out.println("Dog eats");
}
}
public class Cat implements Animal {
@Override
public void sound() {
System.out.println("Meow");
}
@Override
public void eat() {
System.out.println("Cat eats");
}
}
인터페이스 사용
// 인터페이스 정의
interface Animal {
void sound(); // 추상 메서드 (구현하지 않음)
void eat(); // 또 다른 추상 메서드
}
// 인터페이스 구현
class Dog implements Animal {
@Override
public void sound() {
System.out.println("Bark");
}
@Override
public void eat() {
System.out.println("Dog eats");
}
}
class Cat implements Animal {
@Override
public void sound() {
System.out.println("Meow");
}
@Override
public void eat() {
System.out.println("Cat eats");
}
}
public class Main {
public static void main(String[] args) {
Animal dog = new Dog();
Animal cat = new Cat();
dog.sound(); // 출력: Bark
dog.eat(); // 출력: Dog eats
cat.sound(); // 출력: Meow
cat.eat(); // 출력: Cat eats
}
}
Dog와 Cat 클래스는 Animal 인터페이스를 구현하여 각각 sound()와 eat() 메서드를 정의한다.
Animal 타입으로 선언된 변수 dog와 cat은 각각 Dog와 Cat 객체를 참조하며, sound()와 eat() 메서드를 실행할 수 있다.
인터페이스 다중 상속
자바에서는 클래스의 다중 상속을 지원하지 않지만, 인터페이스는 다중 상속을 지원한다.
즉, 한 클래스가 여러 인터페이스를 구현할 수 있다.
interface Animal {
void sound();
}
interface Bird {
void fly();
}
public class Sparrow implements Animal, Bird {
@Override
public void sound() {
System.out.println("Chirp");
}
@Override
public void fly() {
System.out.println("Sparrow flies");
}
}
참새는 새이면서 동물에 속한다, 따라서 Animal 인터페이스의 함수 sound와 Bird 인터페이스의 함수 fly를 모두 오버라이딩 할 수 있다.
인터페이스와 추상 클래스의 차이
인터페이스와 추상 클래스는 유사해보인다.
따라서 왜 둘을 분류해 놓았는지 이해가 잘 가지 않을 수도 있다.
하기 표에 인터페이스와 추상 클래스의 차이를 명시해 두었다.
특성 | 인터페이스 | 추상 클래스 |
상속 | 여러 개의 인터페이스를 구현할 수 있음 | 한 번에 하나의 추상 클래스만 상속 가능 |
메서드 구현 | 추상 메서드만 존재 (Java 8 이상에서는 default 메서드 가능) | 추상 메서드와 일반 메서드를 모두 가질 수 있음 |
변수 | 상수만 가질 수 있음 (public static final) | 인스턴스 변수와 상수를 모두 가질 수 있음 |
다중 상속 | 다중 상속 지원 | 다중 상속을 지원하지 않음 |
따라서 필요에 맞게 인터페이스와 추상 클래스 중 선택하여 사용해야 한다.
'웹(WEB) > 자바(Java)' 카테고리의 다른 글
[Java] 자바 Enum (0) | 2024.12.31 |
---|---|
[Java] 자바 Generics (0) | 2024.12.30 |
[Java] 자바 Object 클래스 (0) | 2024.12.30 |
[Java] 자바 제한자 (0) | 2024.12.30 |
[Java] 자바 package, import (0) | 2024.12.29 |