'상속'에 해당되는 글 3건

  1. 2008.03.05 자바의 추상클래스(Abstract class)와 인터페이스(interface class) (11)
  2. 2008.02.23 자바의 접근제한자,인터페이스,상속? (6)
  3. 2007.11.24 내가 생각하는 객체지향..?

자바의 추상클래스(Abstract class)와 인터페이스(interface class)

Project 2008.03.05 23:48

 사실 처음 자바를 공부하면서 궁금해 하던게 있었습니다.
그것은 추상클래스(Abstract class)와 인터페이스(Interface)의 차이 및 존재이유입니다.
 클래스는 크게 일반클래스와 추상클래스로 나뉘는데 추상클래스는 본문중에 '추상메소드'가 하나 이상 포함되는 경우를 말합니다. 인터페이스는 모든 메소드가 추상메소드인 경우 선언하는 경우가 많습니다.

추상메소드라 함은 메소드의 선언부만 있고 본문이 없는 것을 말합니다. 여기서 본문은 중괄호({})로 묶여진 몸체(body)부분을 말하는데 중괄호 안이 비어있더라도 이것이 존재한다면 그것은 추상메소드가 아닙니다. 추상메소드의 선언의 예는 다음과 같습니다.

abstract public void test( int a );

즉, 메소드의 선언 후에 세미콜른(;)만을 찍어 이를 선언만 하고 구현은 자식클래스에서 하게 하는 방법입니다. 일반 클래스의 경우 상속받은 자식클래스가 반드시 부모클래스의 메소드를 '오버라이딩(overriding)'할 필요가 없지만 추상클래스를 상속받은 자식클래스는 반드시 추상메소드를 오버라이딩하여야 하기에 메소드를 강제로 구현하게 할 때 많이 쓰입니다.
 추상클래스는 위에서 말한것처럼 추상메소드(빈메소드)를 선언하여 상속받아 쓰이는 모든 클래스에게
기능의 구현을 강제할때 쓰입니다.
 추상클래스와 인터페이스의 가장 큰 차이점은 바로 '클래스'냐 아니냐의 차이입니다. 추상클래스는 엄연한 클래스로 이를 구현하는 것은 '상속(extends)'입니다. 그러나 인터페이스는 '포함(implements)'라는 키워드를 통해 구현하게 되는데 이는 자바에서 매우 중요한 차이를 가집니다.

자바는 오로지 '단일 상속'만을 지원하기 때문에 추상클래스를 상속받는 클래스는 다른 클래스를 상속받을 수 없습니다. 그러나 인터페이스를 포함하는 클래스는 다른 클래스를 상속받을 수 있습니다.

추상클래스는 일반클래스와 달리 그 자신을 new 명령어를 통해 객체를 생성할 수 없습니다. 그러나 '다형성(polymorlphism)'을 통해 자식 클래스의 객체를 생성할 수는 있습니다.

인터페이스를 쓰는 가장 큰 이유는 다중상속을 지원하지 않는 자바에서 다중상속의 장점을 가져오기 위해서입니다. 다중상속이 가지는 단점은 배제하고 오직 장점만을 취하기 위해 인터페이스를 쓰는 것입니다.

상속이란 개념은 부모클래스의 속성과 메소드를 자식클래스가 물려받는다는 것인데 쉽게 예를 들면 '자동차'라는 클래스는 '색깔', '배기량' 등의 속성과 '기름을 넣는다', '달린다' 등의 메소드를 가질 수 있습니다. 이 클래스를 상속하는 '승용차' 클래스는 별도로 선언하지 않아도 부모클래스의 '색깔', '배기량'이라는 속성과 '기름을 넣는다', '달린다'라는 메소드를 가지게 되죠.

추상클래스는 이 부모클래스가 단순히 관념적인 성격이 강할 때 많이 쓰이는데 예컨데 '새'라는 클래스는 그냥 '난다'라는 메소드를 가지지만 새의 종류에 따라 나는 방법이 조금씩 틀려 자식클래스에서 어차피 구현해야 될 부분이므로 굳이 부모클래스에서 그 내용을 구현할 필요가 없기때문입니다.

 인터페이스는 추상 메소드만으로 이루어진 클래스를 말합니다.

 이 클래스는 추상클래스와 같이 객체를 생성하지 못합니다. 즉 상속받아 사용하거나 구현(Implement)하여
다른클래스에게 자신의 책임을 위임하지 않으면 안됩니다.

 이러한 클래스는 처음 보았을때 사못 비어있는 인터페이스를 상속받아야할 이유가 무엇일까 생각해봅니다.
구현해야할 제약을 의미한다면 추상클래스(Abstract class)에서 모든 메소드를 추상메소드로 구현하더라도
같은 의미가 아닐까요?

 보통 인터페이스를 사용하는 이유로서 다중상속을 통해 벌어지는 문제점을 해결하기 위해서이다.
