2년전 제가 궁금해하며 썻던 글입니다.
--------------------------------------------------------------------------
자바 이 깊고 심오한 세계여. ㅋ
언어란 하나의 정형화된 문법,제약조건일뿐 본질은 그 언어를 이용한 자의 디자인인데
이거 예전 C,C++할때보다 훨씬 깊고 심오하다. 최신의 기술(디자인 패턴)이 집약되어서 그런듯.
자바는 하나의 명세 란 말이 정말 공감이 간다.
추상화 클래스도 그렇고,인터페이스도 그렇고 일단 전제가 JVM에서 돌아가는 가상의 언어니
말이다. ㅎ
공부하면서 몇몇 확립되지 않는 개념이 (프로그램 짜다보면 언젠간 정확히 이해되겠지만서도...)
접근제한자의 개념이다.
즉 PUBLIC , PRIVATE , PROTECT 3종류의 접근 제한자를 가지고있는데
사용법과 용도는 알고 있지만서도 만든사람의 의도를 정확히 모르겠다는것이다.
스스로 프로그래밍을 짜면서 제약조건을 걸고 그 제약조건으로 인해 컴파일시 오류를 잡아
내려는 것인가?. . 저런 접근 제한자 없이도 애초 디자인을 같게하면 (엄격하게 자신의 룰을
적용해서) 같은 코드가 나올것같은데.. 좀더생각해보자면 애초 디자인시 저 변수는 Private
저 메쏘드는 Public 라는 청사진에 빗대어 객체지향을 짜기 위해서인가?(캡슐화)
또는 대규모 프로젝트 진행시 다른사람이 짜놓은 코드와 충돌을 방지하기위한 안전장치..?
또 컴파일된 JAVA클래스도 상속가능한가?.. 아니면 몇몇 In/out 정보를 통해 이미 컴포넌트화
되어있는것인가..?
마지막으로 가장 궁금한건데..
인터페이스의 존재이다.
즉 어떤 동일한 기능을 하며 다른로직을 가지고있는 공통 메쏘드들을 특징에 맞추어 뽑아 내기위해
사용한다고한다면 그 목적은 단순히 공통 명세를 가지기위한 제약조건이라 볼수있는것인가?
일종의 저러한 공통 인터페이스를 제공함으로서 어떤 메쏘드에 대한 정보를 제공하며 그 메쏘드를
구현하기위한 디자인 을 제공하는것인가..?
아아..아직도 멀었구나..-_- 3년동안 자바만 파야겠다. 보면볼수록 흥미진진..
---------------------------------------------------------------------
이라고 고민했구나-_-;
정리하자면
1. 접근제한자는 왜 필요한것인가?
2. 컴파일 된 자바클래스를 상속받아서 쓴다는것이 어떻게 가능한것인가?
3. 인터페이스는 왜 존재하는가?
1.번에 대한 답변은 친애하는?아스트랄님의 답변
지금에서야 알것 같은 2번 3번의 답변은 다시 쓰겠습니다.
관련글 : 자바의 접근제한자,인터페이스,상속? 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