Java 3.0이 필요한 10가지 이유

강혜원의 이미지

http://www.hanbitbook.co.kr의 기사내용 일부입니다. 전체 내용은 관련 링크를 참조하십시오.
---

지난 몇 년간 리팩토링(refactoring, 메소드와 클래스들의 이름을 새롭게 바꿔주어 점진적으로 코드 기반을 향상시키는 과정, 일반적인 기능을 새로운 메소드나 클래스들로 끌어내는 것, 그리고 대부분의 1.0 시스템에서 뒤죽박죽인 상속 관계를 깨끗이 정리하는 것)은 많은 지지(adherents)를 얻고 있다. Eclipse와 IDEA 같은 통합 개발 환경(IDEs)은 이제 자동적으로 리팩터(refactor) 코드를 만들어 주고 있다.

그렇지만 코드가 리팩토링을 필요로 하지 않는다면 무슨 상관인가? 언어(language) 자체가 모순(inconsistencies), 비능률성, 고쳐져야 할 명백한 바보 같은 행동을 가지고 있다고 해도 무슨 상관인가? 이러한 점을 살펴볼 때 자바 전체는 여타의 다른 코드 기반과 꼭 닮았다고 할 수 있다. 자바에는 약간의 훌륭한 부분, 기능적인 부분, 그리고 모두다 머리를 긁으면서 "도대체 무슨 생각을 가지고 있는 걸까?"라는 질문을 던질 수 있는 부분들을 골고루 가지고 있다.

제임스 고슬링(James Gosling)이 OAK에서 일을 시작 한지 이제 11년 정도, 그의 언어(language)는 결국 자바가 되었고, 썬이 처음 자바를 공개(1995년) 한지 7년이 되었다. 언어(language), 클래스 라이브러리, 가상 머신(VM)으로 이루어진 ‘자바‘는 이제 나이에 어울리는 행동을 보여주고 있다. 자바에는 대부분의 사람들이 동의하고 있듯이 수정해야 할 부분이 많았지만 호환성을 역행(backwards)한다는 이유로 고칠 수 없었다. 지금까지 자바 수정사항들은 ’하위(upwards) 호환성‘을 유지하기 위해 시도해온 것이었다. 따라서 모든 초기 코드들은 이후 자바 버전에서도 변경 없이 실행되어야 한다. 이로 인해 자바에서 이루어져야 할 많은 수정사항들에 제한이 가해졌으며 썬이 이와 같은 명백한 문제점들을 수정하는 것을 방해해 왔다.

이 기사는 지난 10년 간의 짐들을 버린 ‘자바 3’를 상상하고 있으며, 핵심 언어(language), 가상 머신(VM), 클래스 라이브러리에 대한 많은 변화를 제안하고...
---

기사를 읽다보니 정말 맞는 이야기 같기도 하군요. 만약 자바가 호환성을 포기한 자바 3.0가 나온다면 기존 자바에서 버려야 할것은 무엇이있고 존속하고 발전시켜야 할것은 무엇이 있을까요? 개발자 여러분의 의견을 부탁드립니다.

익명 사용자의 이미지

IO 관련 루틴을 다시 작성해야 한다는 원문 글에 100% 동감합니다.

EOF시 어떤 메쏘드는 특정 값을 리턴하고 어떤 메쏘드는 IOException을 일으킵니다.
옜날 버젼의 메쏘드들은 정리할 필요가 있을것 같습니다.
새로운 표준을 맞춰서 다시 작성해야겠죠.
deprecated 들도 이제 없애야겠구요.

런타임만 10M 넘게 나오는 것도 문제가 있다고 생각합니다.
아무리 초고속통신망이라 해도 해외망인 썬사로 다운로드 링크를 거는건 문제가 있고 비공식적으로 국내서버에 올려놓더라도 ADSL 사정으로 혹은 모뎀 유저의 초기접속 불편도 따져줘야지요.
한번만 고생하면 된다지만 그 한번 고생할 여력이 없는 사용자들도 여전히 많습니다.

API셋은 앞으로 계속 늘려나가야 겠지만 런타임의 다이어트도 진행될 필요가 있다고 생각합니다.

익명 사용자의 이미지

아예, 썬에서 다 포용해서 개발할 것이 아니라, 인증만 해주고, 솔라리스 이외 jvm 쪽까지 오픈 소스 체제로 바꾸어 버리는 것이 좋을꺼 같은데요.
(현재 정책을 정확히 몰라, 확신을 못하겠습니다.)

http://javasoft.com 에서는 해당 jvm의 다운로드나 링크만 전담 하던지..
특히 nio 도입되면서 그런 생각이 드는군요. blackdown 은 어떻게 됬으려나...

익명 사용자의 이미지

소리소문 없이 1.4가 나왔습니다. 웹사이트 관리 정말 못하는 군요 ㅡ.ㅡ;;

익명 사용자의 이미지

원문을 읽어보니 내가 정상이었군요.
원저자는 느낌에 개발자인듯하고 이곳에서 토론을 하는 사람들은 언어학자인듯 하고..

이곳의 토론 글보다 원문이 있는 곳의 토론글들이 더 이해하기가 쉽군요.
왜 그럴까요?
무식해서 그런가?

익명 사용자의 이미지

저도 동감합니다. 번역이 너무 성의가 엄써요. 일관성이라는 평범한 단어조차 그렇게 번역하다니 ㅡㅡ; 차라이 영문에 조사만 붙이지 번역은 왜 해갔고.

익명 사용자의 이미지

-_-;

자바로 졸업논문을 만들다 알았는데

java.nio에서 추가된 non-blocking io말입니다.

selector하나에 channel이 64개 밖에 안붙더군요... 걍 소문인줄 알았는데, 어이가 없습니다.

jdk 1.4.1 에서는 다른것도 아니고 selector자체에 버그가 있어서, selector가 폭주해서 한참 삽질하게 하더만... 이것들은 테스팅도 안하고 릴리즈하나... 아무루 RC였지만... FCS나와도 고쳐지지도 않더만....아 정말 열받네...

다음주 논문 마감인데, sun의 감언이설에 속았다는 생각밖에 들지 않는군요. 이런 씨댕 -_-;

걍 C나 python으로 할것을..... ㅠ.ㅠ