라고 말을 하지만 왜 다중상속을 해야합니까? 라고 질문을 한다면 어떨까요?
 특히나 인터프리터 언어라든지 C++등의 언어는 다중상속을 문제없이 지원합니다. 또는 인터페이스라는
개념이 없지요.

 구현적인 관점에서 제가 생각하는 다중상속의 해야하는 이유 및 인터페이스를 사용해야하는 이유는

 자바로서 객체 지향을 구현하기 위해서는 먼저 아래의 2가지 특징을 이해하지 않으면 안됩니다.

    1. 자바는 Type기반 언어이기 때문에 자바의 상속은 형의 상속입니다.
    2. 자바는 같은 클래스의 형(상속관계)으로서만 캐스팅이 가능합니다.

 객체지향의 다형성(polymorphism)을 구현하는 방법은 각각의 언어마다 틀린데 자바는 위에서
보듯 객체를 호출할때 먼저 객체의 타입을 정해주지 않으면 안됩니다.
 즉 실제 호출하려는 함수는 원하는 함수가 들어있는 클래스 또는 인터페이스를 상속하지 않으면
안됩니다. 또 추상클래스 또는 인터페이스를 상속한 클래스는 추상메소드를 구현하지 않으면 안됩니다.

<font color=red>덧붙이면..</font>

하지만 자바는 상속을 통해 일어나는 생성자와 소멸자,오버라이딩 등의 문제를 해결하기 위해서
상속을 사용하지 않고 되도록이면 구성(Composition)을 이용하도록 합니다.
 그리고 공통적인 인터페이스로 특정 지을수 있는 클래스들은 인터페이스를 상속함으로서
결함도를 줄일수 있습니다.

 마지막으로 정리하자면
1. 상속을 통한 제약을 이용해 자바는 다형성을 구현한다.
2. 다중상속은 여러 문제점이 있기에 제거하고 부족한 다형성은 인터페이스를 이용해 해결한다.

좀더 전문적인 용어가 있었군요.
상속은 서브클래싱을 의미하고 구현(implementation)은 서브타이핑을 의미합니다.

서브 클래싱은 상속을 통해 기능을 구현하는것을 말하고
서브 타이핑은 기능을 공통적인 타입으로 묶어주는것을 의미합니다.

서브클래싱,서브타이핑에 관한 참고자료 : 자바서비스넷


Trackback 1 : Comments 11

자바의 접근제한자,인터페이스,상속?

Trivia 2008.02.23 01:23
2년전 제가 궁금해하며 썻던 글입니다.

--------------------------------------------------------------------------
자바 이 깊고 심오한 세계여. ㅋ

언어란 하나의 정형화된 문법,제약조건일뿐 본질은 그 언어를 이용한 자의 디자인인데
이거 예전 C,C++할때보다 훨씬 깊고 심오하다. 최신의 기술(디자인 패턴)이 집약되어서 그런듯.
자바는 하나의 명세 란 말이 정말 공감이 간다.

추상화 클래스도 그렇고,인터페이스도 그렇고 일단 전제가 JVM에서 돌아가는 가상의 언어니
말이다. ㅎ

공부하면서 몇몇 확립되지 않는 개념이 (프로그램 짜다보면 언젠간 정확히 이해되겠지만서도...)
접근제한자의 개념이다.

즉 PUBLIC , PRIVATE , PROTECT 3종류의 접근 제한자를 가지고있는데
사용법과 용도는 알고 있지만서도 만든사람의 의도를 정확히 모르겠다는것이다.

스스로 프로그래밍을 짜면서 제약조건을 걸고 그 제약조건으로 인해 컴파일시 오류를 잡아
내려는 것인가?. . 저런 접근 제한자 없이도 애초 디자인을 같게하면 (엄격하게 자신의 룰을
적용해서) 같은 코드가 나올것같은데.. 좀더생각해보자면 애초 디자인시 저 변수는 Private
저 메쏘드는 Public 라는 청사진에 빗대어 객체지향을 짜기 위해서인가?(캡슐화)

또는 대규모 프로젝트 진행시 다른사람이 짜놓은 코드와 충돌을 방지하기위한 안전장치..?

또 컴파일된 JAVA클래스도 상속가능한가?.. 아니면 몇몇 In/out 정보를 통해 이미 컴포넌트화
되어있는것인가..?

마지막으로 가장 궁금한건데..
인터페이스의 존재이다.
즉 어떤 동일한 기능을 하며 다른로직을 가지고있는 공통 메쏘드들을 특징에 맞추어 뽑아 내기위해
사용한다고한다면 그 목적은 단순히 공통 명세를 가지기위한 제약조건이라 볼수있는것인가?

일종의 저러한 공통 인터페이스를 제공함으로서 어떤 메쏘드에 대한 정보를 제공하며 그 메쏘드를
구현하기위한 디자인 을 제공하는것인가..?

