자바 - 인터페이스 왜 사용할까?

김지인·2022년 6월 30일
2

글을 시작하기에 앞서..

이 글은 쌩초보 입문자를 위해 왜 사용하는가를 이해시키려는 글입니다.
인터페이스의 사용법과 특성은 다루지 않습니다.

인터페이스를 사용하지 않는다면?

국제 컴퓨터 대회에 나온 A와 B는 한 팀이 되어 시험 점수를 입력받아 합, 평균값을 계산해 주는 프로그램을 만들려고 한다.

A : "B야 네가 평균값을 구하는 로직을 구성해, 내가 더한 값을 구하는 로직을 구성할게. 각자 로직을 구성한 후에 나중에 합치자."

public class A {
	private int k;
    private int e;
    
    public void setA (int k, int e) {
    	this.k = k;
        this.e = e;
    }
    
    public int plus() {
    	return k+e;
    }
    
    public int avg() {
    	return 10; // 나중에 합치기 위한 임의의 int값
    }
    
}

- A가 구현한 더하기 로직

public abstract class B {
	private int kor;
    private int eng;
    private int math;
    
    public void setB (int kor, int eng, int math){
    	this.kor = kor;
        this.eng = eng;
        this.math = math;
    }
    
    public void p(){
    	System.out.println("10"); // 나중에 합치기 위한 임의의 출력 int값
    }
    
    public void avg() {
    	 int result;
         result = (kor + eng + math)/2;
         System.out.printf("result : %d", result);
    }
}

- B가 구현한 평균값 로직

대회의 마지막 날,,

A : "B야 그동안 작업한 로직과 나의 로직을 합쳐보자........... 뭐야?!"

서로가 구성한 로직을 합치려고 보니 다음과 같은 문제가 있었다.

1. 서로의 변수, 메서드명이 다름
2. 입력받는 값의 개수가 다름
3. 서로 다른 형태의 출력값

A : 이 로직들을 어떻게 서로 합치지..?

당연히 합치기 어렵다. 만약에 이 로직의 줄이 10000줄이라고 가정하자. 서로 약속되지 않은 상태에서 각자의 로직을 구성하면 이와 같은 상황이 일어날 것이고, 로직이 복잡할수록 유지 보수와 협업은 더더욱 어려워질 것이다.

인터페이스를 사용한다면 ?

시간이 지나서 A와 B는 다시 대회에 참여했다. 주제는 저번과 같았으나 이번에는 접근을 새롭게 한다.

A : "이번에는 '인터페이스'를 이용해서 해보자."

  1. 입력받는 값은 국어,영어 점수 두개로 정하자.
  2. 두 변수의 이름은 kor, eng로 정하자.
  3. 메서드 명은 setAB, plus, avg로 정하자.
  4. 출력 타입은 int형으로 정하자.
public interface AB {
    public void setAB(int kor, int eng);
    
    public int plus();
    
    public int avg();
    
}

- A와 B가 서로 상의 한 후 약속한 인터페이스

public class A implements AB {
	private int kor;
    private int eng;
    
    @Override
    public int setAB(int kor, int eng){
    	this.kor = kor;
        this.eng = eng;
    }
    
    @Override
    public int plus() {
    	return kor + eng;
    }
    
    @Override
    public int avg(){
    	return 10; //나중에 합쳐야 할 로직이므로 임의의 int값
    }
}

- A가 구현한 더하기 로직

public class B implements AB {
	private int kor;
    private int eng;
    
    @Override
    public void setAB(int kor, int eng) {
    	this.kor = kor;
        this.eng = eng;
    }
    
    @Override
    public int plus() {
		return 10; //나중에 합쳐야 할 로직이므로 임의의 int값   
    }
    
    @Override
    public int avg() {
    	return (kor + eng)/2;
    }
}

- B가 구현한 평균값 로직

A : "각자 구현한 것을 합쳐보자."

public class ABTeam implements AB {
	private int kor;
    private int eng;
    
    @Override
    public void setAB(int kor, int eng) {
    	this.kor = kor;
        this.eng = eng;
    }
    
    @Override
    public int plus() {
    	return kor + eng;
    }
    
    @Override
    public int avg() {
    	return (kor + eng)/2;
    }
}

- A와 B가 각자 구현한 것을 합친 로직

'인터페이스'를 사용함으로써 전보다 훨씬 편하게 각자의 로직을 합쳤다.

이로써 알 수 있는 사실

  • 인터페이스는 사용자에게 약속을 함으로써 표준화가 가능함

  • 서로가 각자 관계없는 클래스임에도 같은 인터페이스를 공유함으로써 관계를 맺어줄 수 있음.

  • 협업 시에 각자 구현해야 할 부분만 하면 되므로 개발 시간 단축

public class project {
	
    public static void main(String[] args) {
      AB AB = new ABTeam();
      AB.setAB(20,40);

      System.out.printf("result : %d%n" , AB.plus());
      System.out.printf("result : %d" , AB.avg());
  }
}

출력값
result : 60
result : 30

그럼 한번 정의하면 끝인가?


시간이 흘러, 이 인터페이스 로직이 전 세계적으로 유명한 오픈소스가 되었다고 가정하자.

A : " 인터페이스 로직에 기능을 추가하고 싶은데 그렇게 되면 수많은 사람들이 오류를 일으키겠지 ? 어떡할까... "

만약에 인터페이스에 기능을 추가하게 된다면 이 인터페이스를 사용하는 수많은 사용자들이 오류를 일으킬 것이다.

이러한 문제를 해결하기 위해 JAVA8부터는 인터페이스에 메서드를 추가 정의할 수 있게 되었다.

예를 들어보자.

A : " 인터페이스에 창시자인 내 이름을 남기고 수정자 이름을 넣는 기능을 추가 하고 싶어! "

창시자인 이름은 바뀌면 안 된다. 하지만 수정자의 이름은 사용자에 따라서 바뀔 수가 있다.

그렇다면 인터페이스를 사용하는 수많은 유저들에게 오류를 안 일으키고 어떻게 추가할 수 있을까?

간단하다. default 와 static을 이용하면 된다.

public interface AB {
    public void setAB(int kor, int eng);
    
    public int plus();
    
    public int avg();
    
    default void 수정자(){
    	System.out.println("");
    }
    
    static void 창시자(){
    	System.out.println("A, B");
    }
}

이렇게 인터페이스를 수정하면 기존의 로직을 건드리지 않고 추가적으로 사용이 가능한 메서드가 생겼다.

사용자는 default로 정의된 수정자()메서드를 메서드를 수정하여 자신의 이름을 출력할 수 있다.

창시자의 이름은 바뀌면 안 되기 때문에 static으로 정의하여 사용자가 수정할 수 없는 메서드가 된다.

아 물론 수정자(), 창시자() 메서드를 호출하지 않아도 로직은 실행되는데 문제가 없다.

이 글을 마치며..

뭐든지 기술에는 사용하는 이유를 알아야 된다고 생각한다. 그래서 나와 같은 비전공자 입문자 입장에서 쓰려고 혼자 노력을 했다. 이 글을 읽는 사람들이 모두 이해가 잘 됐으면 좋겠다.

profile
에러가 세상에서 제일 좋아

0개의 댓글