무턱대고 신기술(?????)을 사용한것도 잘못이지만, 아무튼 Sun이 만든건 1, 2년 기다리고 써먹어야 겠다는 생각이 문득 들었어요

흐흑... 뭔 방법 없수? -_-;

익명 사용자의 이미지

혹시 어느 플랫폼인지 알 수 있을까요?

익명 사용자의 이미지

윈도우즈 입니다! 리눅스는 다른가요?

Sun머신을 구해야 하는건가요? ㅠ.ㅜ

익명 사용자의 이미지

리눅스를 쓰시던 썬을 쓰시던 별로 차이는 없을 껍니다(물론 잘 설정을
했을 때 입니다.) 윈도는 좀 다릅니다. 아마 최대 공약수로 64를 선택
했다면 윈도 때문일 것이고 그게 아니라면 다른 운영체계에서는 더 큰
값을 사용할 수 있을지도 모르겠습니다. NonBlocking-IO를 사용하는
프로그램을 윈도로 포팅을 하다가 이런 사실을 알게 되었습니다. 이걸
피할 수 있는지는 모르겠지만 비표준(Non POSIX) 콜을 쓰면 윈도에서는
더 될지도 모르지요 :-)

익명 사용자의 이미지

음... 이건 뭐 어디 문서에 있는 건 아닌데요,
io 관련(file, socket, etc ...)은
웬만하면 솔라리스 머신에서 하시길 바랍니다.

어흐... 윈도우 머신에서 얼마나 많이 삽질을 했던지 ToT

익명 사용자의 이미지

오역 두 군데 바로잡습니다.

"그렇지만 코드가 리팩토링을 필요로 하지 않는다면 무슨 상관인가? 언어(language) 자체가 모순(inconsistencies), 비능률성, 고쳐져야 할 명백한 바보 같은 행동을 가지고 있다고 해도 무슨 상관인가? "

-> "하지만 리팩토링을 필요로하는 건 코드만이 아니다. 언어 자체가 일관성이 없고 능률적이지 못한 부분, 혹은 완전히 멍청한 부분들을 지니고 있다면 어떻게 될까?"

"OAK에서 일한지" -> "OAK(자바의 최초이름)를 개발한지"

익명 사용자의 이미지

후자가 의미 전달이 더 정확합니다. 전 좀 다르게 표현해봤습니다. 직역에 가깝습니다.

"그러나 리팩토링을 필요로 하는게 단지 당신의 코드만이 아니라면 어떻게 될까? 올바르게 될 필요가 있는 모순들,비효율들,그리고 명백한 백치 요소들을 언어 그 자체가 가지고 있다면 어떻게 될까?"

'OAK에서 일한지'는 틀렸고, 'OAK를 개발한지'는 연속선상에 있다라는 느낌이 안드는군요. 그리고 development와 work는 의미가 좀 많이 다른 것 같습니다.

"OAK에 몸담은지"가 제일 좋아보입니다.

익명 사용자의 이미지

멍청한 부분은 대체 어딜 말하는 겁니까? 이걸 번역이라고 한겁니까?

익명 사용자의 이미지

그래요? 그래도 한글보다는 영어를 더 많이 접하면서 사는 사람이고 토익도 900 이상은 나옵니다. 명백하게 뜻이 잘못된 부분을 두 군데 지적했을 뿐인데 뭐가 그렇게 못마땅한가요?

당신이 그렇게 영어에 자신있고 제가 번역한게 그렇게 못마땅하면, 딴지 걸시간에 원문이나 제대로 번역해서 올려줬으면 좋겠군요.

익명 사용자의 이미지

idiocy : 멍청한 부분 => 이게 어때서요?

익명 사용자의 이미지

http://www.onjava.com

http://www.onjava.com/pub/a/onjava/2002/07/31/java3.html

여기가 원문글이 있는 사이트 입니다.

onlamp.com, xml.com, openp2p.com 등과 더불어 o'reilly 책들의

온라인 A/S(--;;) 격의 사이트 라고 할 수 있지요(개인 적으론 그렇게 생각합니다.)

익명 사용자의 이미지

밑에다 답장할려고 했는데..

쩝...삽질 ㅡㅡ;;

익명 사용자의 이미지

C/C++ 도 물론 괄목할 만할 발전을 하고 있는 언어이고 앞으로도 인기 많은 언어로 남아있겠지만....

저런 글을 읽고 나면.. 나중에 차세대 언어의 시대가 왔을 때 C란 언어는 C가 유행이던 시절의 Assembly 언어 취급을 받을지도 모르겠군요. (사실 지금도 어느 정도는 그렇다고 봅니다)

익명 사용자의 이미지

자바를 해보면.. C++보다 더 편하게.. 프로그램을 짤수 있는
구조란걸 알수 있습미다.. 규모가 크면 클수록... 말이죠..
C++도 자바처럼 메인 문에 규제받지 않코 오브젝트 독자적으로
실행할수 있고 쉽게 합칠수 있는 구조로 갈수 있다면.. 좋으련만..

익명 사용자의 이미지

ㅆ,벌 머야. 이런 ㅆ잘데 없는 애기를 왜 올리냐?

익명사용자의 이미지

사실 자바 몇년전만해도 언어취급도 안해줬죠..
게나소라나 자바할줄안다고 했거든요. 사실 프로그램하는사람치고 자바할줄모르는사람도 없죠..
그렇다고 다른언어가 머 없어지거나 그렇지 않죠.. 예로 쉘스크립트가 제아무리 날고뛰어봐야 스크립트는 스크립트일뿐이죠..

익명 사용자의 이미지

재미있는 글입니다.

당연한, primitive type의 객체화로 auto boxing/unboxing 정도 추가나,
gj추가, 새로운 디버깅 프레임웍 추가만되면, java 3를 고려해 봐야 하겠다는
생각을 했는데,

훨씬 광범위한 지적을 글에서 하고 있군요.
하지만, 저정도는 저자의 이상적인 상황을 고려한것 같고,

기존에 갖추어진 하위 호환성을 생각하면, 정말 이상적인 이야기 같네요. ;;
지금도 Tomcat 에서 1.4로 넘어가냐 마냐를 이야기 하고 있는 시점에서 말이지요.

java 3이 논의와, 알파버전의 등장하는 시기는 아무리 빨라도 2년내로 되기에는 ^^;;
1.5가 발표되는 내년 후반기 이후에 라고 생각하면 흠.

