인터페이스(interface)를 사용하는 이유는 무엇일까?
일단 간단하게 말하면 인터페이스를 사용하면 변경에 유연하게 설계할 수 있다.
그럼 이제 인터페이스에 대해서 상세하게 알아보도록 하자.
인터페이스(interface)는 클래스 혹은 프로그램이 제공하는 기능을 명시적으로 선언하는 역할을 한다.
인터페이스는 추상 메서드와 상수로만 이루어져 있는데, 구현된 코드가 없기 때문에 당연히 인터페이스로 인스턴스를 생성할 수도 없다.(Java 7까지만)
다음은 인터페이스를 구현해 보는 예제다.
interface Calc{ // Calc 인터페이스 선언: 계산기에 필요한 기본 기능을 정의한다.
double PI = 3.14;
int ERROR = -9999999;
int add(int num1, int num2);
int substract(int num1, int num2);
}
class Calulator implements Calc{// Calculator 클래스는 Calc 인터페이스를 구현(implements)함
// add 메서드 구현: 두 정수를 더한 결과 반환
@Override
public int add(int num1, int num2){
return num1 + num2;
}
// substract 메서드 구현: 두 정수를 뺀 결과 반환
@Override
public int substract(int num1, int num2){
return num1 - num2;
}
public class Main {
public static void main(String[] args) {
// 인터페이스 타입으로 구현 객체 생성 → 다형성
Calc calc = new Calculator();
System.out.println("5 + 3 = " + calc.add(5, 3));
System.out.println("5 - 3 = " + calc.substract(5, 3));
System.out.println("PI = " + Calc.PI);
}
}
implements: 인터페이스에서는 인터페이스에 선언한 기능을 클래스가 구현한다는 의미로 implements 예약어를 사용한다.
인터페이스를 상속받았으면, 자식 클래스에서 인터페이스가 포함하고 있는 추상 메서드를 구체적으로 구현해 준다.
인터페이스의 가장 큰 특징은 여러 개를 다중 구현(다중 상속)이 가능하다는 것인데, 자식 클래스에 클래스 상속(extends)과 인터페이스 구현(implements)은 동시에 가능하다.
인터페이스 일부 구현(추상 클래스)
interface Calc{
double PI = 3.14;
int ERROR = -9999999;
int add(int num1, int num2);
int substract(int num1, int num2);
int times(int a, int b); // 추가됨
int divide(int a, int b); // 추가됨
}
class Calulator implements Calc{
// times, divide가 구현되어 있지 않으므로 오류가 발생한다.
@Override
public int add(int num1, int num2){
return num1 + num2;
}
@Override
public int substract(int num1, int num2){
return num1 - num2;
}
}
위 코드에서는 오류가 난다. 그 이유를 알아보자
인터페이스는 모든 메서드를 구현해야 한다는 규칙이 있다.
그런데 times()랑 divide()가 구현되지 않았기 때문에 컴파일 오류가 난다.
해결방법은 두 가지 있다.
1. 모든 메서드를 구현하는 방법
2. 추상클래스로 선언하고 일부만 구현한다.
abstract class Calculator implements Calc{}
2-1 이 방법을 쓴다면 Calculator 자체는 객체를 만들 수 없다.
2-2 Calculator를 상속한 클래스가 나머지를 구현해야만 인스턴스 생성이 가능하다.
인터페이스의 장점
1. 표준화된 설계 제공
• 인터페이스는 "이 기능은 반드시 제공되어야 해"라는 약속/규칙을 만들 수 있다.
• 클래스들이 같은 인터페이스를 구현하면 일관된 형태의 기능을 제공하게 된다.
2. 다형성을 쉽게 구현할 수 있다.
• 인터페이스를 구현한 여러 객체를 같은 타입으로 다룰 수 있다.
• 객체의 종류가 달라도 동일한 방식으로 사용 가능하다.
3. 느슨한 결합
• 인터페이스로 코딩하면 구체적인 클래스에 의존하지 않는다.
• 나중에 클래스가 변경되거나 교체되더라도 인터페이스만 지키면 문제없다.
4. 유지보수 및 확장성향상
• 기존 코드를 거의 수정하지 않고, 새로운 기능이나 클래스 추가 가능하다.
• 개발 중 팀 간 역할 분담도 쉬우며, 인터페이스 먼저 설계하고 구현은 나중에 하자는 식으로도 가능하다.
5. 다중 구현 가능
• 자바는 클래스 간 다중 상속은 불가능하지만, 인터페이스는 여러 개를 동시에 구현 가능하다.
'오늘의 주제' 카테고리의 다른 글
Primary key와 Foreign key의 차이와 각각의 역할 (0) | 2025.04.29 |
---|---|
SQL 명령문의 실행 순서 과정 (1) | 2025.04.28 |
GC(가비지 컬렉션)이란 무엇일까? (1) | 2025.04.20 |
자바의 메서드 오버로딩과 오버라이딩에 대한 것 (1) | 2025.04.17 |
자바의 주요 특징은 무엇인가? (1) | 2025.04.17 |