Interface의 이해
인터페이스
인터페이스는 한마디로 추상클래스중 public 메소드만 남긴것이라 할 수 있다.
java에서 두개는 사실상 같다.
1
2
3
4
5
6
7
8
9
10
11
abstract class InterfaceEX1{
public abstract void method1();
public abstract void method2();
...
}
interface InterfaceEX2{
void method1();
void method2();
....
}
C++에서는 자체적으로 지원하지않기 때문에 첫번째 얘시처럼 abstract대신 vitual을 떡칠함으로써 흉내낼 수 있다.
1
2
3
4
5
6
7
class InterfaceEX3{
public :
virtual ~InterfaceEX3();
virtual void method1();
virtual void method2();
...
}
특징으로는
- 멤버 변수를 사용할수없고
- 무조건 public 멤버함수이다.
실 사용 예시
사실 이렇게 개념적으로만 놓고보면 감이 잘 안잡힌다. 사용을 정리하자면 다음의 용도로 사용한다
- 다중상속을 사용하지못하는 언어에서의 다중상속 흉내 + 다중상속의 다이아몬드 문제 해결
- 다형성 구현 : 클래스 작성자에게 해당 메소드 구현을 강제
- 추상클래스와 달리 해당 메소드를 기본적으로 구현을 하지않기때문에 모든 클래스의 구현이 각각 있는경우
최상위 부모클래스인 Person의 자식클래스인 Person1, Person2을 각각 상속 받는 경찰과 검찰은 체포 할 수있는 특별한 메소드를 가지고 있다. 이 경우에 메소드가 해당 클래스가 따로 가지고 있게 하는 것은 해당 메소드를 가진 객체를 사용해야할때 따로따로 처리해줘야하는 불편함이 있다. 이때 interface를 사용해서 해당 인터페이스를 가지는 자료구조를 만듦으로서 묶어서 처리할 수 있다.
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
public interface IArrestable
{
void arrest(Person person);
}
public class Person
{
public abstract void register(PersonManager manager);
}
public class Prosecution extends Person1 implements IArrestable
{
public void arrest(Person person){
//...
}
public void register(PersonManager manager){
//...
manager.registerArrestablePerson(this);
}
}
public class Police extends Person2 implements IArrestable
{
public void arrest(Person person)
{
//...
}
public void register(PersonManager manager){
//...
manager.registerArrestablePerson(this);
}
}
public class PersonManager
{
ArrayList<Person> persons;
ArrayList<IArrestable> arrestablePersons;
//..
public void registerPerson(Person person){
this.persons.add(person);
person.register(this);
}
public void registerArrestablePerson(IArrestable arrestablePerson){
this.arrestablePersons.add(arrestablePerson);
}
}
또한 이런방식으로 메소드를 연쇄적으로 부르면서 다운클래스를 함으로생기는 성능 저하를 막을 수 있다.
Posted 2020-07-14