[JAVA] interface

Coastby·2022년 8월 7일
0

JAVA

목록 보기
20/33

interface

어떤 객체가 있고 그 객체가 특정한 인터페이스를 사용한다면 그 객체는 반드시 인터페이스의 메소드들을 구현해야 한다. 만약 인터페이스에서 강제하고 있는 메소드를 구현하지 않으면 이 애플리케이션은 컴파일조차 되지 않는다.

○ 구조

interface I {
	public void z();
}

class A implements I {
	public void z() {}
}

interface I : 인터페이스를 선언할 때는 이름 앞에 interface를 붙인다. (클래스 선언할 때는 class를 붙이는 것처럼)

class A implements I : 클래스 A는 인터페이스 I를 구현한다고 한다. 클래스 A는 인터페이스 I의 멤버인 public void z() 메소드를 반드시 포함해야 한다.

○ 실질적인 쓰임

계산기 (A)를 만드는 개발자와 그 계산기를 이용해여 다른 서비스(B)를 만드는 개발자가 동시에 작업을 한다고 한다면 가짜 계산기 (dummy class)를 만들어서 B에 대입할 수 있다.

A와 dummy class의 매개변수가 다르다고 하면 문제가 생길 것이다.

이러한 실수를 방지하기 위해 인터페이스를 사용한다. A를 개발하는 개발자가 이 클래스가 가지고 있어야 할 메소드를 인터페이스로 만들어서 제공하는 것이다. 반대의 경우도 가능하다. 만드는 쪽에서 인터페이스를 제공하면 된다. 양쪽의 개발자는 이 인터페이스를 구현한 클래스 A와 dummy class를 각각 구현하면 된다.

협업에서 인터페이스를 사용하면 메소드 형태를 규약으로 공유하여, 각자가 상대의 일정이나 구현하는 방식에 덜 영향을 받으면서 애플리케이션을 구축할 수 있다.

계산기 예에서 사용될 인터페이스는 다음과 같다.

public interface Calculatable {
    public void setOprands(int first, int second, int third) ;
    public int sum(); 
    public int avg();
}

계산기를 이용해서 만들 서비스 (B)는 다음과 같다.

class CalculatorDummy implements Calculatable{
    public void setOprands(int first, int second, int third){
    }
    public int sum(){
        return 60;
    }
    public int avg(){
        return 20;
    }
}
public class CalculatorConsumer {
    public static void main(String[] args) {
        CalculatorDummy c = new CalculatorDummy();
        c.setOprands(10, 20, 30);
        System.out.println(c.sum()+c.avg());
    }
}

인터페이스를 구현한 계산기 (A)는 다음과 같다.

class Calculator implements Calculatable {
    int first, second, third;
    public void setOprands(int first, int second, int third) {
        this.first = first;
        this.second = second;
        this.third = third;
    }
    public int sum() {
        return this.first + this.second + this.third;
    }
    public int avg() {
        return (this.first + this.second + this.third) / 3;
    }
} 

인터페이스와 그 다음 단계 (B), 계산기(A) 모두 만들어지면 B에서 쓰던 dummy를 실제 로직인 A로 교체하기만 하면 된다.

public class CalculatorConsumer {
    public static void main(String[] args) {
        Calculator c = new Calculator();
        c.setOprands(10, 20, 30);
        System.out.println(c.sum()+c.avg());
    }
}

○ 인터페이스의 규칙

인터페이스의 멤버는 반드시 public이어야한다.

인터페이스는 그 인터페이스를 구현한 클래스를 어떻게 조작할 것인가를 규정한다. 그렇기 때문에 외부에서 제어할 수 있는 가장 개방적인 접근 제어자인 public만을 허용한다. public을 생략하면 접근제어자가 default가 되는 것이 아니라 public이 된다. 왜냐하면 인터페이스의 멤버는 무조건 public 이기 때문이다.

하나의 클래스는 여러개의 인터페이스를 구현할 수 있다.

interface I1{
    public void x();
}
 
interface I2{
    public void z();
}
 
class A implements I1, I2{
    public void x(){}
    public void z(){}   
}

인터페이스도 상속이 된다.

interface I3{
    public void x();
}
 
interface I4 extends I3{
    public void z();
}
 
class B implements I4{
    public void x(){}
    public void z(){}   
}
profile
훈이야 화이팅

0개의 댓글