익명 사용자의 이미지

자바 3가 J2SE 3.0을 의미하지는 않습니다. 썬의 대표적인 삽질 마케팅의 하나로 J2SE 1.2가 나온 시점에서 이를 기존 1.1.x와 구분하기 위해 'Java 2'라고 부르기 시작했는데, 1.3, 1.4가 속속 등장하면서 혼동이 생기기 시작했습니다.

어쨌든 이름만 붙이면 1.5 버전이 곧바로 자바3가 될 수 있습니다.

익명 사용자의 이미지

저도 같은 이해 하고 있습니다. 제가 글을 분명치 않게 써서 의미 전달이 잘못되었군요.

sun에서 구지 삽질 마켓팅이면서 구분한 이유가, 장족의(?) 변화를 부각시키기 위한
것이겠지요.

해당 기사의 필자는 Java 1,2,3 의 구분을 하위호환성을 버릴 만큼 혹은 개발자가 새롭게 배울만큼 큰 변화로 규정지은듯 합니다.

그런 관점을 저도 동의하며,

이상적이라면, Java 1.5 나오면서 Java 3 라는 명명 법과 함께 10가지중 몇가지라도 반영되기를 바랍니다. 하지만, 1.5 역시 그런 획기적인 이야기는 오고가지 않는듯 하군요. 그래서 Java 1.6 이 나오는

시점에나 선포(?)가 가능하지 않을까 하는 생각이었습니다.

익명 사용자의 이미지

아, 그리고 기사를 한글로 작성하신 분이 Java 3.0 에서 .0 을 붙이신게 아닐까요. 원문 링크를 찾고 싶었지만, 없네요. 그렇지 않고서야 3.0 이라는 표현이 들어갈리가 없을것 같은데.. (해석 본문 중에도 Java 3라고 하지 3.0 이라는 표현은 없거든요.)

익명사용자의 이미지

썬이 자바의 애초방향설정을 바꾸려니.. 뭔가 핑계꺼리를 내세워야겠기에.이런식으로 내놔야 욕을덜먹죠..

무작정 호환안되게 했다가는 욕먹을껏같고.. 해서.. 니들을위해서다.. 이러면서 내놓는거죠..
좀있으면 자꾸변해서 초기 내세우던 개념은 없어지고 이름만자바고 다른언어가 될듯..

익명 사용자의 이미지

지금 생각나는 건 다음 두 가지군요.

(1) deprecated된 클래스나 메소드, 필드의 제거
- 제가 알기로 하위호환성을 위해 아직 한 번도 제거된적이 없지만 구조의 명료함을 위해 반드시 필요한 작업입니다.

(2) generics의 추가
- 지금도 별도로 다운을 받아 사용할 수 있지만 언어 자체에서 genercis를 지원해야 합니다.

나머지 공유 VM이나 컬렉션 API의 성능향상, 그리고 스윙의 기본 룩엔필을 최소한 윈도우즈 수준의 모던한 디자인으로 바꾸는 등은 개선사항들입니다.

익명 사용자의 이미지

개인적인 바램입니다만 현재 사용되는 Static Type Checking 대신에 Objective-C나 Smalltalk과 같은 Dynamic Type Checking이 되었으면
합니다. 이를 통해서 Generics의 필요성을 없앨 수 있지 않을까요?
그리고 불필요한 (String)a.getObject()와 같은 Type casting도
없앨 수 있고... Smalltalk과 같은 언어를 사용하다가 Java를 쓰면 다 좋은데
이게 가장 불편하고 불필요한 인터페이스나(순전히 타입을 맞추기 위해서
존재하는...) 클래스의 생성을 피할 수 있을 것 같네요... 왜 다른 것은
거의 같은데 Syntax와 Type Checking Scheme만은 C++를 따랐는지...

익명 사용자의 이미지

저 또한 Java가 Objective-C 와 같이 Dynamic Type Checking이 되었으면 좋겠다고 생각하기도 합니다. 반대로 C++처럼 Generic Programming이 되는 것도 좋다고 생각합니다. 어느 쪽이건 분명해지는 것이 좋을 것 같습니다. 지금의 Java는 이것도 아니고 저것도 아닌, 뭔가 상당히 애매하다는 느낌입니다.

C++에서는 상속을 이용하는 경우와 template을 이용하는 경우를 분명하게 구별합니다. (이것을 제대로 구별하지 못하면 C++ 개발자라고 할 수 없습니다.) 반면 Java에서는 이 모든 것을 class 상속과 interface를 이용해서 해결해야 합니다. 그러나 이것만으로는 template을 깔끔하게 대체할 수 없습니다. 그 때문에 type casting을 이용해야 합니다.

여기에서 문제(제가 느끼기에는 그렇습니다)가 발생합니다. 상속만으로는 type 자체가 대체되는 것을 제대로 표현할 수 없으므로 type casting을 사용하지만, 정작 컴파일러는 이 typecasting이 유효한 것인지 아닌지를 검사하지 못합니다. 결국 type checking은 run time에서 수행해야 합니다.

그러나 run time에 check하도록 되어 있는 것도 아닙니다. 그러면서도 compile time에 type checking을 '엄격하게' 수행하기 때문입니다. 그 때문에 일일이 (type)expr 형식으로 type을 지정해 주어야 합니다. 즉 compile time도, run time도 type checking의 주요한 부분을 담당하지 못하고, 엉뚱하게도 coding time(이런 말은 없겠지만)에 type checking의 가장 중요한 부분을 수행해야 하는 셈이 됩니다.

공연히 글이 길어진 것 같은데, 결론을 말하자면 이렇습니다. 손으로 type casting 을 일일이 해야 하기 때문에 type 문제를 run time에 처리하는 경우의 편의성도 제공받지 못하고, 또 손으로 type casting을 해 준 것이 안전한지를 compile time에 확인하지도 못하기 때문에 type문제를 compile time에 처리하는 경우의 안전성 역시 보장받지 못하는 것입니다.

좋게 보면 절충이라고 할 수 있을지도 모르지만...적어도 손으로 typecasting을 해 주는 것이 C++의 Generic Programming의 경우보다 편하다고는 생각되지 않습니다. Objective-C의 경우와 비교해서 안전한지는...그 쪽으로는 경험이 부족해서 잘 모르겠습니다.

