어렸을 때 그 어렵다는 C를 겉핥기 한 경험이 있어서인지 자바를 처음 접했을 때 너무 재밌고 또 술술 이해됐습니다.
그렇게 진도를 훅훅 빼다가 만난 암초가 바로 자바의 인터페이스!...
처음 읽었을 땐 이 놈을 도대체 어따 쓰는 지 이해가 되지 않았고, 두 번 읽었을 땐 다형성 뭐시기 하는 거 같은 느낌이 왔고, 그 이후로 아마 열 번 이상은 공부하고 나서야 비로소 이해했습니다.
혹 저처럼 자바의 인터페이스에서 헤메고 계시다면 잘 찾아오셨습니다!
그럼 한 번 인터페이스라는 놈을 함께 분석해볼까요?
1. 인터페이스는 약속이다!
네! 인터페이스는 단순한 약속이라고 이해하시면 됩니다.
개발자와 컴파일러, 개발자와 개발자 사이의 약속인거죠.
위의 코드를 함께 볼까요?
Flyable 인터페이스는 말 그대로 '날 수 있는' 인터페이스를 의미합니다.
이 인터페이스는 DESCRIPTION이라는 String 상수와 fly()라는 단 하나의 추상메소드만 갖고 있습니다.
인터페이스의 멤버변수는 오직 public 상수, 메소드는 public 추상메소드만 허용됩니다!
Bird 클래스는 Flyable 인터페이스를 impleaments 했습니다.
그렇기에 '반드시' fly() 메소드의 본체를 만들어줘야 합니다.
거기에 추가적으로 자체적인 cry()메소드를 하나 만들어 줬습니다.
자 그럼 Flyable한 클래스를 하나 더 만들어 볼까요?
Rocket 클래스도 Flyable 인터페이스를 impleaments했기에 '반드시' fly() 메소드의 본체를 만들어줘야 합니다.
Rocket에는 fireEngine()이라는 자체 메소드를 하나 만들어 줬습니다.
이제 위에서 만든 인터페이스와 클래스로 한 번 놀아볼까요?
잘 작동하죠?
그럼 하나씩 살펴 보겠습니다!
2. 다형성의 의미!
Bird bird1 = new Bird();
Flyable bird2 = new Bird();
Flyable rocket = new Rocket();
Bird와 Rocket은 모두 Flyable한 클래스이기에 위와 같이 만들 수 있습니다!
이게 바로 다형성이라는 거죠.
이 놈들을 이렇게 사용하는 것도 가능합니다!
List<Flyable> list = new ArrayList<>();
list.add(bird1);
list.add(rocket);
list.add(bird2);
전부다 List<Flyable>에 넣을 수 있는거죠!
그리고 Flyable 인터페이스를 구현한 클래스는 '반드시' fly()메소드가 있다는 약속을 했기 때문에,
우리는 안심하고 fly()를 호출 할 수 있습니다!
for (Flyable f : list) {
f.fly();
}
다만 Bird 클래스와 Rocket 클래스가 자체적으로 가지고 있는 메소드는 Flyable이라는 이름만으로는 유추할 수 없기에 다음과 같이 cast를 해줘야 사용이 가능합니다.
if(f.getClass() == Bird.class) {
((Bird) f).cry();
} else if(f.getClass() == Rocket.class) {
((Rocket) f).fireEngine();
}
자 이렇게 오늘은 인터페이스의 가장 기본적인 면을 다뤄봤는데요.
아마 입문하신 분들은 인터페이스라는 약속과 다형성의 어느 부분이 대단한 건지 아직 감이 오시지 않을 수 있습니다.
다음 화에는 이 인터페이스가 얼마나 자바를 멋진 놈으로 만들어 주는 지 설명해보겠습니다!
댓글 많이 달아주시고요~~
'IT > JAVA' 카테고리의 다른 글
3. 상속 (0) | 2019.12.15 |
---|---|
2. 클래스(Class)와 객체 (0) | 2019.12.13 |
1. JAVA(자바)는 객체지향언어다. (0) | 2019.12.12 |
댓글