hmk run dev

interface 본문

java

interface

hmk run dev 2021. 11. 14. 14:16

interface는 자바의 대표적인 규제

어떤 객체(class)가 있고 그 객체가 특정한 인터페이스를 사용한다면

그 클래스는 반드시 인터페이스의 메소들을 구현해야 한다.

만약 구현하지 않으면 이 애플리케이션은 컴파일 조차 되지 않는다

 

예제)

- I라는 인터페이스는 z라는 추상메소드(다 구현되지 않은)가 정의 되어있음

- 클래스 A는 I라는 인터페이스를 구현 한다(implements)

interface I {
	public void z();
}

class A implements I {
	public void z(){} // 구현 안하면 에러~!
}

 

왜 사용할까?

개발자 A와 B가 계산기를 만든다고 가정해보자 (거대한 작업 & 촉박한 일정이라고 가정)

계산기 클래스는 개발자 A가, 개발자 B는 그 클래스를 사용하는 로직을 만든다고 가정

이런 경우 개발자 B는 개발자 A가 계산기를 잘만들어서 나중에 제출할 것이라고 기대하고 개발을 진행할 것이다

그리고 아래와 같이 가짜? 로직을 만들어서 코드를 작성

 

가짜 로직을 만드는 이유는?

 

계산기 클래스를 만드는데 3개월이 걸린다고 가정

계산기를 사용하는 사용자 입장의 로직은 계산기(클래스)가 완성될 때 까지 아무런 작업을 할 수 없을까??

 

이러한 문제를 해결하기위해 가짜 클래스(CalculatorDummy)를 만들어

3개월 뒤에 완성된 코드가 인계될 것이라는 기대하에 가짜 코드를 만들어 나머지 로직을 쭉 만들어 완성시켜놓는다.

 

계산기를 만드는 동시에 사용하는 쪽에 대한 로직도 작성

  • 시간 절약

개발자 B의 가짜 로직코드(보시다 시피 return 값 고정, 다 구현되지 않은 함수들이 있다)

class CalculatorDummy {
	public void setOprands(inb 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(left, right) 와 CalculatorConsumer(first, second, third)가 받는 파라미터 갯수가 다르다.

다르게 동작할 확률이 매우높다! 

 

실제 로직이 매우 복잡하고 크고 많은 개발자가 참여했다면 결코 수정하기 쉽지않다!

class Calculator {
	int left, right;
    public void setOprnads(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);
    }
}

 

실패의 원인은 잘못된 커뮤니케이션 

이런 실패를 최소화 하고 커뮤니케이션이 구두, 서면으로 하는 것보다

자바가 지정해놓은 코드레벨에서 약속을 지정할 수 있다 그것이 바로 interface

 

개발자 A와 B의 인터페이스를 이용한 약속!

  • Calculatable 인터페이스를 사용하는 클래스들은
  • setOprands라는 메소드를 가지고 있어야하며 그것은 int first, int second, int third 세개의 정수인자를 가지며
  • sum & avg라는 메소드도 포함하고 있어야하는데 이것들은 int를 리턴해주어야 한다.
public interface Calculatable {
	public void setOprands(int first, int second, int third);
    public int sum();
    public int avg();
}

 

인터페이스를 사용한(implements) 클래스(설계도에 맞게 제작된 클래스)

개발자 A와 B는 약속해놓은 interface로 더욱 안심하고 CalculatorConsumer를 개발할 수 있다!

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 CarculatorDummy();
        c.setOprands(10,20,30);
        System.out.println(c.sum() + c.avg());
    }
}

 

인터페이스의 몇가지 규칙들

- 인터페이스 선언시 정의 된 멤버들은 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();
}

 

추상클래스와 인터페이스

추상클래스는 일반적인 클래스와 조금 다르다. 특정한 absctract 클래스를 상속 받은 하위 클래스는

추상클래스의 메소드를 강제로 상속받아서 사용해야한다.

 

하위클래스에서 @Override하도록 기대하는 클래스 > 구체적인 로직을 가질 수 있다

인터페이스는 약속 혹은 설계도로 구체적인 로직을 가질 수 없다.


출처 & 참고

https://www.youtube.com/watch?v=Pvjss79v_qw

 

'java' 카테고리의 다른 글

추상클래스 & 인터페이스  (0) 2022.02.16
JAVA 메모리 구조  (0) 2022.01.31
JPA @Query 띄워쓰기 주의 사항  (0) 2022.01.12
jsoup 네이버 블로그 크롤링(iframe)  (5) 2021.12.04
generic  (0) 2021.11.14
Comments