어느 쪽이건 확실하게 해야 한다고 생각합니다. 일단 발표된 내용으로 보면 Genenric Programming 쪽으로 가려는 것 같군요.

익명 사용자의 이미지

동감입니다. gj가 등장을 하겠지만, nio 와 함께 Java로의 초기 진입장벽을 지나치게 높여버리는 것이 아닌가 우려됩니다.

또 하나, collection framework 가 gj를 도입하면서 같이 등장했으면 더 좋왔을텐데..

여담으로, gj로 ide만 더 죽어나겠다는 생각도 드는군요.

익명 사용자의 이미지

요즘 언어들은 컴파일러가 형검사들 통해 문제를 발견하도록 강한 Type checking을 하고자 하는 것이 전반적인 추세입니다. 소위 Type Safty라는 것인데, 이것은 생각보다 중요한 역할을 합니다. 뭐 코딩 잘못해서(소위 Type 잘못 넘겨서) Bug가 생기면 전적으로 프로그래머 책임이겠습니다만 그런 것을 찾아내는 역할을 컴파일러가 대신 해주겠다는 것이죠. 좋은 세상이니 너무 비관적으로 생각할 이유는 없습니다.

그리고 (String)a.getObject() 처럼 쓰는 이유가 있습니다.

a가 이미 String Type라고 해서 a.getObject()가 뽑아내는 타입이 String이라고 단정짓기는 어렵습니다.

만약 이 method가 Base Class에 속해 있고 Base Class에서 파생된 모든 자손들에게 상속이 되었다면 getObject()가 리턴하는 참조 포인터(&)는 Base Class의 포인터입니다. 이 경우에는 반드시 String으로 캐스팅해야하지요.

만약 이 method가 Base Class에 virtual 선언되어 있고 Base Class에서 파생된 모든 자손 Class에서 override된다면 굳이 Casting을 할 필요는 없지요.

getObject()같은 method는, Base에 하나 만들고 상속을 하든, virtual로 하고 각 파생 클래스에서 override하든, 둘 모두 일리있습니다.

어떻든 Class 체계가 전자와 같이 이루어 졌다면 캐스팅 반드시 해야하고 후자와 같이 이루어졌다면 캐스팅안해도됩니다.

근데 후자로 클래스를 구성하지 않았을듯합니다. 이유는 이러합니다.
만약 String을 상속받아서 새로운 클래스를 구성한다고 합시다. 그러면 상속받은 클래스에서 getObject() method를 Overrdie해야하는데 즉 다시 함수를 만들어 하는데, 귀찮은건 둘째 치더라도, getObject()가 반환하는 값이 정직해야하는데 프로그래머가 엉뚱하게도 다른 클래스(상속 관계도 없는)의 참조 포인터를 반환하게 했다면 Type Safty가 파괴되는 중대한 사태를 초래하겠지요.

다시 전자로 가서, Base Class에 있는 getObject() method를 파생 Class 모두와 공유하게 된다면 최소한 Base Class에 대한 포인터 값으로 Base Class에서 파생된 모든 Class를 표현할 수 있다라는 장점이있죠. 물론 사용할때 Casting을 해야한다라는 또 다른 작업을 해야하기는 하지만.

본인의 생각으로는 전자가 Type Safty의 측면에서 훨씬 나아보입니다. 후자는 OOP의 역할에 더 충실하군요.

그리고 String은 Class입니다. int도 Class입니다. 물론 C++에서.
또한 C++에서 int는 더 이상 C의 int도 아닙니다. 이것도 클래스입니다.

익명 사용자의 이미지

지금 설명하신 (String)a.getObject()에 관한 이야기는 C++에 관해서 이야기 하신건가요? 지금 논의 되는 언어도 Java고 원래 (String)a.getObject를 언급하신 분도 Java 코드를 말씀하신 것 같은데 말이죠.
Java에는 모든 method가 final로 override하지 못하게 명시적으로 막아주지 않는한 항상 C++에서의 virtual method와 같이 사용됩니다. C++에서나 virtual이다 아니다의 구분이 있는 거죠.
그리고 마지막에 C++에서 int가 class라는 건 처음 듣는 말이네요. Smalltalk같은 순수 OOP 언어에서나 그런거 아닌가요?

익명 사용자의 이미지

int가 Class인건 C#이죠, 그 부분은 제가 착각을 했군요.

그리고 virtual에 대해서 좀 더 자세히 언급하겠습니다.

virtual method뿐만아니라 일반 method도 override될 수 있죠.
그리고 virtual은 method의 동적 바인딩을 의미하는 키워드죠.

정적 바인딩은 선언된 타입을 기준으로 method를 호출하지만 동적 바인딩은 선언된 타입과 무관하게 실행 시간에 사용되는 타입에따라 동적으로 method를 호출합니다.

virtual method가 아닌 일반 method를 override하면 실행 시간에 해당 타입이 뭐든간에 override된 method가 호출되기에 왜 이런게 필요한지 의아해할 수도 있을겁니다. 자바처럼 아예 동적 바인딩만해도 대개의 경우에는 별무리가 없고, 게다가 대개의 경우 동적 바인딩이 필요한 상속 관계이지요.

가만 생각해보니 일반 method를 동적이 아닌 정적으로 Override를 하는 일이 굉장히 어색해보이기도 하고 이렇게 하는게 왜 필요한지도 좀 궁금하기도 합니다. 일반 method를 override를 하는건 좀 불필요한 일같기도 하기에 자바처럼 아예 override시에는 무조건 동적 바인딩을 하는 방식으로 하는 것도 일리있습니다.

어떻든 virtual은 이런 것입니다.

제가 위에서 설명한 캐스팅이 필요한 이유에 대한 글은 동적이냐 정적이냐가 중요한게 아니라, virtual method로 선언해서 모든 자손 클래스가 상속받아 그 method를 재정의를 하게 하느냐 아니면 Base Class의 method를 상속받아 재정의 없이 공유하는냐의 문제입니다.
Base Class의 method를 공유한다고 하면, 자손 클래스에서는 해당 method를 달리 재정의할 필요가 없지요. 다만 사용시에 이것은 자손중에 어떤 것이다라는걸 알릴 필요가 있다라는 것이지요. 캐스팅을 해서 말이지요.

