본문 바로가기

Java

인터페이스, Interface


코드로 보는 인터페이스의 기능


 

1. 코드규약

다음 코드를 살펴보자.

 

먼저 SubjectInterface 라는 인터페이스가 있고, score() 와 getName() 을 추상메소드로 가지고 있다.

1
2
3
4
5
6
package school;
 
public interface SubjectInterface {
    public int score();
    public String getName();
}

 

다음은 SubjectInterface 인터페이스의 구현이다.

각 과목들은 implements 로 SubjectInterface 를 받고 있기 때문에

'public int score()' 와 'public String getName()' 을 필수로 구현해 주어야 한다.

1
2
3
4
5
6
7
8
9
10
11
package school;
 
public class English implements SubjectInterface{
    public int score() {
        return 10;
    }
 
    public String getName() {
        return "English";
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
package school;
 
public class History implements SubjectInterface {
    public int score() {
        return 8;
    }
 
    public String getName() {
        return "History";
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
package school;
 
public class Math implements SubjectInterface {
    public int score() {
        return 9;
    }
 
    public String getName() {
        return "Math";
    }
}

 

만약 Math 클래스의 getName() 메소드를 주석처리 한다면 

 

Error:(3, 8) java: school.Math is not abstract and does not override abstract method getName() in school.SubjectInterface

 

컴파일 과정에서 위와 같은 에러가 발생됨을 확인할 수 있다.

 

 

이처럼 인터페이스는 한 클래스가 어떤 인터페이스를 구현하려고 할 때, 그 인터페이스가 가지고 있는 모든 추상클래스를 구현해야하는 코드규약으로서 역할을 한다.

 

 

2. 중복제거

Student 라는 클래스가 각 과목을 전달받아 점수를 출력하는 프로그램을 만들어보자.

만약 인터페이스를 이용하지 않는다면 다음과 같이 만들 수 있을 것이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
package school;
 
public class Student {
    public void printScore(English english){
        System.out.println(english.getName() + " : " + english.score());
    }
    public void printScore(History history){
        System.out.println(history.getName() + " : " + history.score());
    }
    public void printScore(Math math){
        System.out.println(math.getName() + " : " + math.score());
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import school.Math;
import school.English;
import school.History;
import school.Student;
 
public class Main {
    public static void main(String[] args) {
        Student student = new Student();
 
        student.printScore(new Math());
        student.printScore(new English());
        student.printScore(new History());
    }
}r
 

 

이와 같은 상황에 과목이 늘어난다면 아래와 같이 Student 클래스에 그 과목이 인자로 들어가는 함수를 따로 추가해주어야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package school;
 
public class Student {
    public void printScore(English english){
        System.out.println(english.getName() + " : " + english.score());
    }
    public void printScore(History history){
        System.out.println(history.getName() + " : " + history.score());
    }
    public void printScore(Math math){
        System.out.println(math.getName() + " : " + math.score());
    }
 
    //추가된 메소드
    public void printScore(Science science){
        System.out.println(science.getName() + " : " + science.score());
    }
}

 

만약 늘어난 과목이 한 과목이 아니라 수십, 수백 개의 과목이라면 이는 심각한 문제가 된다.

인터페이스를 이용한다면 이러한 문제를 해결할 수 있다.

 

 

이제 인터페이스를 이용하여 과목의 점수를 출력하는 프로그램을 만들어보자.

1
2
3
4
5
6
7
8
package school;
 
public class Student {
    public void printScoreUseInterface(SubjectInterface subject) {
        System.out.println(subject.getName() + " : " + subject.score());
    }
}
 
1
2
3
4
5
6
7
8
9
10
11
package school;
 
public class Science implements SubjectInterface {
    public int score() {
        return 5;
    }
 
    public String getName() {
        return "Science";
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import school.Math;
import school.English;
import school.History;
import school.Science;
import school.Student;
 
public class Main {
    public static void main(String[] args) {
        Student student = new Student();
 
        student.printScoreUseInterface(new Math());
        student.printScoreUseInterface(new English());
        student.printScoreUseInterface(new History());
        student.printScoreUseInterface(new Science());
    }
}

 

위와 같이 구현한다면 과목이 몇개가 늘어나든 Student 클래스에 메소드를 추가해줄 필요가 없다.

 

반응형

'Java' 카테고리의 다른 글

람다 표현식을 활용한 디자인패턴 - 템플릿 메서드  (0) 2020.04.08
람다 표현식을 활용한 디자인패턴 - 전략 패턴  (0) 2020.04.08
스트림 활용 정리  (0) 2020.04.04
스트림 기본 정리  (0) 2020.04.04
Optional  (0) 2020.03.29