본문 바로가기

Java

[Java] 인터페이스(interface)

728x90

Java에서는 다중 상속을 직접적으로 지원하지 않지만, 인터페이스를 활용하면 여러 개의 인터페이스를 구현함으로써 다중 상속의 효과를 얻을 수 있습니다. 인터페이스는 주로 클래스들 간의 공통된 기능을 정의하거나 규격을 정해주는 역할을 하며, 다양한 방식으로 활용될 수 있습니다. 본 글에서는 Java에서 인터페이스의 정의와 사용법을 쉽게 설명하고, 인터페이스 구현에 대한 예시를 통해 실용적인 이해를 돕겠습니다.


1. 인터페이스 (Interface)란?

인터페이스는 Java에서 추상 메소드와 상수만을 포함할 수 있는 특수한 형태의 클래스입니다. 인터페이스를 구현한 클래스는 인터페이스에 선언된 메소드들을 반드시 구현해야 합니다. 이를 통해 다중 상속을 가능하게 하여 다양한 기능을 추가할 수 있습니다.

  • 특징
    • 추상 메소드만 포함: 인터페이스 내의 메소드는 반드시 구현부 없이 선언만 되어 있어야 하며, 구현은 구현 클래스에서 해야 합니다.
    • 상수만 포함: 인터페이스는 기본적으로 상수만을 가질 수 있습니다.
    • 다중 구현 가능: 하나의 클래스가 여러 개의 인터페이스를 구현할 수 있습니다.
    • JDK 8 이상에서는 default 메소드static 메소드도 포함할 수 있게 되었습니다.

 

2. 인터페이스 작성법

인터페이스는 interface 키워드를 사용하여 정의합니다. 기본적으로 인터페이스 내에 정의된 필드는 **public static final**로 처리되며, 메소드는 **public abstract**로 처리됩니다.

public interface 인터페이스명 {

    // 상수 (public static final 생략 가능)
    public static final 타입 상수명 = 값;

    // 추상 메소드 (public abstract 생략 가능)
    public abstract 메소드명(매개변수1, 매개변수2...);
}


✅ 인터페이스의 모든 필드는 public static final 이어야 함

-> 일반 필드로 작성하여도 컴파일시 자동으로 public static final를 붙여 생성 됨


✅ 인터페이스의 모든 메소드는 public static abstract 이어야 함

-> 일반 메소드로 작성하여도 컴파일시 자동으로 public static abstract를 붙여 생성 됨

 

 

3. 인터페이스 구현법

인터페이스는 클래스에서 implements 키워드를 사용하여 구현할 수 있습니다. 또한, 다중 구현도 가능합니다. 클래스가 인터페이스를 구현하면 인터페이스 내의 모든 추상 메소드를 구현해야 합니다.

 

단일 구현 예시

class 클래스명 implements 인터페이스명 {
    // 인터페이스의 모든 추상 메소드를 구현해야 함
}

 

다중 구현 예시

class 클래스명 implements 인터페이스명1, 인터페이스명2, 인터페이스명3 {
    // 여러 개의 인터페이스 메소드 구현
}


⭐ 자바의 상속과 인터페이스의 구현을 동시 진행

class 클래스명 extends 부모클래스명 implements 인터페이스명{
    ...
}

 


4. 인터페이스 사용 예시

DrawbleMovable 인터페이스를 정의하고, 이를 각각 Circle 클래스와 DigitalPic 클래스에서 구현하는 예시를 보겠습니다.

 

Drawble 인터페이스

public interface Drawble {

    // interface에 일반 필드로 작성하면 JVM이 알아서 변경
    int MAX = 100; // 그림을 그릴수 있는 최대 숫자. public static final int MAX = 100;

    // interface에 일반 메소드로 작성하면 JVM이 알아서 변경
    public void drawPrint(String msg); // public abstract void drawPrint(String msg);
    public void setColor(String color); // public abstract void setColor(String color);

    // 인스턴스 메소드 (jdk8~)
    public default void printInfo(){
        System.out.println("Drawble 인터페이스의 printInfo() 호출!");
    }

    // static 메소드
    public static void staticMethod() {
        System.out.println("Drawble 인터페이스의 staticInfo() 호출!");
    }
}

Movable 인터페이스

public interface Movable {
    int MIN = 1;

    public void move(int x, int y); // 인터페이스 구현하는 클래스에서 구현해야하는 추상메소드
    public void test(); 