익명 사용자의 이미지

주제와는 별 관계는 없겠습니다만.... C++에서

> virtual method가 아닌 일반 method를 override하면 실행 시간에 해당 타입이 뭐든간에 override된 method가 호출

...되지는 않습니다. 이것은 virtual function의 경우에만 해당됩니다.

class BaseClass
{
public void st_func();
public virtual void vt_func();
};

class SubClass
{
public void st_func();
public virtual void vt_func();
}

BaseClass *b = new SubClass(c);

b->vt_func(); // SubClass의 vt_func()가 실행됨
b->st_func(); // BaseClass의 st_func()가 실행됨

일반 method를 정적으로 override해도 되는 것은 base class type의 변수로 subclass type object를 결코 사용하지 않을 경우입니다. 일반적으로는 override해야 하는 경우에는 virtual로 사용합니다.

그러나 override하지 않을 member function의 경우에는 virtual이 아닐 필요가 있습니다. 실행속도 면에서 차이가 나기 때문입니다. 무엇보다도 virtual로 선언된 memeber function은 inline으로 선언될 수 없다는 결정적인 문제가 있습니다.

익명 사용자의 이미지

글쎄요?

-----------------------------------------------------------------------
>>일반 method를 정적으로 override해도 되는 것은 base class type의 변수로 subclass type object를 결코 사용하지 않을 경우입니다
-----------------------------------------------------------------------

만약 이런 제약이 진짜 있다면 컴파일시 오류가 나야겠죠. 그러나!

virtual을 없애고 정적으로 override했을때,

class BaseClass
{
public void st_func();
public void vt_func();
};

class SubClass : public BaseClass
{
public void st_func();
public void vt_func();
}

BaseClass *b = new SubClass(c);

b->vt_func(); // BaseClass의 vt_func()가 실행됨
b->st_func(); // BaseClass의 st_func()가 실행됨

이렇게 될겁니다.

즉 선언왼 타입이 BaseClass* 이기때문에 여기에 어떤 자손 클래스가 할당이 되건간에 b->vt_func(); 는 BaseClass의 vt_func()를 호출하죠.

익명 사용자의 이미지

저와는 정 반대로 말씀하시는 것 같은데, 코드를 보면 같은 이야기인 것 같습니다. -_-;;;

>>일반 method를 정적으로 override해도 되는 것은 base class type의 변수로 subclass type object를 결코 사용하지 않을 경우입니다

...라고 말씀드린 것은, 윗글에서 지적하신 대로, virtual이 아닌 경우에는 SubClass의 instance인 경우에도 BaseClass의 member function이 실행되기 때문입니다.

이것은 일반적으로 잘못된(즉 '의도하지 않은') 동작이기 때문에 문제가 됩니다. 그렇지 않다면 굳이 SubClass에서 member function을 override하거나 SubClass의 instance를 사용할 필요가 없었을 것이기 때문입니다. (C++에서 문법적으로 오류라는 의미가 아닙니다.)

익명 사용자의 이미지

정적 method에 대해 override를 하는 것은 분명 사용은 할 수 있지만 왜 그렇게 사용하는지에 대해서는 궁금하다고 위의 글에서 이미 언급했습니다.

>>일반 method를 정적으로 override해도 되는 것은 base class type의 변수로 subclass type object를 결코 사용하지 않을 경우입니다

이 말은 여전히 애매한데, 언어상의 제약이 있어서 그렇다는건지 아님 일반적으로 그렇게 사용해서는 안된다라는 말인지 구분이 모호하군요.

단지 사용을 터부시하는 것이라면 이미 제 생각과 같습니다.

goto가 그러하듯 사용은 터부시하지만 이것을 쓸 수는 있습니다.

정적 method의 override의 경우도, 이렇게 사용할 이유는 없겠지만 아마 이렇게 사용하는 것을 허락을 하는건 분명 우리가 모르는 어떤 이유가 있어서 이겠지요.

익명 사용자의 이미지

read effective C++

거기에 보면 답이 있읍니다.

익명 사용자의 이미지

제 글을 좀 자세히 읽어보시고 답장 해주시면 더 좋겠습니다 ^^

virtual에 대한 개념은 저도 잘 알고 있구요
제가 지적한점은 Java에는 virtual이라는 keyword가 없고 암시적으로 instance method 들이 virtual로 선언된다는 거였거든요.

익명 사용자의 이미지

어 그리고 추가하자면 C#에서도 int가 class인건 아니죠
자동적으로 boxing과 unboxing을 지원할 뿐이죠 ^^

익명 사용자의 이미지

클래스 맞습니다. 누가 뭐라거나, 우겨도 그것은 클래스입니다.

그리고 Boxing/Unboxing은 값 타입과 참조 타입의 변환 과정입니다.

C#은 클래스를 사용하여 선언된 참조 타입과 구조체를 사용하여 선언된 값 타입을 구분합니다.

값타입은 선언시 자기만의 공간 소위 instance를 만들지만 참조 타입은 그렇지가 않지요. 그래서 둘의 =도 의미가 다릅니다. 값타입에서는 값을 할당하는 것이고, 참조타입에서는 참조(C++의 &를 떠올리면됨)를 할당하지요.

boxing은 값 종류를 참조할 대상으로 되게하는 것이죠. unboxing은 그 역과정입니다.

값 타입끼리 또는 참조타입끼리 할당하거나 연산될때는 boxing/unboxing에 대해 고민할건 전혀없습니다. 그러나 값 타입을 참조할 대상으로 해야 하는 상황에서는 반드시 고려해야하지요.

예를들자면 함수에서 참조로 파라미터를 넘길때 그러합니다.

익명 사용자의 이미지

그걸 몰라서 하는 얘긴 아닌것 같군요.

static typing이 전반적 추세라는것은... commercial language에서나 있을법한 얘기 아닐까요?

동적 타이핑도 분명히 장점이 있습니다.

익명 사용자의 이미지

무슨 얘기를 하자는건지?

캐스팅을 동적으로 하든 정적으로 하든 위에서 말한 캐스팅은 해야하는 겁니다. 위 글은 a.GetObject()후 왜 (String)을 붙혀야 하는지, 즉 캐스팅에 대해서 쓴 것이고, 동적 캐스팅에 대해서는 언급을 하지도 않았습니다.

