본문 바로가기
JAVA

Java 인터페이스 알아보자

by 얍얍1234 2023. 10. 2.

자바(Java)는 객체 지향 프로그래밍(OOP) 언어로서, 다중 상속을 지원하지 않지만 인터페이스(Interface)라는 강력한 개념을 통해 다중 상속의 장점을 취하고, 추상화와 다형성을 극대화할 수 있습니다.

이 글에서는 Java 인터페이스의 개념, 사용 방법, 다형성, 그리고 실제 예제를 통해 살펴보겠습니다.


1. 인터페이스란?

인터페이스는 자바에서 클래스와는 달리 멤버 변수(필드)를 가질 수 없으며, 오로지 추상 메서드와 상수(final 변수)만을 정의할 수 있는 특별한 종류의 참조 타입입니다. 다음과 같은 특징을 가집니다.

- 모든 메서드는 추상 메서드로 선언되어 있어 메서드의 구현부가 없습니다.
- 모든 필드는 상수(final)로 선언되며, 변경이 불가능합니다.
- 인터페이스는 다른 클래스에서 구현(implement)될 수 있습니다.
- 다중 상속을 흉내내는 다중 인터페이스 구현이 가능합니다.

자바에서는 인터페이스를 사용하여 추상화된 틀을 정의하고, 이를 구현한 클래스들이 특정 동작을 보장하도록 합니다.

 

2. 인터페이스의 정의와 사용

2.1. 인터페이스 정의


인터페이스는 interface 키워드를 사용하여 정의됩니다. 아래는 간단한 예제입니다.

interface Animal {
    void makeSound();
}


Animal 인터페이스는 makeSound 라는 추상 메서드를 정의하고 있습니다.


2.2. 인터페이스 구현


인터페이스는 클래스에서 implements 키워드를 사용하여 구현할 수 있습니다. 구현하는 클래스는 인터페이스의 모든 추상 메서드를 오버라이딩(구현)해야 합니다.

class Dog implements Animal {
    @Override
    public void makeSound() {
        System.out.println("멍멍!");
    }
}

 

 

Dog 클래스는 Animal 인터페이스를 구현하고 있으며, makeSound 메서드를 구체적으로 구현하고 있습니다.


2.3. 다중 인터페이스 구현

자바에서는 클래스가 여러 개의 인터페이스를 구현할 수 있습니다. 이를 통해 다중 상속의 장점을 활용할 수 있습니다.

interface Flyable {
    void fly();
}

class Bird implements Animal, Flyable {
    @Override
    public void makeSound() {
        System.out.println("짹짹!");
    }

    @Override
    public void fly() {
        System.out.println("날다!");
    }
}

 

Bird 클래스는 Animal 인터페이스와 Flyable 인터페이스를 모두 구현하고 있으며, 각각의 메서드를 구체적으로 구현하고 있습니다.

 

 

3. 다형성과 인터페이스

 

다형성(Polymorphism)은 객체 지향 프로그래밍의 중요한 개념 중 하나로, 인터페이스와 밀접한 관련이 있습니다. 인터페이스를 활용하면 서로 다른 클래스가 동일한 인터페이스를 구현할 수 있으므로, 이를 통해 다형성을 실현할 수 있습니다.

public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();
        Animal bird = new Bird();

        dog.makeSound(); // "멍멍!" 출력
        bird.makeSound(); // "짹짹!" 출력
    }
}



위 예제에서 dog 와 bird 는 모두 Animal 인터페이스를 구현한 객체이므로, 동일한 makeSound 메서드를 호출할 수 있습니다. 이것이 다형성의 예입니다.


4. 인터페이스의 활용

4.1. 코드 재사용성

인터페이스를 사용하면 코드의 재사용성을 높일 수 있습니다. 여러 클래스가 동일한 인터페이스를 구현하면, 해당 인터페이스를 사용하는 코드는 이들 클래스를 동일한 방식으로 다룰 수 있습니다.


4.2. 다중 상속 구현

자바에서는 클래스의 다중 상속을 지원하지 않습니다. 하지만 인터페이스를 활용하면 다중 인터페이스 구현을 통해 다중 상속의 장점을 얻을 수 있습니다.


4.3. 설계와 유지보수

인터페이스를 사용하면 설계를 개선하고 유지보수를 쉽게 할 수 있습니다. 인터페이스를 사용하여 코드의 결합도를 낮추고, 클래스 간의 의존성을 관리할 수 있습니다.

 


5. 인터페이스 vs. 추상 클래스

인터페이스와 추상 클래스는 모두 추상화를 구현하는데 사용됩니다. 그러나 각각의 특징과 용도가 다릅니다.


5.1. 인터페이스


- 모든 멤버는 public이고, 추상 메서드 또는 상수(final 필드)만을 가질 수 있습니다.
- 다중 인터페이스 구현이 가능하며, 다중 상속을 대체합니다.
- 구현체가 다양한 클래스에 의해 공유될 수 있도록 설계됩니다.
- 인터페이스를 구현한 클래스들은 클래스 계층 구조와 독립적입니다.


5.2. 추상 클래스


- 멤버 변수와 일반 메서드를 가질 수 있으며, 추상 메서드도 포함할 수 있습니다.
- 단일 상속만 지원하며, 클래스 계층 구조를 설계하는데 사용됩니다.
- 구현체가 특정 클래스 계층에 종속될 수 있도록 설계됩니다.
- 추상 클래스를 상속하는 클래스들은 클래스 계층 구조 내에서 특정 위치에 위치합니다.

 


6. 결론

인터페이스는 자바에서 추상화와 다형성을 극대화하는 강력한 도구로, 객체 지향 프로그래밍의 핵심 원리 중 하나인 추상화를 구현하는 데 중요한 역할을 합니다. 인터페이스를 활용하면 코드의 재사용성을 높이고, 다중 상속의 장점을 취하며, 설계와 유지보수를 개선할 수 있습니다.

따라서 자바 개발자에게 인터페이스의 개념과 활용법을 숙지하는 것은 중요한 스킬 중 하나이며, 객체 지향 프로그래밍의 핵심을 이해하는 데 도움이 될 것입니다.