Java interface

별의개발자커비·2023년 2월 15일
0

Java

목록 보기
44/66
post-thumbnail

interface

  • 인터페이스는 하위 클래스에 특정한 메소드가 반드시 존재하도록 강제한다.

문법

interface I{
public void z() // 메소드를 클래스 A가 반드시 포함하고 있어야 한다
// 인터페이스는 하위 클래스에 특정한 메소드가 반드시 존재하도록 강제한다.
}

class A implements I{ // A는 I를 구현한다.
    public void z(){}
}

사용 이유

계산기 기능이 필요한 프로젝트를 진행하는데 시간이 촉박하다.

  • 개발자 A가 계산기 클래스를 만들고
  • 개발자 B는 그 클래스를 사용하는 로직을 만듦
    • 개발자 A가 계산기를 잘 만들어서 나중에 제출할 것이라고 기대하고 개발을 진행
    • 그리고 아래와 같이 가짜 로직을 만들어서 코드를 작성
class CalculatorDummy{
    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());
    }
}
  • 3개월이 지나고 개발자 A가 Calculator 클래스를 완성해서 인계해줌
class Calculator {
    int left, right;
    public void setOprands(int left, int right) {
        this.left = left;
        this.right = right;
    }
    public void sum() {
        System.out.println(this.left + this.right);
    }
    public void avg() {
        System.out.println((this.left + this.right) / 2);
    }
}
  • 저런.. 개발자 A는 setOprands의 매개변수를 2개 받고 있지만
  • 개발자 B는 이 메소드가 변수 3개를 받을 것이라고 생각한 것

해결 방법은 협업자 상호간에 구체적인 약속을 코드 안에서 하면 된다 = 인터페이스

  • 클래스 Calculator를 사용할 개발자가 이 클래스가 가지고 있어야 할 메소드를 인터페이스로 만들어서 제공하는 것
  • 양 쪽은 이 인터페이스를 구현한 클래스 Calculator(개발자 A)와 CalculatorDummy(개발자 B)를 각각 구현하면 됨
  • 아래 코드가 그 약속을 정의하고 있는 인터페이스
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;
    }
}
  • 이제 해야 할 일은 가짜 클래스인 CalculatorDummy를 실제 로직으로 교체하면 된다.
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());
    }
}

인터페이스를 이용해서 서로가 동일한 메소드를 만들도록 규약을 만들어서 공유한 결과

  • 각자가 상대의 일정이나 구현하는 방식에 덜 영향을 받으면서 협업하여 에플리케이션을 구축 가능

규칙들

  1. 인터페이스의 맴버는 반드시 public이다.
interface I5{
    private void x();
}
  1. 필드로는 상수만 가능하다. 변수는 no. 상수만 가능하기 때문에 public static final 키워드 생략가능

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

interface I1{
    public void x();
}
 
interface I2{
    public void z();
}
 
class A implements I1, I2{
    public void x(){}
    public void z(){}   
}
  1. 인터페이스도 상속이 된다.
interface I3{
    public void x();
}
 
interface I4 extends I3{
    public void z();
}
 
class B implements I4{
    public void x(){}
    public void z(){}   
}

abstract vs interface

인터페이스와 추상 클래스는 서로 비슷한 듯 다른 기능이다. 인터페이스는 클래스가 아닌 인터페이스라는 고유한 형태를 가지고 있는 반면 추상 클래스는 일반적인 클래스다. 또 인터페이스는 구체적인 로직이나 상태를 가지고 있을 수 없고, 추상 클래스는 구체적인 로직이나 상태를 가지고 있을 수 있다.

( 출처 생활코딩 https://www.opentutorials.org/course/1194/6063 )

0개의 댓글