    public default void printMove() { // 인스턴스 메소드
        System.out.println("Movable 인터페이스의 printMove() 호출!");
    }

    public static void printMove2() { // static 메소드. 객체생성없이 사용가능(클래스명.printMove2())
        System.out.println("Movable 인터페이스의 printMove2() 호출!");
    }
}

 

5. 인터페이스 구현 예시

Movable 인터페이스를 구현한 DigitalPic 클래스

public class DigitalPic implements Movable {

    String tools = "컴퓨터";

    @Override
    public void move(int x, int y) {
        System.out.println("DigitalPic Move : (" + x + ", " + y + ")");
    }

    @Override
    public void test() {
        System.out.println("테스트 모드로 그림을 그립니다.");
    }
}

 

Drawble 인터페이스를 구현한 Circle 클래스

public class Circle implements Drawble{

    double radius = 10.0; // 반지름
    String background;

    @Override
    public void drawPrint(String msg) {
        System.out.println("msg : " + msg);
        System.out.println("면적 : " + (radius * radius * Math.PI));
    }

    @Override
    public void setColor(String color) {
        this.background = color;
        System.out.println(color + "색상으로 배경을 설정함");
    }
}

 

Movable, Drawble 인터페이스를 모두 구현한 Shape 클래스

public class Shape implements Drawble, Movable { // Drawble, Movable의 추상메소드를 모두 구현해야 함

    String name = "도형";

    @Override
    public void drawPrint(String msg) {
        System.out.println("Shape drawPrint() 호출 : " + msg);
    }

    @Override
    public void setColor(String color) {
        System.out.println("Shape setColor() 호출 : " + color);
    }

    @Override
    public void move(int x, int y) {
        System.out.println("Shape move() 호출 : " + x + ", " + y);
    }

    @Override
    public void test() {
        System.out.println("Shape test() 호출");
    }
}

 

5. 인터페이스 구현 예시

public class Main2 {
    public static void main(String[] args) {
//        Drawble drawble = new Drawble(); 에러. 인터페이스는 객체생성을 하지 못함. 메소드를 구현해야함.
        Circle circle = new Circle();
        circle.drawPrint("원의 넓이를 구함.");
        circle.setColor("초록");
        circle.printInfo(); // 인스턴스 메소드 호출

        DigitalPic digitalPic = new DigitalPic();
        digitalPic.move(4, 8);
        digitalPic.test();

        Shape shape = new Shape();
        shape.move(5,7);
        shape.test();
        shape.drawPrint("도형을 그리고 있음");
        shape.setColor("핑크");

        Drawble drawble = new Shape();
//        drawble.move(10,3); // Drawble 인터페이스에서 생성한 메소드만 사용가능
//        drawble.test(); // Drawble 인터페이스에서 생성한 메소드만 사용가능
        drawble.drawPrint("그림을 그립니다.");
        drawble.setColor("골드");

        Movable movable = new Shape();
//        movable.drawPrint("그림을 그립니다."); // movable 인터페이스에서 생성한 메소드만 사용가능
//        movable.setColor("골드"); // movable 인터페이스에서 생성한 메소드만 사용가능
        movable.move(10,3);
        movable.test();

        // static으로 처리된 필드와 메소드. 객체 생성하지 않아도 사용가능
        System.out.println("MAX : " + Drawble.MAX);
        Drawble.staticMethod();
        Movable.printMove2();

    }
}

마무리

인터페이스는 Java에서 매우 중요한 개념으로, 다중 상속을 구현하는 유용한 도구입니다. 인터페이스를 사용하면 서로 다른 클래스들 간에 공통된 규격을 정의할 수 있으며, 이를 통해 더 유연하고 재사용 가능한 코드를 작성할 수 있습니다. default 메소드static 메소드도 지원되면서 더욱 강력한 기능을 제공하므로, 실제 프로젝트에서 자주 사용될 수 있습니다.

인터페이스를 적절히 활용하여, 다양한 클래스를 효율적으로 설계하고 구현하는 방법을 익혀보세요.

728x90

'Java' 카테고리의 다른 글

[Java] 예제1 - 영어 단어장  (0) 2022.04.17
[Java] 컬렉션 프레임워크  (0) 2022.04.17
[Java] 추상 클래스 (Abstract Class)  (0) 2022.04.14
[Java] 래퍼 클래스(Wrapper Class)와 제네릭  (0) 2022.04.14
[Java] 접근 제어자  (0) 2022.04.13