사실 언급할 필요성도 못느꼈고, 왜냐하면, 이전 글 쓰신 분이 동적 캐스팅과 타입 자동 감지를 잘 구분 못하는 것 같아서요.

동적 캐스팅(위의 분의 동적 Typing이라고 하덥니다만)도 엄밀히 말해서 캐스팅을 명시적으로 써서 처리하는 것입니다. 즉 캐스팅을 하되 컴파일타임에 정해진 타입을 기준으로 하는게 아니라 런타임시에 할당된 타입을 기준으로 캐스팅을 한다라는 의미이지요.

C++같은 경우는 dynamic_cast라는 operator를 사용해서 처리하지요. C++에는 이것 말고도 3개 더 있습니다. C의 경우는 단지 괄호만 써서 구분없이 캐스트합니다.

익명 사용자의 이미지

캐스팅에대한 정적/동적 얘기가 아닌듯, 자바에서 타이핑 얘기는 이만 접도록 하지요 -_-; 한 프로그래머분의 희망사항이었으니...

익명 사용자의 이미지

글쎄요... 제 생각에 동적/정적인 형검사의 선택은 언어의 사상에 따라 좌우된다고 생각합니다. 자바의 특성상 무엇보다 type-safety를 우선으로 생각하기 때문에 어쩔 수 없는 선택이 아니었을까요? generics가 논의되는 가장 중요한 이유도 오히려 컬렉션 등을 사용할 때 컴파일 타임에 형검사를 가능하게 하는 것이니까요.

익명 사용자의 이미지

네 알고는 있습니다 :-)
제가 쓴 글은 그냥 저의 바램이지요..

그리고 참고로 OOP를 구사할 수 있다고 생각되는 능력을 가진 프로그래머들의
대부분은 Smalltalk과 같은 언어가 더 낫다고 생각하는 조사 결과가 있었습니다.(실제로는 OOP능력을 테스트를 해서 어느쪽이 더 나은가 였었습니다, 제가
링크를 잊었는데, IBM에서 조사한 것이었습니다. 그러나 비용대 인원으로
본 결과는 함수 지향적인 언어, 여기에는 C++, Java도 들어 갑니다, 가
더 낫다고 나오더군요, 이건 나쁘게 말하면 객체를 사용할 수 없는 능력의
개발자를 끌어들이기 위한 것으로도 해석이 가능합니다...)

그리고 제가 보기엔 Java는 다이나믹 OOPL의 특징을 가진 언어입니다. 단지
위에서 언급된 결과 처럼 함수 지향적인 개발자들을 끌어들이기 위해서
그 Syntax를 선택한 것으로 보입니다.(Objective-C와 비교를 해 보시면 됩
니다, 그 차이 이외에는 없습니다, Reflection이 더 복잡한 것을 빼면...)

그러나 세상은 순수한 것으로만 되지는 않는다는 것을 저도 알고 있습니다.
Alan Kay도 그런 말을 했었고...

익명 사용자의 이미지

음... 제가 볼 때 동적 형 검사의 가장 큰 문제점은 프로그램 코드나 클래스 구조만 보고는 프로그래머의 의도를 명확히 알 수 없다는 점입니다. 능숙한 개발자는 동적으로 형을 검사해도 오류를 피해갈 수 있을지 몰라도 이런 문제는 여전히 남습니다.

익명 사용자의 이미지

>> 그리고 제가 보기엔 Java는 다이나믹 OOPL의 특징을 가진 언어입니다.

어떤 이유로 그렇게 보시는지요?

익명 사용자의 이미지

위레 쓴 글처럼 Syntax를 제외하고는 Smalltalk이나 Objective-C의 특징을
모두 가지고 있습니다. 즉, C++와는 외모는 같지만 내용은 ST에 가깝다는
말입니다. 단지 Function위주의 문법을 채택함으로 인해서 message를
통한 동적인 형 검사를 하지 않고 정적인 검사를 하는 것이지요.
위에 글처럼 rt= (String)a.getObject()(또는 rt = [a object])에서
rt가 지켜야 하는 것은 String이라는 타입이 중요한 것이아니라 다음에
자신이 받을 메시지 또는 함수가 중요하다는 것이죠 (rt.doSomething() 또는
[rt doSomething]) doSomething() 또는 -doSomething을 받을 수만 있으면
String이 될 필요가 없는데 정적 타입 검사를 하게되면 이걸 위해서
Interface나 Parent Class를 만들어야 하는 문제가 있습니다(Interface는
Objective-C에서도 Protocol의 형태로 있기는 합니다, 정적으로 엄밀한
검사를 하고 싶다면 사용할 수 있지요...)

익명 사용자의 이미지

ㅎㅎ

익명 사용자의 이미지

역시 동감.
만약 dynamic type checking 이라면, Script Language 처럼 형선언 자체가
무의미 해지겠지요. 예를들어

String message = "밥드세요";

message = "밥드세요";

처럼요. 그런데 String 에 해당하는 type써주기 요즘에는 무지 귀찮더군요. ;;
예를들어 다음과 같은 경우

StringBuffer stringBuffer = new StringBuffer(100);

그냥

stringBuffer = new StringBuffer(100);

도 허용했으면 하는 작은 소망이 --;; 엇 글이 삼천포로.

익명 사용자의 이미지

선언 안한다는건, 다른 동적언어의 특징에 비하면, 장점도 아니지요.

l = new List();

l.add(whatEver);

l.get().whatEversMethod();

Generic으로 '어느정도'극복 할 수 있겠지만... -_-;

익명 사용자의 이미지

아, 제 의도는 그런것 이라기 보다는요.

l = new List();

라는 문법이라면

(List) l = new List();

같이 선언이 자동으로 된것이라면 편하겠다는 생각이 들어서요.
거꾸로 짜다 보니 그런 생각이 드네요.

물론 다음과 같이

Object l = new List();

같이 명시적으로 할수도 있고 말이지요. 아, 문법의 일관성에서 문제 생기는군요. 주저리 주저리 잡담입니다. ;;

익명 사용자의 이미지

선언을 자동으로 한다는건 좀 의미가 많이 이상하군요.

모든 타입 체크가 선언과 정의을 기준으로 이루어지는데, 이 상황에서 선언을 컴파일러에게 맡기면 타입 체크는 누가 뭘 믿고하나요? 뭐 사실 이것도 컴파일러가 못할 법도 없기는 하군요.

