티스토리 뷰
이번에 설명할 내용은 Interface(인터페이스)입니다. 인터페이스는 추상 클래스보다 더 추상적인 녀석입니다. 일단 인터페이스는 메소드와 변수를 선언할 수 있습니다. 다만, 인터페이스에서 선언한 메소드는 추상 클래스의 추상 메소드처럼 몸통을 가질 수 없습니다. 그리고 인터페이스의 변수들은 무조건 'public static final' 속성을 가지게 되어 어디서든 접근 가능한 정적이고 바꿀 수 없는 변수들이 됩니다. 또한 추상 클래스와 마찬가지로 인스턴스를 가질 수도 없습니다. 일단 아래 코딩부터 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 |
package blog;
public class Ex_class {
public static void main(String[] args) {
calculator cal = new calculator();
cal.on();
cal.off();
}
}
interface blueprint {
public void on();
public void off();
public static final String hello = "안녕하세요.";
String bye = "종료합니다."; //pulbic static final 생략 가능
}
class calculator implements blueprint {
@Override
public void on() {
System.out.println(hello);
}
@Override
public void off() {
System.out.println(bye);
}
} |
cs |
인터페이스는 선언할 때 class 대신에 Interface를 써주어 선언합니다. 이 인터페이스를 상속 받을 때는 기존에 쓰던 extends 대신에 implements를 사용합니다. 이렇게 인터페이스를 상속 받으면 인터페이스 내에 있는 메소드들을 무조건 구현해야 하며 구현하지 않을 시엔 컴파일되지 않습니다. 그리고 인터페이스에서 변수를 선언하면 'public static final'을 붙이지 않아도 자동으로 'public static final' 속성을 가지게 됩니다.
인터페이스를 이용한 다중 상속
인터페이스는 또한 다중 상속을 가능하게 합니다. 자바에서 상속을 받으면 extends를 통해서 하나의 클래스 밖에는 상속 받을 수 없습니다. 하지만 인터페이스를 활용하면 다중 상속을 할 수 있습니다. 아래 코딩부터 보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 |
package blog;
public class Ex_class {
public static void main(String[] args) {
calculator cal = new calculator();
cal.on();
cal.setNumber(3, 4);
cal.plus();
cal.minus();
cal.off();
}
}
interface blueprint {
public void on();
public void off();
public static final String hello = "안녕하세요.";
String bye = "종료합니다."; //pulbic static final 생략 가능
}
class draft {
int num;
int num2;
public void setNumber(int num, int num2) {
this.num = num;
this.num2 = num2;
}
public void plus() {
System.out.println(num + num2);
}
public void minus() {
System.out.println(num - num2);
}
public void multiple() {
System.out.println(num * num2);
}
public void divide() {
System.out.println(num / num2);
}
}
class calculator extends draft implements blueprint { //다중 상속
@Override
public void on() {
System.out.println(hello);
}
@Override
public void off() {
System.out.println(bye);
}
} |
cs |
위 코딩을 보면 calculator 클래스가 extends로 draft 클래스를 상속 받고 implements를 통해서 blueprint 인터페이스를 상속 받아 다중 상속을 받은 것을 확인할 수 있습니다. 그럼 이러한 기능들을 가진 인터페이스는 왜 사용 되고 어떻게 활용해야 할까요?
인터페이스 사용 이유
저는 무엇을 공부하기 전에 항상 한 문장으로 정의를 해놓고 시작하려 하는데, 인터페이스가 무엇이다라고 정의 내리기가 무척 힘들었습니다. 구글의 바다에 빠져서 여러 글들을 보았지만 어떻게 정의 내리기가 힘들었고, 인터페이스의 사용 이유에 대해서도 개발자들 사이에서 의견이 분분함을 확인할 수 있었습니다. 제가 찾다 찾다가 가장 마음에 든 정의는 그 말 그대로 Interface, 즉 접점의 역할을 한다는 것이었습니다. 그럼 무엇과 무엇을 연결 시켜주는 역할을 하느냐? 그건 바로 설계자와 개발자를 연결 시켜주는 역할을 하는 것이었습니다.
이전에 추상 클래스에 대해서 작성할 때 보면 추상 클래스는 커플링과 확장성을 가지고 있다고 적었습니다. 인터페이스는 추상 클래스보다 더 약한 커플링과 더 큰 확장성을 지니고 있습니다. 또한 추상 클래스보다 더 많은 규칙을 정하고 있습니다, 변수가 무조건 'public static final'의 속성을 지니는 것을 보면 확인할 수 있습니다. 이러한 규칙을 가지고 있는 인터페이스를 사용하기 가장 좋은 사람이 누구일까요? 바로 설계자입니다. 설계자가 처음 시스템을 구현하기 위해 큰 그림을 그릴 때 인터페이스를 통해 규칙을 정해두고 자신이 의도한대로 시스템이 개발될 수 있도록 하는 것입니다. 이 인터페이스를 통해서 개발자는 설계자가 생각한 의도가 무엇인지 파악할 수 있게 되는 것입니다. 따라서 위에 적은 대로 인터페이스는 설계자와 개발자의 접점의 역할을 하는 것입니다.
이상으로 개략적인 인터페이스의 설명을 적어보았습니다. 최대한 쉽게 풀어적으려 노력했지만 다소 어려울지도 모르겠습니다. 저도 이해하기가 어려운 개념이었기에 설명이 쉽지 않았을지도 모르겠습니다. 다만, 너무 어렵게 생각할 필요는 없다고 생각합니다. 어떤 사물을 볼 때 너무 복잡하다고 생각하면 밑도 끝도 없이 복잡해지기 마련입니다. 그럴땐 오히려 단순하게 생각하는 것이 더 도움이 될 때가 많다고 생각합니다. 다음에는 Enumeration, 줄여서 enum에 대해 설명해 보도록 하겠습니다. 이 글을 보실 때는 아닐수도 있겠지만, 글을 쓰고 있는 지금은 긴긴 겨울이 끝나고 봄이 오고 있습니다. 다들 환절기에 감기 조심하시길 바라겠습니다.
'IT > Java' 카테고리의 다른 글
Java - Generic(제네릭) (0) | 2017.03.05 |
---|---|
Java - enum (0) | 2017.03.05 |
Java - abstarct class(추상 클래스) (0) | 2017.03.05 |
Java - Overloading(오버로딩)과 Overriding(오버라이딩) (0) | 2017.03.05 |
Java - 상속(Inheritance) (0) | 2017.03.05 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday