반응형
안녕하세요. TDR입니다.
이번에 정리해볼 거는 추상 클래스와 인터페이스 입니다. 이 둘은 비슷해 보이면서도 조금 차이가 있는데요 한번 알아 보죠.
- 예전에 C언어로 코드를 작성할 때 A()라는 함수를 부르기 위해서는 호출하는 위치보다 위에 함수를 작성하거나 "이런 함수가 쓰일 것이다"라고 하여 미리 함수의 형만 정의하고 아래에 함수를 구현했던 것을 본적이 있으실 겁니다. 어떻게 보면 이와 유사한 느낌입니다. 즉, "이런 형태의 메소드를 여러군데에서 쓸 것이다"라고 하면서 미리 선언해 놓는 거죠. 그럼 왜 내용은 비워 놓는냐? 하는건데 이렇게 형태만 정의해 놓고 다른 클래스에서 오버라이드(Override)해서 동일한 메소드 이름으로 다른 기능을 구현해서 쓸 수 있기 때문입니다. 간단한 예를 보면...
이렇게 쓸 수 있는 것이죠. 위에서 쓴 abstract가 추상 클래스 & 추상 메소드라는 뜻입니다. 참고로 영어사전에서 abstract를 찾아보면 "추상적인", "관념적인"이라는 뜻이 나오는 것을 볼 수 있습니다. 그럼 여기서 인터페이스(interface)를 알아봅시다.
- 저는 처음에 추상 클래스와 인터페이스를 보고 "그럼 둘의 차이는 뭐야?" 라는 생각이 가장 먼저 들었었습니다. 뭔가 말만 교묘하게 바꾸서 결국 똑같은 소리를 하고 있는 것 처럼 보이니까요... -_-;; 그래서 이것 저것 찾아본 결과 둘의 차이는 필드의 정의를 멤버로서 가질 수 있느냐 없느냐라는 것을 알았습니다. 즉, 인터페이스는 추상 메소드만을 멤버로 같은 것은 추상 클래스와 동일하지만 정의도 멤버로 가질 수 있다는 것이 추상 클래스와의 차이였던 거죠. 한번 간단한 예를 보면...
만약 A, B, C라는 인터페이스를 D라는 클래스에서 오버라이딩 할려고 하면
class D implements A, B, C{ }
이렇게 하면 됩니다. 그렇다면 인터페이스가 extends를 안쓰냐? 하면 그건 아닙니다. 인터페이스가 인터페이스의 기능을 상속 받아 구현하고 싶을 때가 있습니다. 그럴때는 implements를 쓰는 것이 아닌 extends를 씁니다. 간단한 예를 보면...
이렇게 인터페이스끼리는 서로 상속을 할 때는 extends를 쓰고 클래스에서 인터페이스 내용을 구현할 때는 implements를 쓰면 되는 것이죠. 잠깐 여담으로,추상클래스도 그렇고 인터페이스도 그렇고 잘만 쓸면 코드 작성에 매우 편리하지만 잘 못 쓰면 가독성이 매~~우 떨어질 수 있다는 문제가 있습니다. 특히나 상속의 상속의 상속 처럼 너무 깊이가 깊어지면 코드를 짜고 있는 본인도 햇갈리기 때문에 이 부분은 작성자가 잘~ 정리해서 할 필요가 있겠죠?
그럼 이번 정리는 여기서 마치겠습니다.
# 참고문현 : ANK Co. Ltd저, "Java가 보이는 그림책"
이번에 정리해볼 거는 추상 클래스와 인터페이스 입니다. 이 둘은 비슷해 보이면서도 조금 차이가 있는데요 한번 알아 보죠.
추상 클래스(abstract class)
: 추상 메소드를 가진 클래스
추상 메소드(abstract method)
: 구현은 하지 않은 상태로 반환 값 & 메소드 이름 & 파라미터만 정해진 메소드
- 예전에 C언어로 코드를 작성할 때 A()라는 함수를 부르기 위해서는 호출하는 위치보다 위에 함수를 작성하거나 "이런 함수가 쓰일 것이다"라고 하여 미리 함수의 형만 정의하고 아래에 함수를 구현했던 것을 본적이 있으실 겁니다. 어떻게 보면 이와 유사한 느낌입니다. 즉, "이런 형태의 메소드를 여러군데에서 쓸 것이다"라고 하면서 미리 선언해 놓는 거죠. 그럼 왜 내용은 비워 놓는냐? 하는건데 이렇게 형태만 정의해 놓고 다른 클래스에서 오버라이드(Override)해서 동일한 메소드 이름으로 다른 기능을 구현해서 쓸 수 있기 때문입니다. 간단한 예를 보면...
이렇게 쓸 수 있는 것이죠. 위에서 쓴 abstract가 추상 클래스 & 추상 메소드라는 뜻입니다. 참고로 영어사전에서 abstract를 찾아보면 "추상적인", "관념적인"이라는 뜻이 나오는 것을 볼 수 있습니다. 그럼 여기서 인터페이스(interface)를 알아봅시다.
인터페이스(interface)
: 클래스 개념이 아닌 틀만을 준비해 놓고 해당 틀을 사용할 클래스에서 구현해서 사용하는 구조
- 저는 처음에 추상 클래스와 인터페이스를 보고 "그럼 둘의 차이는 뭐야?" 라는 생각이 가장 먼저 들었었습니다. 뭔가 말만 교묘하게 바꾸서 결국 똑같은 소리를 하고 있는 것 처럼 보이니까요... -_-;; 그래서 이것 저것 찾아본 결과 둘의 차이는 필드의 정의를 멤버로서 가질 수 있느냐 없느냐라는 것을 알았습니다. 즉, 인터페이스는 추상 메소드만을 멤버로 같은 것은 추상 클래스와 동일하지만 정의도 멤버로 가질 수 있다는 것이 추상 클래스와의 차이였던 거죠. 한번 간단한 예를 보면...
만약 A, B, C라는 인터페이스를 D라는 클래스에서 오버라이딩 할려고 하면
class D implements A, B, C{ }
이렇게 하면 됩니다. 그렇다면 인터페이스가 extends를 안쓰냐? 하면 그건 아닙니다. 인터페이스가 인터페이스의 기능을 상속 받아 구현하고 싶을 때가 있습니다. 그럴때는 implements를 쓰는 것이 아닌 extends를 씁니다. 간단한 예를 보면...
이렇게 인터페이스끼리는 서로 상속을 할 때는 extends를 쓰고 클래스에서 인터페이스 내용을 구현할 때는 implements를 쓰면 되는 것이죠. 잠깐 여담으로,추상클래스도 그렇고 인터페이스도 그렇고 잘만 쓸면 코드 작성에 매우 편리하지만 잘 못 쓰면 가독성이 매~~우 떨어질 수 있다는 문제가 있습니다. 특히나 상속의 상속의 상속 처럼 너무 깊이가 깊어지면 코드를 짜고 있는 본인도 햇갈리기 때문에 이 부분은 작성자가 잘~ 정리해서 할 필요가 있겠죠?
그럼 이번 정리는 여기서 마치겠습니다.
# 참고문현 : ANK Co. Ltd저, "Java가 보이는 그림책"
반응형
'Computer & Program > Java' 카테고리의 다른 글
[Java]Garbage Collection (0) | 2014.10.29 |
---|---|
[Java]Call by value / reference (0) | 2014.10.28 |
[Java]접근제한자 (0) | 2012.03.11 |
[Java]제한자 (0) | 2012.03.04 |
[Java]연산자 우선순위 (0) | 2012.03.04 |
댓글