웹(WEB)/자바(Java)

[Java] 자바 인터페이스

마달랭 2024. 12. 30. 01:06
반응형

개요

자바에서 인터페이스 (Interface)는 추상적인 행동을 정의하는 데 사용되는 타입이다.

인터페이스는 메서드의 시그니처만을 정의하고, 그 메서드들이 실제로 어떻게 동작하는지는 구현 클래스에서 정의한다.

인터페이스는 다형성, 코드의 재사용성, 유연성을 제공하는 중요한 자바의 특징 중 하나이다.

 

인터페이스는 주로 클래스들 간에 공통된 행동을 강제하기 위해 사용된다.

클래스는 인터페이스를 구현 (implement)함으로써 그 인터페이스에 정의된 메서드를 반드시 구현해야한다.

 

인터페이스의 주요 특징

  1. 추상 메서드만 포함: 인터페이스는 추상 메서드만 포함할 수 있다. (단, Java 8부터는 default 메서드와 static 메서드도 추가 가능)
  2. 다중 상속: 자바에서 클래스는 다중 상속을 지원하지 않지만, 인터페이스는 다중 상속이 가능하다. 즉, 하나의 클래스는 여러 인터페이스를 구현할 수 있습니다.
  3. 메서드 구현이 아닌 시그니처만: 인터페이스에서 정의한 메서드는 실제 구현을 포함하지 않고, 시그니처만 제공한다. 해당 메서드는 인터페이스를 구현한 클래스에서 구현된다.
  4. 상수: 인터페이스 내의 모든 필드는 자동으로 public static final이 된다. 즉, 상수로 취급된다.
  5. 다형성 구현: 인터페이스를 사용하면 서로 다른 클래스들이 동일한 메서드 시그니처를 사용하도록 강제할 수 있어, 다형성을 구현할 수 있다.

 

인터페이스의 주요 구성 요소

 

  • 추상 메서드 (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) 인스턴스 변수와 상수를 모두 가질 수 있음
다중 상속 다중 상속 지원 다중 상속을 지원하지 않음

 

따라서 필요에 맞게 인터페이스와 추상 클래스 중 선택하여 사용해야 한다.

 

728x90
반응형

'웹(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