님의 의도는 R값을 보고 L 값의 Type을 추정할 수 있으니 가능한 것 아니냐라는 생각같군요. 단지 저렇게만 쓸때는 별탈없이 쓸수 있지만, Class 상속하고 상속된 클래스끼리 뭐하고, ... 이런 복잡한 일을 한다치면 선언은 필수적이라고 생각합니다. 이런 복잡한 일을 할때 사람도 어떻게 선언을 해야 할가 고민을 하는 형편에 기계가 알아서 감지하기란 불가능해보입니다.

단지 new를 사용할때만 자동으로 붙이게 하는건 선언의 일관성을 고려했을때 신뢰성을 잃게 할만한 코드가 되겠지요.
게다가 new를 보고 타입을 감지할려면 컴파일러에게 또 다른 많은 처리가 필요하지요. new에 자동 타입 형성 기능을 넣어야 한다라는.. 또 new는 단지 함수의 변형체인데, 이 기능을 넣을려면 아예 키워드로 승격시켜야 하지요. 키워드로 승격시키면 언어의 덩치가 커지고, 컴파일러가 해당 언어를 구현하기 위해 들일 일도 많아지고.

이왕 키워드로 승격할바엔 아예 이렇게 하는게 좋겠군요.

List I();

즉 new같은건 없애 버리고, 선언시에 자동으로 new 를 호출하겠끔.
제거할땐 각 클래스들은 자체 제거 기능을 필수로 상속받아 I.Dispose처럼 해서 제거하고.

근데 놀랍게도 C#이 이렇게 합니다. 물론 값 타입 선언과 참조 타입 선언으로 나뉘어져, 그 중 값 타입 선언에 대해서만.

익명 사용자의 이미지

선언을 그렇게 한다는 것 자체를 이상한것으로 저는 못느끼겠습니다.
하지만 중간에 말씀하신 신뢰성 없는 코드 생산에 동의합니다.

결국 프로그래머에게 혼돈을 주지 않기위해서는 dynamic type checking 가능한 script language 상에서나 할법한 이야기 이지요.

그리고 말씀하신 모습의 선언.

List l();
의 모습도 제게는 그리 환영할 만한 모습은 아닙니다.

같은 선언에서
List l = new List();

에서 중복되는 List 를 줄이는 것을 중점으로 말씀 드리는 것이 아니라.

type의 선언이 앞에 오는 것을 피하고 싶은 경우가 요즘에 있어서요. 이유를 자세히 말씀드리기는 너무 길어질것 같구요. TDD(TestDrivenDevelopment)를 조금씩 시도하면서 느끼는 점 이라고 줄입니다.

논외로,

C#에서 해당 문법을 허용한 것이 놀라울 만한 일은 아닐 것으로 생각합니다. Java의 초반 설계시 C/C++ 유저를 수용하되, 좀더 프로그래밍 자체에만 집중하도록 하자 해서 의도적으로 뺀 부분으로 생각합니다.(집중할수 있는 이유는 뒤에 언급)

그래서 Java를 처음 배울때 구지 vector type과 scalar type을 나누어서 나를 괴롭게 하는가 고민을 했습니다.
int b = 10;
int a = new int(b)'
로 안쓴다는 생각에 안도를 하지만요.

C#에서 이런 call by value 가 가능해져서 프로그래머에게 더 많은 자유도와 함께, 혼란을 가지고 올수 있을 것이라 생각합니다. 허용에다, in-out까지 존재하니 C# 이 프로그래밍 contents 보다 그외의 인자에 선택의 기로에 서게 만들수 있다는 생각을 합니다.

제가 C#을 그리 많이 본것이 아니라, 가타부타 할수는 없겠지요.
하지만 C++로 작성시 value, reference, pointer, auto_pointer, 중에 선택의 기로에 놓일때 화가 나서요. --;

익명 사용자의 이미지

선언이 앞에 오는게 싫으면, 델파이나 비쥬얼 BASIC을 써야겠죠.

C/C++,Java,C# --> int X;
Delphi --> X:integer;
VB --> Dim X as integer

머 다 취향이겠습니다만 각 언어마다 고유의 특징은 있는 법이지요.

그리고 script language 에서나 할법하다하며 님이 언급하신 그것은 동적 타입 체킹이 아니라 아무래도 Variant Type이겠지요.

Variant Type은 자유자재로 변신하는 하나의 동적 클래스일뿐입니다. 물론 이것은 동적 타입 체킹 기능은 가지고 있겠지요. 그러나 일반적으로 일컷는 동적 타입 체킹은 이런 의미가 아니고 컴파일 타임이 아닌 Runtime시에 관여하는 타입 체킹을 의미합니다.

그리고 모든 변수가 기본적으로 Variant Type이라면 그것은 언어로서의 가치가 현저히 떨어집니다. Variant 쓰면 메모리 낭비,속도 저하,코드의 난잡해짐등등 치루어야 할 댓가가 크죠.

익명 사용자의 이미지

일단 이 논의중 일부로 Java의 문법적 변형에 기반한 을 생각한것이라, 말씀하신 해당 언어들을 언급하지 않았습니다. Java상에서 어떻게 수용가능할까 라는 생각 이었습니다.

논외로,

언어적 가치가 현저히 떨어진다는 표현은 너무 심하다는 느낌입니다. script language들은 모두 기본적으로, 말씀하신 Variant Type이 아닐까요?(이부분은 제가 확신이 없네요.) 그중 상용으로 쓰이는 것도 많으니까요.

ps. pascal 손놓은지도 꽤 되는데, 잡고 싶어지네요. 괜히

익명 사용자의 이미지

Pascal, 좋죠. ^_^a

쓴귤의 이미지

Quote:

님의 의도는 R값을 보고 L 값의 Type을 추정할 수 있으니 가능한 것 아니냐라는 생각같군요. 단지 저렇게만 쓸때는 별탈없이 쓸수 있지만, Class 상속하고 상속된 클래스끼리 뭐하고, ... 이런 복잡한 일을 한다치면 선언은 필수적이라고 생각합니다. 이런 복잡한 일을 할때 사람도 어떻게 선언을 해야 할가 고민을 하는 형편에 기계가 알아서 감지하기란 불가능해보입니다.

