Loading...

JAVA / / 2022. 1. 18. 16:41

자바 22강. 인터페이스

반응형

모니터 암을 만드는 회사는

모니터 베사홀의 크기 규격을 맞춰 만들어야 한다.

이게 인터페이스이다.

 

인터페이스는 프로토콜과 비교된다.

 

프로토콜이 합의하에 만들어지는 수평적인 약속이라면,

인터페이스에는 갑과 을의 관계가 나누어져

갑이 정한 규칙을 을에게 강제로 알려주는

수직적인 약속이다.

 

모니터를 만드는 업체가 모니터 암을 만드는 업체에게 강제성을 부여한 것이다.

 

그렇다면 인터페이스를 행위에 대한 강제성 때문에 사용할까?

그건 추상 클래스를 통해서도 가능하다.

추상화를 사용한 프로그램을 살펴보자.

 

자동차 설계도를 보면

 

모든 자동차는 바퀴 4개, 엑셀 1개, 브레이크 1개를 가지고 있고,

그리고 모든 자동차는 전진, 후진, 멈춤의 행위만 한다.

 

바퀴 4개, 엑셀 1개, 브레이크 1개는 공통적인 것이기 때문에

부모 클래스에서 정해놓았지만,

문의 개수는 자동차마다 다를 수 있기 때문에 구체적인 자식들이

직접 알려줘야 한다.

 

행위는 무조건 만들어야 하는 것이기 때문에

추상 메서드(abstract)로 만들어준다.

 

공통적인 것들을 추출하여 묶어 올리는 것이 추상화

-> 코드를 반복해서 적지 않아도 됨

 

인터페이스는 모든 추상화하지 못하는 오브젝트들의

공통 행위에 제약을 줄 때 사용한다.

 

추상 클래스는 추상화할 수 있는 틀이 하나 있어야 한다.

그러면 같은 부모로 묶이지 못하는 것들까지 강제성을 부여시킬 수 없다.

 

 

리어카가 추상화되는 부모에 추상 클래스를 만들고,

페라리와 제네시스가 추상화되는 자동차에 추상 클래스를 만들고,

오토바이가 추상화되는 부모에 추상 클래스를 만들면

코드가 매우 매우 복잡해지게 된다.

 

타입으로 추상화시킬 수는 없지만, 행위가 같은 클래스를 인터페이스로 묶을 수 있다.

 

인터페이스는 틀을 정의해두고 인터페이스로 묶인 클래스들에게

정의된 메서드를 무조건 만들어야 하는 강제성을 부여한다.

때문에 추상 메서드(abstract)를 사용해 오류가 나지 않도록 해준다.

 

인터페이스는 무조건 추상 메서드(abstract)만 만들 수 있다.

abstract를 생략해도 abstract 메서드로 생성이 된다.

 

추상 클래스는 일반 메서드도 생성이 가능하다는 점이 차이점이다. 

 

 

직접 인터페이스를 만들어보며 쉽게 이해해보자.

 

 

문법

 

상속 사용법 : abstract '자식'클래스 extends '부모'클래스

인터페이스 사용법 : interface '을'클래스 implements '갑'클래스

 

implements 구현

package ex12;

interface keymap {
    public abstract void q();

    public abstract void w();

    public abstract void e();

    public abstract void r();
}

class 알리스타 implements keymap {

    @Override
    public void q() {
        System.out.println("띄우기");
    }

    @Override
    public void w() {
        System.out.println("밀기");
    }

    @Override
    public void e() {
        System.out.println("스턴걸기");
    }

    @Override
    public void r() {
        System.out.println("방어력증가");
    }

}

class 티모 implements keymap {

    @Override
    public void q() {
        System.out.println("실명");
    }

    @Override
    public void w() {
        System.out.println("이속증가");
    }

    @Override
    public void e() {
        System.out.println("맹독발사");
    }

    @Override
    public void r() {
        System.out.println("버섯 폭탄 생성");
    }

}

public class TestEx01 {
    public static void main(String[] args) {
        keymap u1 = new 알리스타();
        keymap u2 = new 티모();

        u1.q();
        u2.q();
    }
}

 

인터페이스는 아래에서부터 공통적인 것들을 보는 것이 아니다.

 

q( ), w( ), e( ), r( ) 메서드 말고 다른 메서드는 쓰지 말자! 하고 인터페이스 정의한 후,

티모, 알리스타 같은 클래스들에게

무조건 q( ), w( ), e( ), r( ) 메서드만 만들게 강제성을 부여한 것이다.

 

만약 챔피언(클래스)에게 다른 일반 메서드를 만들어도 되냐고 물어본다면,

불가능하다.

 

하지만 다른 챔피언(클래스)들도 다른 t( ) 메서드가 필요하다면

새로운 t( ) 메서드를 만들지 고민해볼 테지만,

티모에게 t( ) 메서드가 필요 없다면 절대 새로 생성되지 않는다.

 

무조건 모두에게 필요할 때만 메서드가 생성된다.

 

만약 챔피언(클래스) 2명 빼고 98명이 t( ) 메서드가 필요하다면 어댑터 패턴을 사용한다.

나중에 배울 것이다.

 

즉, 위에서 정의하고 아래에 때린다는 말이다.

 

인터페이스가 수정되는 이유는 단 하나,

모든 클래스들이 필요한 기능일 때 추가된다.

 

인터페이스 : 자바 프로그래밍 언어에서 클래스들이 구현해야 하는 동작을

지정(강제)하는 데 사용하는 추상 자료형

 

 

 

[출처]

 

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

 

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 

반응형