인터페이스
개발코드와 객차가 서로 통신하는 접점 역할을 함. 개발 코드가 인터페이스의 메소드를 호출하면 인터페이스는 객체의 메소드를 호출시킴. 그렇기 때문에 개발 코드는 객체의 내부 구조를 알 필요가 없고 인터페이스의 메소드만 알고 있으면 됨
- 하나의 객체가 아니라 여러 객체들과 사용이 가능하므로 어떤 객체를 사용하느냐에 따라서 실행 내용과 리턴값이 다름.
- 인터페이스 선언
- [public ] interface 인터페이스이름 {***}
- 객체 사용 방법을 정의한 것이므로 인스턴스 또는 정적 필드를 선언할 수 없음
- 그래서 상수필드는 선언이 가능함 → public static final
- 인터페이스에 선언된 메소드는 전부 다 '추상메소드(abstract)'임
- 전역 접근 방식 제공 : static 메서드를 통해 객체를 가져오도록 함
- 사용하는 이유
- 다형성 지원(Polymorphism)
하나의 인터페이스로 여러 개의 구현체를 다룰 수 있어 코드의 확장성이 증가 - 코드의 결합도(Dependency) 감소
실제 구현 클래스에 의존하지 않고, 인터페이스를 통해 객체를 다룰 수 있음 - 유지보수 쉬워짐 - 실행 시점에서 결정됨(동적 바인딩)
- 기능을 명확하게 명시
- 다형성 지원(Polymorphism)
- 다형성 적용
- 메서드 호출 시 적용되는 개념
- 같은 인터페이스(또는 부모 클래스) 타입의 변수를 통해 다른 객체가 들어와도 그 객체의 메서드가 호출될때 각각 다른 동작을 수행하는 것
- 표준화 제공
📌 인터페이스 vs 상속 (extends) 차이점
인터페이스 (implements)상속 (extends)
| 목적 | 기능(행동)의 규약(설계도) 제공 | 기존 클래스의 코드 재사용 & 확장 |
| 다중 구현 가능 여부 | ✅ 가능 (Java에서는 여러 개의 인터페이스를 구현 가능) | ❌ 불가능 (Java는 단일 상속만 지원) |
| 메서드 구현 여부 | 메서드 선언만 존재 (구현 X, 단 Java 8부터 default 메서드 가능) | 부모 클래스의 메서드를 상속받아 사용 가능 (재정의 가능) |
| 필드(변수) 포함 여부 | 필드 가질 수 없음 (상수만 가능 static final) | 필드(변수) 가질 수 있음 |
| 접근 제한자 | 기본적으로 public (모든 구현 클래스에서 사용 가능) | private, protected, public 등 다양한 접근 제한자 사용 가능 |
| 사용 예시 | 여러 개의 클래스에서 같은 기능을 강제하고 싶을 때 (ex. Animal 인터페이스) | 기존 클래스의 기능을 확장하고 싶을 때 (ex. Mammal → Dog) |
📌 언제 상속을 쓰고, 언제 인터페이스를 써야 할까?
✅ 인터페이스 사용하면 좋은 경우✅ 상속 사용하면 좋은 경우
| 여러 개의 클래스에서 같은 동작(메서드)을 강제하고 싶을 때 | 기존 클래스를 확장하고 새로운 기능을 추가하고 싶을 때 |
| 특정 행동을 표준화(규칙화)하고 싶을 때 | 부모 클래스의 기능을 그대로 가져와서 쓰고 싶을 때 |
| 다중 구현이 필요할 때 | 부모 클래스의 공통 필드(변수)와 메서드를 공유하고 싶을 때 |
예제 코드
interface Animal {
void makeSound();
void move(); // 두 번째 기능 추가
}
class Dog implements Animal {
public void makeSound() {
System.out.println("멍멍!");
}
public void move() {
System.out.println("네 발로 뛰어요!");
}
}
class Bird implements Animal {
public void makeSound() {
System.out.println("짹짹!");
}
public void move() {
System.out.println("날아다녀요!");
}
}
public class Main {
public static void main(String[] args) {
Animal myAnimal = new Dog();
myAnimal.makeSound(); // 출력: 멍멍!
myAnimal.move(); // 출력: 네 발로 뛰어요!
myAnimal = new Bird();
myAnimal.makeSound(); // 출력: 짹짹!
myAnimal.move(); // 출력: 날아다녀요!
}
}
'중앙정보기술인재개발원 > JAVA' 카테고리의 다른 글
| [JAVA] 예외 처리 | try ~ catch (1) | 2025.04.07 |
|---|---|
| [JAVA] 람다식(Lamda) (0) | 2025.04.07 |
| [JAVA] Linked List (3) | 2025.04.01 |
| [JAVA] 상속, 다형성 (0) | 2025.03.27 |
| [JAVA] Depdency, DI, Composition, Aggregation (1) | 2025.03.26 |