코드로 보는 인터페이스의 기능
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 |