아아..아직도 멀었구나..-_- 3년동안 자바만 파야겠다. 보면볼수록 흥미진진..

---------------------------------------------------------------------
이라고 고민했구나-_-;

정리하자면
1. 접근제한자는 왜 필요한것인가?
2. 컴파일 된 자바클래스를 상속받아서 쓴다는것이 어떻게 가능한것인가?
3. 인터페이스는 왜 존재하는가?

1.번에 대한 답변은 친애하는?아스트랄님의 답변

세 종류의 접근 제한자는 소프트웨어 공학에서 강조하는 information hiding 원리의 언어적 구현에 불과합니다. 될 수 있으면 정보를 (외부에) 숨겨야 한다는 원리...

왜 숨겨야 할까요? 숨기지 않으면 소프트웨어가 인간이 파악하기에 너무 복잡해진다는거죠. 내부적으로 사용되는것이든 외부적으로 사용되는것이든..특정 서비스(함수, 클래스, 인터페이스등등의 집합)를 외부에 전부 공개해버리면 그것을 사용하는 사용자 입장(클라이언트 프로그래머)에서는 혼란을 느낄 수 밖에 없다는겁니다.

사실 이 원리는 SW의 범위를 벗어나는 일반적인 문제로까지 확장 될 수 있는 보편성을 가집니다. 예컨대 교통사고가 났는데 이 문제로 법정공방을 하게 될 경우 당사자들이 법전을 들고 직접 재판에서 싸울 필요가 없잖아요? 일반인들로선 변호사를 선임하고 그들에게 법적 문제를 "맡기면" 되는겁니다. 이렇게 하면 법논리를 일반인들이 알 필요가 없어지고..몇조 몇항에 의거해 어쩌구 저쩌구 하는건 순전히 "변호사들"에게 private상태가 되는거죠. 일반인들은 그런 세부적 법조항에 접근할수도 없고..접근할 필요도 없는겁니다.

생각해보세요. 모든 재판에서 변호사들의 업무를 일반인들이 모두 파악하고 그 세부적인 내용들에 일일이 간섭할 수 있다면..피차 얼마나 피곤해지겠습니까? 또 엄청 비효율적이 될것 같죠?

이 원리는 사실 인간이 가진 정보처리 능력의 한계때문에 나타난겁니다. 인간이 한번에 처리할 수 있는 정보의 양이 그렇게 크지 않다는거죠. 따라서 불필요한 정보는 될 수 있으면 제외시켜야 합니다. 많은 심리학의 연구결과들은 인간의 주의집중이 한번에 한가지 과제에 대해서만 제대로 작동할 수 있다는것을 보여줍니다. 또 인간이 한번에 기억할 수 있는 양도 대단히 제한적입니다. 이런 정보처리의 제한성 때문에 프로그램의 모듈의 크기가 한 페이지를 넘지 말아야 한다거나 변수를 몇개 이상 쓰지 말라거나 하는 식의 경험칙이 등장하는거죠.

결론을 내리자면 information hiding은 "불필요한 정보는 될 수 있으면 제외시켜 나간다"는 인간의 특성을 잘 반영한 SW공학의 한 원칙입니다. 그리고 이 원칙은 언어적으로 여러가지 형태로 구현될 수 있는데 그 형태중 하나가 private, public, protected 라는 키워드를 통한 접근제한입니다.


지금에서야 알것 같은 2번 3번의 답변은 다시 쓰겠습니다.

관련글 : 자바의 접근제한자,인터페이스,상속? 2

Trackbacks 2 : Comments 6

내가 생각하는 객체지향..?

Project 2007.11.24 10:19
카페모카님의 "나의 머리속 객체지향"을 읽고 나름대로 생각해본 객체지향이다.

객체
 각각 자신의 행동과 속성을 가진 프로그램의 단위. 모든 객체는 자신을 규정하고 있는 속성과
목적을 위한 행동을 가지고있다.

상속
 표현할 대상을 분류하기 위한 수단. 실세계(구현대상)를 컴퓨터로서 표현하기 위해
대상을 일정부분 나눠서 생각하지 않으면 안된다. 대상들을 비슷한 부분과 다른 부분으로
나누어 표현하기위한 기술중의 하나이다.
 
캡슐화
 객체를 추상화하기 위한 기술. 각각의 객체는 자신을 단순하게 표현함으로서 실제의 복잡한 행동을
감출수있다. 이것은 좀더 높은 추상화 수준(Layer)에서의 구현을 가능하게 해준다.

다형성
 
공통된 행동을 가진 객체가 있다면 같은 형태로 제어할 수 있다는 것. 자바에서는 이것을
구현하기 위해서 상속 및 인터페이스 라는 기술이 사용된다. 단 다른 언어에서는 각각 다른
방식으로 이 다형성을 지원하고있다.
Trackback 0 : Comment 0