불가능하지 않습니다. http://en.wikipedia.org/wiki/Type_inference

http://mentalese.net
http://functional.or.kr

익명 사용자의 이미지

그렇죠...
자바가 동적 타입으로 갈 가능성은 0

익명 사용자의 이미지

미처 본문 링크가 있는지 몰랐네요. 제가 미처 생각하지 못했던 부분이 많더군요. 자바 개발자라면 한 번쯤 진지하게 고민해볼 내용이 많았습니다. 주제 올리신 분께 좋은 자료 제공해주셔서 감사하다는 말씀드리고 싶군요.

본문에 AWT를 버리자는 부분은, 개인적으로 SWT로 대체했으면 합니다. 그렇다면 자바로도 네이티브 어플리케이션과 동일한 UI를 얻을 수 있고 SWT의 한계는 기존처럼 스윙으로 커버할 수 있으니까요. 물론 AWT때와 마찬가지로 경량 컴포넌트와 그렇지 않은 컴포넌트를 함께 쓸 때 발생하는 문제는 피해갈 수 없을 것입니다.

주제와는 조금 벗어난 이야기지만, SWT를 사용한 어플리케이션인 이클립스의 경우 오픈소스 IDE로서 그 정도의 프로페셔널한 UI와 기능을 보여준 예는 없는 것 같군요.

조만간에 C/C++ 지원기능도 보강되면 자바와 C/C++을 비롯한 다중언어를 지원하는 최강의 오픈소스 IDE가 될 수 있을 것 같습니다.

그럼...

익명 사용자의 이미지

AWT를 상속해서 확장한 Swing클래스가 많은데요. AWT코드를 Swing클래스에다 넣어야 겠네요?
AWT가 네이티브 어플리케이션과 동일한 환경을 사용할 수 있다면 추가하는데는 동감합니다.

익명 사용자의 이미지

바로 글올리니까 오타가 보이네요. 다시 씁니다.
------------------------------------------------
AWT를 상속해서 확장한 Swing클래스가 많은데요. AWT코드를 Swing클래스에다 넣어야 겠네요?
SWT가 네이티브 어플리케이션과 동일한 환경을 사용할 수 있다면 추가하는데는 동감합니다.
------------------------------------------------

익명 사용자의 이미지

저 역시 SWT의 내부 구조는 모릅니다만 AWT를 스윙으로 넣는다기 보다는 스윙을 SWT위에서 재구현하는게 낫지 않을까 싶습니다. 어차피 스윙은 다 경량컴포넌트 들이니 그렇게까지 어려운 작업은 아닐 것이라고 생각합니다. SWT가 있다면 비슷한 성격의 AWT가 같이 있을 이유를 못찾겠군요.

SWT를 사용한 이클립스를 윈도우즈2000과 그놈2에서 동시에 사용하는데 속도도 만족스럽고 무엇보다 다른 네이티브 어플리케이션과 구분이 안가서 좋군요.

아래는 비교를 돕기위해... 라기보다는 스샷 자랑 :) 을 위한 링크입니다.

http://gnome.or.kr/gallery/view_photo.php?full=1&set_albumName=gnome-apps&id=adg

http://gnome.or.kr/gallery/view_photo.php?full=1&set_albumName=gnome-apps&id=adl

익명 사용자의 이미지

1등이다!

gamdora의 이미지

2002년 글타래네요.

4년 넘게 지난 것 같은데,

그 동안 자바*는 어떻게 발전했을까요~?

익명사용자의 이미지

4년전 글이네요...

처음에 봤을때는 이 글을 쓴 사람의 이름이 저랑 동명이인인줄 알았는데, 알고보니 위 글은 제가 쓴것 같습니다. -_-;;;

제가 느끼기에 그동안에 바뀌었던 부분들을 짤막하게 적어봅니다.

위에서 지적하시던 Selector에 등록할수 있는 SelectionKey의 개수가 63개밖에 안되던 버그는 수정되어서, Integet.MAX_VALUE까지 등록할수 있게 되었습니다.

Java의 이름은 1.5버전부터 5.0이라고 불리고, Generic이 언어에 포함되었습니다.

여전히 deprecated된 메소드도 아직까지 불러서 쓸수 있고, SWT는 Java에 포함되지 않았습니다.

AWT와 스윙에 대해서 많은 기능 개선사항이 있었고, SWT만큼 빨라져서 GUI 어플리케이션 개발에 충분히 만족할만한 수준이지만,

여전히 인기는 없습니다.

썬에서는 Applet의 부흥에 힘을 쏟았고, ActiveX의 대안으로 Java Web Start를 추진했지만, 역시나 여전이 인기가 없습니다.

JMF는 2002년에서 거의 발전되지 않았고, 2004년이후로 릴리즈가 없습니다.

플레이스테이션과 XBOX360같은 차세대 게임기들이 출시되었지만, 여전히 게임개발에서는 C++이 사용되고 있습니다.

이클립스 커뮤니티가 썬의 자바 영향력을 덮어버릴만큼 엄청나게 성장해버렸고, 덕분에 썬은 넷빈즈 개발툴을 무료화하고 커뮤니티에 적극적으로 다가가고 있습니다.

웹개발에서는 Struts, Spring, Hibernate, iBatis같은 프레임웍들이 대세가 되었고, JBoss는 레드햇에 인수되었습니다.

썬이랑 MS는 화해했고, Java의 많은 부분을 .NET이 가져갔지만, 처음에 기대했던 만큼의 성과는 아니였습니다.

썬이 Java의 JVM라이선스 제한을 약간 놓아주어서, 우분투같은곳에 JVM이 포함될수 있게 되었고, 또한 GPL의 JDK버전을 출시도 했습니다.

Java SE 6에서 외부 스크립팅언어를 불러올수 있게 되었고, PHP나 파이썬같은 언어들도 자바에 접목될수 있게 되었습니다.

더이상은 생각이 안나는군요. 4년이라... 참 많은 시간이 흘렀다고 생각하는데, 생각보다 자바 세계에서는 커다란 변경은 없었던것 같습니다.

익명사용자의 이미지

동의합니다.
썬은 너무 상업적인것만 쫓아 이것저것 내놓고 안되면 말고식으로 하지말고 좀더 개발언어란무엇인가를 깊게좀 생각해보고 기본에 충실해야할듯