자바 공부기록 53 - Interface
※자바언어에서 제공하는 상속 기능은 일반 클래스이든, 추상클래스이든 단일 상속만을 지원합니다.
하나의 클래스는 하나의 부모클래스를 가질 수 있습니다.
(여러개의 클래스를 상속할 수 없음)
class SubA extends SuperA, SuperB {} -> 에러
●다중 상속을 위해 만들어진 interface
인터페이스도 클래스 입니다. 다만 제약이 다소 있는 클래스입니다
1. 인터페이스는 멤버필드(변수)로 public static final 멤버만 가질 수 있습니다.
2. 인터페이스는 멤버메소드로 public abstract 메서드만 가질 수 있습니다.
3. 추상클래스처럼 일반 멤버변수와 일반 멤버 메서드를 가질 수 없습니다
4. 추상클래스보다도 더 상속을 위해서 만들어진 클래스 입니다. 다중 상속이 가능합니다
-class 만들듯이 생성하며, class 란 키워드 대신 interface 라는 키워드를 써서 생성합니다
1
2
3
4
5
6
7
8
9
10
|
interface InterA {
// InterA(){} // 에러... 인터페이스는 생성자를 갖을수 없습니다.
// 생성자는 일반클래스와 추상클래스만 만들수 있습니다
int n1 = 10;
public static final int num = 10; //public static final int n1 = 10; 이라고 쓴것과 같습니다.
public abstract void test1();
public void test2(); // abstract 가 생략된 상태이며, 자동으로 추상메서드로 인식
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
interface InterA {
int n1 = 10;
public static final int num = 10;
public abstract void test1();
public void test2();
}
class SubA implements InterA{
@Override
public void test1() {
System.out.println("SubA 클래스의 test1 메소드 실행");
}
@Override
public void test2() {
System.out.println("SubA 클래스의 test2 메소드 실행");
}
}
|
cs |
-> 인터페이스를 상속(구현)하는 클래스는 상속(구현)할 클래스 앞에 extends 대신 implements 를 씁니다
-인터페이스는 객체를 생성할 수 없습니다.
추상메소드를 포함할 수 있기때문에...
InterA a = new InterA(); // 에러
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class Interface01 {
public static void main(String[] args) {
InterA a = new SubA();
// 부모 인터페이스의 레퍼런스를 사용하여 자식 클래스의 오버라이딩된 메소드를 호출
a.test1();
a.test2();
// 자식 인스턴스를 전달인수로 보내고, 부모인터페이스의 레퍼런스를 매개변수로하여
// 사용이 가능합니다
test(a);
}
public static void test(InterA a) {}
}
|
cs |
-인터페이스들끼리의 상속(extends) : 인터페이스를 인터페이스가 상속할때는 implements 를 쓰지않고
extends 를 씁니다. 인터페이스끼리는 다중상속(extends)가 가능합니다
1
2
3
4
5
6
7
8
9
10
11
|
interface InterSuper1{
public abstract void interSuper1Method();
}
interface InterSuper2{
public abstract void interSuper2Method();
}
interface InterSub extends InterSuper1, InterSuper2{
public abstract void interSubMethod();
// public abstract void interSuper1Method(); 상속받은 추상메서드
// public abstract void interSuper2Method(); 상속받은 추상메서드
}
|
cs |
->인터페이스끼리의 extends 는 추상메서드들을 온전히 물려받은 것만으로 마무리하고,
추상매서드의 override 의무는 면제됩니다.
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
|
interface InterSuper1{
public abstract void interSuper1Method();
}
interface InterSuper2{
public abstract void interSuper2Method();
}
interface InterSub extends InterSuper1, InterSuper2{
public abstract void interSubMethod();
// public abstract void interSuper1Method(); 상속받은 추상메서드
// public abstract void interSuper2Method(); 상속받은 추상메서드
}
class ClassSub2 implements InterSub {
@Override
public void interSuper1Method() {
System.out.println("interSuper1Method 메서드 입니다");
}
@Override
public void interSuper2Method() {
System.out.println("interSuper2Method 메서드 입니다");
}
@Override
public void interSubMethod() {
System.out.println("InterSubMethod 메서드 입니다");
}
}
|
cs |
->인터페이스 간 상속(extends)이 이루어져 있는 인터페이스를 클래스에서 구현(implements)하는 경우
부모 인터페이스의 추상메소드를 포함하여 모두 오버라이딩해야 합니다.
●상속관계, 인터페이스 구현 관계가 함께 있는 경우, 메인메소드에서의 메서드 호출 가능/불가능 여부
- 계속 보고 눈에 익혀두기
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
package days31;
// 인터페이스들의 생성
interface InterSuper1{
public abstract void interSuper1Method();
}
interface InterSuper2{
public abstract void interSuper2Method();
}
// 인터페이스들끼리의 상속(extends) : 인터페이스를 인터페이스가 상속할때는 implements 를 쓰지않고
// extends 를 씁니다. 인터페이스끼리는 다중상속(extends)가 가능합니다
interface InterSub extends InterSuper1, InterSuper2{
public abstract void interSubMethod();
// public abstract void interSuper1Method(); 상속받은 추상메서드
// public abstract void interSuper2Method(); 상속받은 추상메서드
}
// 인터페이스끼리의 extends 는 추상메서드들을 온전히 물려받은 것만으로 마무리하고,
//추상매서드의 override 의무는 면제됩니다.
// 일반 클래스가 인터페이스를 다수개 implements 했다면 그 인터페이스 들이
// 보유한 추상메서들을 모두 구현(override, implements)해야합니다
class ClassSub1 implements InterSuper1, InterSuper2{
@Override
public void interSuper2Method() {
System.out.println("interSuper2Method 메서드 입니다");
}
@Override
public void interSuper1Method() {
System.out.println("interSuper1Method 메서드 입니다");
}
}
// 인터페이스 간 상속(extends)이 이루어져 있는 인터페이스를 클래스에서 구현(implements)하는 경우
// 부모 인터페이스의 추상메소드를 포함하여 모두 오버라이딩해야 합니다.
class ClassSub2 implements InterSub {
@Override
public void interSuper1Method() {
System.out.println("interSuper1Method 메서드 입니다");
}
@Override
public void interSuper2Method() {
System.out.println("interSuper2Method 메서드 입니다");
}
@Override
public void interSubMethod() {
System.out.println("InterSubMethod 메서드 입니다");
}
}
public class Interface02 {
public static void main(String[] args) {
// 자식 레퍼런스 = 자식 인스턴스
ClassSub1 cs1 = new ClassSub1();
ClassSub2 cs2 = new ClassSub2();
// 부모 레퍼런스 = 자식 인스턴스
// 구현(implements)관계가 있는 부모자식간에만 대입이 가능합니다
InterSuper1 is1 = new ClassSub1(); // 가능
InterSuper2 is2 = new ClassSub1(); // 가능
InterSuper1 is3 = new ClassSub2(); // 가능
InterSuper2 is4 = new ClassSub2(); // 가능
// InterSub is5 = new ClassSub1(); // 불가능 - 에러
InterSub is6 = new ClassSub2(); // 가능
// 상속되고 구현된 메서드만 사용이 가능합니다
cs1.interSuper1Method(); // 가능
cs1.interSuper2Method(); // 가능
// cs1.interSubMethod(); // 에러
cs2.interSuper1Method(); // 가능
cs2.interSuper2Method(); // 가능
cs2.interSubMethod(); // 가능
is1.interSuper1Method(); // 가능
//is1.interSuper2Method(); // 불가능
//is1.interSubMethod(); // 불가능
//is2.interSuper1Method(); // 불가능
is2.interSuper2Method(); // 가능
//is2.interSubMethod(); // 불가능
is3.interSuper1Method(); // 가능
//is3.interSuper2Method(); // 불가능
//is3.interSubMethod(); // 불가능
//is4.interSuper1Method(); // 불가능
is4.interSuper2Method(); // 가능
//is4.interSubMethod(); // 불가능
is6.interSuper1Method(); // 가능
is6.interSuper2Method(); // 가능
is6.interSubMethod(); // 가능
}
}
|
cs |