Sam Story

JAVA - 인터페이스 본문

JAVA

JAVA - 인터페이스

Sam H 2024. 11. 22. 16:06

오늘은 인터페이스에 대해 포스팅 해보려 한다.

 

객체 지향 프로그래밍의 추상화를 배우고 추상 클래스를 접해봤다면

그 다음 접해보는 것이 인터페이스(Interface) 일 것이다.

 

인터페이스는 간단히 말하자면 프로그램을 설계하고 조금 더 유연한 프로그램을 만드는 기법을 말한다.

인터페이스는 추상화와 상속과 더불어 다형성이라는 객체 지향의 특징을 구현하는 핵심이다.

 

인터페이스(Interface) 라는 용어는 꼭 자바(java)에만 있는 것이 아니다.

사용자가 기기를 쉽게 동작시키는데 도움을 주는 상호작용 시스템을 의미한다.

우리가 자주 사용하는 단어인 UI도 (User Interface)의 약자이다.

 

핸드폰으로 보는 화면도 인터페이스가 될 수 있고

컴퓨터로 보는 아이콘들도 인터페이스가 될 수 있다.

그렇기 때문에 우리가 별도로 프레임워크를 공부하지 않아도 이런 장치들을

편하게 이용할 수 있다.

 

 

왜 인터페이스를 사용해야 하는가?

우리가 반복되는 코드들을 줄이기 위해 for문 이나 while문을 사용하듯이, 

인터페이스를 사용하는 목적은 설계상 이점을 위해 사용하는 클래스라고 말할수 있다.

 

설계 관점에서 프로그래밍을 할 때는 큰 틀을 볼 수 있어야 한다.

이유없는 설계는 없기 때문에 큰 틀이 있기에 이렇게 짜여져 있구나 하는 접근이 필요하다.

 

 

인터페이스 정의

인터페이스는 추상클래스와 마찬가지로 자체적으로는 인스턴스를 생성할 수 없다.

추상클래스가 상속을 통해 완성되듯이 인터페이스도 구현부를 만들어주는 클래스에 구현되어야 한다.

 

해당 클래스에 implements 키워드를  쓴 후에 구현할 인터페이스를 나열하면 된다.

인터페이스에 가장 큰 특징은 다중 상속이 가능하다는 것이다.

 

ex ) 자식클래스에 extends 와 implements는 동시에 가능하며

implements에 여러 인터페이스를 나열 할 수 있다.

 

 

인터페이스에서 정의할 수 있는건 4가지 이다.

 

Human Interface

public interface Human {

    // 염색체 수 모든 인간은 46개의 염색체를 갖는다.
    int CHROMOSOME_COUNT = 46; // 상수 (제공해주는 값만 참조 가능)

    // 먹기 메서드
    abstract void eat(); // 추상메서드 (틀 자체는 있고 추상메서드를 구현부에서 무조건 재구현 해야함)

    // 말하기 메서드
    default void speak() { // 기본메서드 (인터페이스에서 기본적으로 제공해주지만 재구현 가능)
        System.out.println("사람은 말을 한다.");
    }

    // 숨쉬기 메서드
    static void breath() { // 정적 메서드 (변하지 않는 공통된 동작을 정의)
        System.out.println("사람은 숨을 쉰다.");
    }
}

 

1. 상수 : 말 그대로 변하지 않는 상수이며 값을 변경할 수 없고 제공해주는 값만 참조 가능하다.

2. 추상메서드 : 메서드 틀만 제공하며 구현부에서 무조건 구현해야하는 메서드.

3. 기본메서드 : 인터페이스에서 제공해주는 메서드이며 필요하다면 override해서 수정 가능하다.

4. 정적메서드 : static을 사용해 객체를 생성하지 않아도 호출할 수 있는 정적메서드 이다.

 

 

이러한 인터페이스를 지난번 예제에 적용해보자.

 

Character class

public abstract class Character {
    abstract void skill();
    abstract void useItem();
}

 

만드는 게임이 온라인을 지원하게 되었고 새롭게 온라인 유저가 갖는

속성들이 필요하게 되었다고 가정해보자.

 

 

OnlineUser Interface

public interface OnlineUser {
    void userInfo();
    void payment();
    void sendMessage(Character character);
}

 

온라인 유저 인터페이스를 만들어

온라인 유저만 이용할 수 있는 기능들을 인터페이스로 구현할 수 있다.

 

 

Character class

public abstract class Character implements OnlineUser {

    // 상위 클래스에서 작성했지만 경우에 따라서
    // Character class 를 상속받는 하위 클래스에서 작성 가능
    @Override
    public void userInfo() {
        System.out.println("유저 정보를 받아옵니다.");
    }

    @Override
    public void payment() {
        System.out.println("결제 정보를 받아옵니다.");
    }

    abstract void skill();
    abstract void useItem();
}

 

위 코드처럼 기존 추상클래스로 작성했기 때문에

인터페이스를 통해 간단히 확장할 수 있다.

 

인터페이스에 선언해놓은 메서드는 Character class를 상속받는

class가 있다면 무조건 구현부에서 구현을 해줘야한다.

 

 

 

이렇게 인터페이스를 사용하게 되면 클래스의 선언과 구현을 분리시킬 수 있다.

실제 구현에 굉장히 독립적인 프로그램을 작성하는것이 가능해진다.

 

또한 프로젝트에 사용되는 기본 틀을 인터페이스로 작성한 다음

개발자들에게 인터페이스를 구현하여 프로그램을 짜도록 하다 보면

보다 일관되고 정형화된 프로그램의 개발이 가능하다.

'JAVA' 카테고리의 다른 글

Java - JVM 메모리 구조 , Stack, Heap  (1) 2024.12.04
JAVA - Stack  (1) 2024.11.30
JAVA - 추상클래스  (0) 2024.11.21
JAVA - 의존 역전 원칙  (2) 2024.10.20
JAVA - 인터페이스 분리 원칙  (1) 2024.10.16