처음 프밍을 접하는 사람에게 가장 적절한 언어가...

thom의 이미지

파이썬이라고 들었는데 정말 그런지 여러분들의 의견을 듣고 싶습니다.

red10won의 이미지

java가 괜찮아 보입니다.

익명 사용자의 이미지

Fortran77 추천!

neocoin의 이미지

ruby

(,) 를 쓰지 않아도 된다는게 점을 좋아합니다. :)

eyeda99의 이미지

C언어를 추천드립니다.

If A is success in life, then A equals x plus y plus z. Work is x; y is play; and z is keeping your mouth shut.
- Albert Einstein -

drinkme의 이미지

20년 전이라면, Basic이라고 말씀드렸을텐데요...

haze11의 이미지

생각없이 쉬운 프로그래밍 언어를 배우는 것도 좋겠지만..
프로그래밍 언어를 배워서 무엇을 하고싶은지에 따라 프로그래밍 언어를 추천해주는 것도 좋을 것 같아요. =.=

thom의 이미지

이런 기능 만드려면 뭐를 배워야 되죠?:

토크온이 재밋지만 금방 방이 텅비어버리기 때문에 계속 방을 고르는 데 신경이 쓰입니다. 그래서 이런 기능이 있었으면 좋겠습니다:

모두 방을 떠나 방에 혼자 남았 있을 경우 (또는 강퇴된 경우) 친추 돼 있는 사람 방으로 저절로 들어가기 (그 방이 꽉 차 있을 땐 다른 친추된 사람이 있는 방으로 간다)

-------------------
一刻千金 (일각천금) : 한 순간이 천금의 가치가 있다

HotPotato의 이미지

그게 http://talkon.nate.com/ 을 말하는 것 같군요. 방금 찾아 봤습니다.
아마도 win32 환경에서만 돌아갈테니 MS Visual C++ 계통이겠네요.

그럼 Visual C++ 쪽으로 알아보세요.

--
본인은 C++ 로 개발한 적이 없기 때문에 이 이상은 말씀 못드립니다.

--
즐 Tux~

kalevala의 이미지

옛날엔 "그래도 C는 배우고 시작해야지"라고 생각했는데, 이제는 첫 언어로 python을

선택하는것도 좋아보입니다.

jaurang2908의 이미지

Ruby나 Python 같은 스크립트 언어만 빼고 컴파일 언어로 시작하면 됩니다..

preisner의 이미지

이유가 뭘까요?
전 스크립트 언어로 쉽게 시작하는 것이 계념을 익히기 좋아 보입니다만.

unipro의 이미지

lisp 구루들이 울고 가겠군요. :-)

내 블로그: http://unipro.tistory.com

oppor의 이미지

몇달 전만 해도 이런글에 파이썬이 주류를 이뤘을것 같은데
지금은 전혀 딴판이네요.

뭐가 바뀐걸까요...

preisner의 이미지

똑같은 대답 일일히 달기 귀찮아서요..

hongminhee의 이미지

KLDP 오는 사람들이 바뀐 것 같습니다.

empty2fill의 이미지


무엇보다 '프로그래밍' 그 자체에 재미를 느끼고 흥미를 가질 수 있도록 해줘야 하지 않을까요?

그 뒤에는 스스로 필요한 언어를 선택할 수 있게 해주세요. (C가 되었든 Java가 되었든)

Ruby나 Python 같은 인터프리터 언어를 추천합니다. 배우기도 쉽고 나름 주류(?) 이기도 해서, 인터넷에서 도움을 얻기도 편하고요.

인터랙티프 쉘을 이용하면 코딩하면서 일어나는 실수나 실패, 에러에 대해서 겁을 먹지 않아도 되고요.
(프로그램이 '끽~' 하고 죽지 않으니까요. 인터랙티프 쉘이 살아있어서 문제가 생긴 부문만 고치면 되죠.)

——
———
Life is a tragedy when seen in close-up, but a comedy in long-shot. - Chaplin, Charlie -

kalevala의 이미지

주변엔 GUI framework 도 업신 여기는 사람이 있습니다.

노가다 아니냐... 왜 그런걸 배우는데 방학을 낭비하느냐...

C++만 줄창 코딩해와서 간단한 script 도 못 짜는 탓에 데이터를

Excel에 수동으로 붙이는 사람도 있구요.

처음으로 접한 언어가 얼마나 흥미를 가져다줄 건지를 생각해보면

해결하고자 하는 문제의 복잡도에 관계없이 시각적, 결과적인

것에 치중된 것도 나쁠 것 없습니다. little endian이네, ieee-754가 어떠하네

를 모르더라도 숫자들을 잘 다룰 수 있지 않나요 :)

jaurang2908의 이미지

그러믄 대체 컴터 속에서 머가 어떻게 돌아가는지 모르게됩니다.

왜 메모리 관리가 필요한지..

c++한담에 script 이해하는거야 쉽지만

그 반대는 어렵죠.

파이썬하다가 c++ 에 적응하는 사람은 못봤습니다. 그 반대는 금방해도

purple의 이미지

*금방*이면 고급 언어들의 막강한 기능을 제대로 쓰지도 못하고 어떻게든 저수준으로만 다룰려고 하죠.

ahsan의 이미지

하루이틀 할 일이 아니라면 기초는 정말 중요합니다.
처음부터 감각적인 루비나 파이선으로 시작하면 c,c++에 아무도 관심을 가지려하지 않을 것입니다.

처음 시작하는 사람들은 C로 기초를 확실히 잡아서
C++
Java
C#으로 넘어가서 최종적으로 루비나 파이선으로 가야되지 않을까 생각됩니다.

Java는 안하더라도 C, C++은 해 봐야 한다고 봅니다.

ekxkaks의 이미지

java 로 밥먹고사는사람입니다.

C# 으로 넘거 갈 필요가 있는지 모르겠지만.. c#으로 넘어가기 쉽나염 ??

unipro의 이미지

인터프리터 언어는 문제해결에 좀 더 몰입하게 합니다. 즉, 메모리 관리, 스트링 처리, 변수 타입 관리 등 프로그래밍 언어 자체나 시스템 영역에서 벗어나서 좀 더 생산적으로 문제를 해결하기 위한 알고리즘에 집중할 수 있습니다.

목적과 수단을 구분하여, 수단에 불과한 프로그래밍 언어 자체에 매몰되지 않기를 바랍니다. 상대적으로 진입 장벽이 쉽고 프로그래밍 자체를 즐길 수 있는 인터프리터 언어로 시작하시고, 부족한 부분을 다른 방법(예를 들어, 속도가 중요한 부분은 컴파일 언어를 사용하여 대체하는 것)으로 채워나가길 바랍니다.

이런 방법이 좋은지 확신은 없습니다. 저 같은 경우는, 제가 말한 것과 반대로, C/C++ 을 15년간 다루다가 최근에서야 인터프리터 언어의 매력에 빠졌기 때문입니다. 하지만 SICP와 같은 책이 좋다고 말하는 것을 보면 위에 얘기가 틀리지만은 않은 것 같습니다.

내 블로그: http://unipro.tistory.com

doodoori2의 이미지

으하하 어셈으로 시작하는 겁니다!

OS 30일 완성이란 책에서는

책 저자가 binary 편집기의 위대함을 보여주겠다!! 라면서

FF C0 어쩌고 저쩌고 일단 따라 쳐봐 !! 라고 하지요.

그렇게 binary 편집기로 OS도 만듭니다.

ubtaptt의 이미지

카와이 히데미씨가 쓴 "OS 구조와 원리 (OS개발 30일 프로젝트)" 말하시는 건가요?

jos77의 이미지

C# 최고입니다

-----
안녕하세요 소프트웨어 공학센터 장원석 책임입니다.
http://www.software.kr

loias의 이미지

C로 아주 기본적인 메모리를 다루는 개념을 배우고,
그냥 파이썬으로 가는걸 추천합니다.

모든것이 다 C/C++로 가능하다고는 하지만, 같은일을 하더라도 시간이 너무 아까와요,
요즘 누가 링크드리스트짜는 직접 짜는 사람이 어디있습니까.. STL같은거 쓰지,
타입 맞추고, 그런거 따지기 보다는 인터프리터로 그냥 훅훅 넘어가는게 훨 생산성이 높다고 봅니다.

학습곡선도 빠르고요,

그렇지만, C는 필수라고 봅니다. 메모리를 직접다루는 언어는 사실 많지 않거든요.
(메모리 관리하는 일은 요즘은 사실 크게 필요는 없습니다.)

그래도 메모리를 직접 관리 해봐야 그때서야 파이썬이나,
기타등등 언어들이 굴러가는가는게 쉽게 이해가 되면서 느낌이 확 오실겁니다.

kyagrd의 이미지

제곧내

--
There's nothing so practical as a good theory. - Kurt Lewin
"하스켈로 배우는 프로그래밍" http://pl.pusan.ac.kr/~haskell/

thom의 이미지

하스켈만 배우면 그걸 사용해 무슨 대박 프로그램을 만들어서 돈을 벌거나 회사에 취직할 수 있나요?

-------------------
一刻千金 (일각천금) : 한 순간이 천금의 가치가 있다

ishtori의 이미지

파이썬부터 공부를 한 학생입니다만 아직은 C를 공부하는 게 더 낫지 않나 싶습니다.
왜냐하면 초보들을 위한 설명이라던지 책 등등이 아직 C쪽이 더 풍부하기 때문입니다.
뭐 영어 잘 하시면 파이썬쪽도 좋은 자료는 많지만, 저는 좀 막히더군요.
구렁이 담 넘어가듯이라도 좋으니 C 입문서 하나 떼고 파이썬 하시면
(혹은 C 입문서 옆에 두고 참고해가면서 파이썬 하시면)
조금 더 빠르게 프로그래밍에 익숙해지지 않을까 생각해봅니다.

그리고 윈도도 쓰고 계시면 C#도 괜찮을 것 같더라구요. msdn쪽 튜토리얼이 참 잘 되어 있었습니다.

benjamin의 이미지

윈도우 기반에 폼하나 쉽게 띄울 수 있으니 결과물도 빨리빨리 볼수있고 성취감도 생기고 ㅎ

warpdory의 이미지

한글을 먼저 가르치고, 그 다음에 영어, 그리고 그 다음에 ...

특히 90년대 후반 학번 이후부터는 책 대신 모니터를 봐서 그런 건지, 글을 길게 안 쓰고 댓글만 달아서 그런 건지는 모르겠지만, 맞춤법도 틀리는 게 많고, 글이 몇줄 넘어가면 제대로 이해를 못하는 경우가 많아서 한글부터 다시 가르치고 싶을 때가 많습니다.


---------
귓가에 햇살을 받으며 석양까지 행복한 여행을...
웃으며 떠나갔던 것처럼 미소를 띠고 돌아와 마침내 평안하기를...
- 엘프의 인사, 드래곤 라자, 이영도

즐겁게 놀아보자.

kaeri17의 이미지

그러면 90년대 태어난 사람들은 어떡하나요... ㅠㅠ 사실 제가 생각해도 책을 참 안보긴 합니다만...

thom의 이미지

안타까운 현상이군요. 근데 한글이 아니라 국어 아닙니까. 아니면 한글로 쓰여진 글을 한글이라고도 합니까.

-------------------
一刻千金 (일각천금) : 한 순간이 천금의 가치가 있다

Scarecrow의 이미지

C/C++같은 언어를 하기 위해 다뤄야 하는 메모리 관리나 기타 하드웨어 종속적인 것들을 익힐 시간에
Python같은 언어로 알고리즘 문제를 잔뜩 풀어보고 익히는게 오히려 더 기초라고 봅니다.

멍청하게 짜여진 C 소스코드보다 똑똑하게 짜여진 Python 소스코드가 훨씬 더 빠르니까요.
프로그래밍의 기초는 하드웨어가 아니라 소프트웨어가 아닐지...

fm100의 이미지

사람마다 생각도 다르고 의견도 다릅니다만, 저는 개인적으로 처음 시작할 때 추천하는 언어라기 보다는, 처음 시작할 때 C/C++을 비추합니다.
컴퓨터 내부 동작의 이해와 기타등등은, 천천히 배워나가면 되고, 시작을 C/C++로 하지 않아도 얼마든지 할 수 있는거라고 봅니다.
지금은 말 그대로 '처음 시작할 때 배울 언어'를 얘기하는거니까요.

무엇이든 첫 습관이 정말 중요하다고 봅니다. 모든 사람이 그렇지는 않지만, 주변 친구들을 대상으로 스터디/교육 등을 여러차례 시도해본 결과 C/C++로 학습을 시작할 경우 위에 어떤 분 말씀대로 사고가 매우 저수준화 됩니다. 그러나 고수준의 사고를 기반으로 나중에 C/C++을 배우면 포인터와 메모리관리라는 개념에 진입장벽을 만나기는 합니다만, 나름 금방 적응하고 코딩하더군요.

그런데 C/C++로 시작하는 경우에는, 프로그래밍이란 것에 전혀 익숙함이 없는 상태에서 syntax의 장벽이 너무 높습니다.
구지 따지자면 C/C++이 딱히 어려운건 아닌데, 처음 하기에는 일일이 해줘야될 잡다한게 좀 많습니다. 그래서 해결해야 할 문제 자체보다 그 외의 것에 신경이 분산되는 경우가 많더군요.

뭐 단순하게 예를들면, "단순하게 이러이러하면 이렇고 어느 조건에서 몇번 반복하고" 라고 단순하게 생각할 수 있는것도, synxtax에 묶여 "if로 이렇게 검사하고 for를 써야되고" 하는 식으로 사고가 경직되는걸 많이 봤습니다.

저는 이것을 "사고과정이 지나치게 도구 의존적인 것" 정도로 생각합니다.

결론은, 시작은 python이든 ruby든 최대한 간단한 언어로 시작하는게 좋다고 생각합니다. C/C++은 지나치게 복잡합니다. 그런면에서 본다면 자바도 C/C++보단 간단하지만 python, ruby에 비할바는 아니네요. 언어 자체로만 보면 smalltalk도 추천할만 하지만 참고자료가 너무 없으므로 패스.
개인적으로는 lisp도 매우 좋고 볼만한 책/문서도 많은 것 같지만, 프로그래밍을 처음 시작하는 사람들이 postfix 연산에 적응할 지는 의문입니다.

=================================================
Do the python !
=================================================

gh0st의 이미지

fm100님의 글에 추천 드립니다!
c/c++나 루비/파이썬이나 문법부터 좀 배우고 로직을 짜야겠지만
c/c++는 문법의 비중이 메모리 등 하드웨어 개념까지 포함이 되기에 로직에 집중할 수 있는 시간이 짧다고 생각합니다.
특히 한 학기나 일년 동안 '언어'가 아닌 '프로그래밍'을 가르치려면 더욱 그렇습니다.
그리고 파이썬보다 루비를 추천합니다.

네트워크의 미래는...

jyunet의 이미지

로직만 알면... 어떤 언어든.. 문법만 배우면 다 짜 냅니다..
로직과 업무가 중요한거죠..

익명 사용자의 이미지

질문자 님께서 어떤 말을 들으셔야 할지 결정못하겠네요. 한 프로그래머가 모든 언어를 마스터해서 어떤것이 제일좋고 나쁘다라고 결론내기가 쉽지 않을겁니다. 각자 경험해본 언어와 자기 스타일에 좀더 맞는 언어가 한번더 눈길이 가겠죠... 어떤 언어가 더 나은걸까라는 토론은 쉽게 결론이 도출되지 않을겁니다.

대신 요즘은 모든 기술이 어울어져 새로운 것을 만들어내다 보니, 한가지만 알아서는 경쟁력이 떨어집니다. 하나를 잘하더라도 다른 분야에 대해서 이해하고 있어야 더 좋은 프로그래머가 될수 있다고 생각합니다. 적어도 두 세가지 언어는 다루셔야 할 겁니다.

어느것을 먼저 하라고는 제가 아직 내공이 부족해서 말씀못드리는 것 죄송합니다. 다만 하나 하나 해나가다보면 다른 언어에 대한 이해력이 빨라집니다. 지금 답변 다는 고수분들도 다 이런 과정을 겪으셨을거라 믿습니다.

그리고 추가로 말씀드리고 싶은건 프로그램 언어도 중요하지만 영어공부도 프로그램 언어만큼 많이 공부하시기 바랍니다.

새로운 패러다임과 새로운 기술들을 담은 많은 문서들이 영어로 되어 있고 국제 사회에서 공통적으로 사용되고 있습니다.

영어를 전혀 모르는 상태에서 한국어로 번역된 문서만 보며 이 직업을 계속할 수도 있지만, 영어를 익혀서 남들보다 많은 자료를

활용할 수 있으면 많은 도움이 되실겁니다.

익명 사용자의 이미지

한계를 가진 언어부터 시작해서 보다 발전된 언어로 가는게 맞다고 생각합니다.
처음부터 너무 좋은 언어를 사용한다면 편할지는 몰라도
프로그래머로서 자각해야할 많은 부분에 대해서 둔감해 질수 있다고 봅니다.
프로그래밍 언어라는건 부족한 부분이 있으면 발전하거나 그게 지지부진하거나 혹은 전혀 다르게 시작하고 싶을 경우 새로운 어어가 등장하니깐
특정 언어에만 집착하는 건 답은 아니겠지요
그리고 생각 있는 프로그래머라면 고집 같은 건 필요 없다고 생각 합니다.
제 생각엔
"난 이런 정도까지 지우너하지 않는 언어부터는 배우고 싶자 않아. 그러니깐 이 언어부터 시작해야지." 라고 생각하고
스스로 결정해서 시작하면 된다고 생각합니다.
그 이후 필요하다면 그 이전의 언어로 거슬러 올라갈 수도 있지요.
C,C++,Java,C#,Ruby,Python,Lisp,Haskell,F#,Erlang,Object-C,Caml 등등 열거하자면 너무 많잔아요.
프로그래머에게 중요한건 언어가 아니고 철학입니다.
철학이 없으면 편협해지기 쉽지요.
시작점의 언어가 무엇인가 보다는 자기 자신이 어떤 사람이 되고 싶은지가 중요하지요.

익명 사용자의 이미지


이런 글의 의견은 대충 두 갈래로 나뉘네요.

"(컴퓨터에 대한 지식의)기초가 중요하다 C++ "
"(프로그래밍 언어는 도구일 뿐) 프로그래밍에 대한 적응력을 높이는게 중요하다. python "

시스템을 공부하는 한 사람으로서, C언어를 통해 시스템을 배운다는 생각은...

"검을 만드는 대장장이 기술을 배움으로서 검술을 향상시키겠다. "
"벽돌 만드는 기술을 배움으로서 벽 쌓기를 잘하겠다. "
"마우스 만드는 기술을 배움으로서 스타크래프트 프로게이머가 되겠다. "

라고 들립니다.

역시나 진부한 얘기기 때문에 길게 쓰지 않겠습니다. 이 점엔 모두 공감하실듯

alfalf의 이미지

"대장장이 기술을 배움으로서 구조적으로 취약한 검의 특정 부분을 알게되어 검술 연마시 그 부분을 사용하지 않을 수 있었다."
"벽돌 만드는 기술을 배움으로서 벽의 종류별로 가장 튼튼한 벽돌을 찾아 쓸 수 있게 되었다."

C언어에 대한 지식이 있다면 문자열을 붙여 출력하는 다음의 두 code 중 어떤 것이 더 효율적인 Python code인지 알아 내는 것은 매우 쉽습니다.

l = []
for x in ("A", "B", "C", ...):
    l.append(x)
print "".join(l)

s = ""
for x in ("A", "B", "C", ...):
    s += x
print s

C언어에 대한 학습은 어떤 언어를 사용하던지 어느정도 필요하다 생각합니다.

neocoin의 이미지

그건 alfalf 님께서 C언어의 지식이 있기 때문에 쉬운 것이라 생각합니다.
해당 코드는 다른 언어에서 mutable, immutable 문자열의 상식들만 알고 있어도 별 차이는 없습니다.

차이는 다른 언어들은 처음 문자열 사용하는 방법에 집중하지만, C는 문자열 할당 부터 가르쳐야하니
기억에 강하게 남는거 같네요.

sungeuns의 이미지

로우레벨 할꺼면 -> C
하이레벨 할꺼면 -> 스크립트어

물론, C는 가장 기본이라 할 수 있기때문에 로우 하이 상관없이 익히는 게 나쁘지 않겠지만, 딱히 로우레벨 할 필요없으면 그냥 파이썬으로 재미 붙이는 것도 나쁘지 않을 것 같네요~

근데 뭘 먼저 하든간에 C는 익히는게 좋음~

정상인의 이미지

C언어는 비추합니다.. 해도 최소한 C++이상으로 시작하셔야 한다고 봅니다.
아직도 예전에 C언어 만지던 습관 때문에 개인적인 일을 할 때엔 자꾸 객체지향적인 코딩이 아닌 구조적 코딩을 하게 됩니다. 유지보수할때 죽어나죠.
그렇게 처음 쓰던 개발방식에 사고 패턴이 맞추어지는 거 같습니다. 좋은 개발습관을 가지려면 여러 개발 방식이 가능한 요즘 언어로 시작할 필요가 있다고 봅니다.

익명 사용자의 이미지

객체지향 개념을 넣을수 있더군요.
C++ 에 능통한 C 사부에게서 배우니
어느정도는 저절로 감이 오는것 같습니다.
결국 문제는 C 조차도 제대로 못하는경우
C++ 로 넘어가는것은 또 다른 장벽이 생기는거지요

정상인의 이미지

C++을 하면 C도 할 수 있습니다.
그리고 물론 C언어에서 객체지향적 코딩을 못 하는 건 아니죠. 하지만 객체지향적인 개발을 위해 만들어진 언어가 아니기 때문에 아무래도 객체지향적인 코딩이 불편할 수 밖에 없습니다. 언어를 처음 배울 때 객체지향적 사고를 익히기 위해서는 좋은 선택이 아니라고 생각합니다.
솔직히 개인적으론 아주 C#등의 요즘 언어들을 추천하고 싶습니다. 어짜피 언어를 하나 배운 다음에 거기로 추가로 C언어를 배우는거 깟거 별거 아닙니다. 물론 안 배운 개념이 나오긴 하지만 못받아들일 정도는 아닙니다. 그게 그렇게 어려웠다면 예전에 BASIC배우고 나서 C언어 배우던 건 말도 안되는 짓이었겠지요.
한번 머리에 박혀버린 코딩 스타일을 바꾸는 건 훨씬 고된 일이라고 생각하고 있습니다. 바꾸려고 해도 계속 습관이 배어나오죠.

quakee의 이미지

파이썬이 쉽나요? 댓글보니 java공부하길 잘했군요. java하세요. 포인터가 없어서 공부하기 쉬워요.

익명 사용자의 이미지

완전 초보이시면 파이썬이나 루비 공부하세요.

익명 사용자의 이미지

자바에 포인터가 없다는 무식한 소리는 한 십년만에 첨 들어보네.

말도 안되는 소문 흘리고 다니지 말고, 책 보고 공부나 똑바로 해요.

퀘이크의 이미지

지금 1000페이지 짜리 책을 보는데 포인터에 관한 말은 한 마디도 없구만. 그럼 저자가 바보인가 보죠 뭐...

익명 사용자의 이미지

C에서 볼 수 있는 주소 관련 *, & 연산자는 없는데...
Java 도 참조를 합니다.

class ABC
{....}

ABC obj1 = new ABC();
ABC obj2;
obj2 = obj1;

ojb1 의 객체가 obj2 에 복사가 되는 것이 아니라,
obj2 는 obj1 를 가리킵니다. 포인터 개념입니다.

참고 http://kldp.org/node/70013

익명 사용자의 이미지

자바가 call by reference가 있던가요?
자바는 모두 call by value 개념입니다.
주소값을 참조하는 참조변수들을 복사해서 가리키는것이지
포인터처럼 메모리를 직접 제어 및 접근하지 않습니다.
고로 자바에는 포인터가 없다는 말이 맞습니다.
해시코드가 포인터개념이지 우리는 해시코드를 생성하는 JVM을
배우는게 아니라 자바를 배우는거니깐요.

semmal의 이미지

반박할 말은 많지만 여기서 거론할 일은 아니고,

자바에서 왜 NullPointerException이 뜨는지만 생각해보면 될 것 같습니다.

자바는 그냥 조금 더 안전한 포인터를 쓰고 있을 뿐입니다.

------------------------------
How many legs does a dog have?

익명 사용자의 이미지

위에님 그말은요...
야구를 하고 있는 사람이 축구를 하는 사람에게 묻습니다.
넌 우리처럼 손으로 던져서 글러브에 넣으면되지 왜 굳이 발로 공을 골대에 차서 넣니?
축구하는 사람이 대답하길 '나는 조금 더 안전한 방법으로 공을 넣는거야,
그러니 축구에서의 골과 야구에서의 골인은 같아' 이말과 유사합니다.
둘 다 공놀이고 둘 다 골을 넣는 목적은 같으니깐요.
하지만 우리는 야구의 투수와 축구의 스트라이커가 같다고 하지는 않습니다.
추구하는 목적만 같을뿐 엄연히 다른존재입니다.
그런 개념에서 접근하면 포인터라는 개념이 애초에 C에서 탄생되었고 많은사람들이
자바에서도 포인터가 있니 없니 다투는 것 역시 C에서 보고 배운 포인터의 특성들을 가지고 비교들을 합니다.
그 C 포인터의 특성을 자바 역시 가질 수 밖에는 없지요. 당연한겁니다. 어차피 자바가상머신 자체가 C로 만들어졌고
직접 메모리에서 해시코드를 받아서 변수에 부여하고 주소로의 접근을 허용하니깐요.
하지만 생각해봅시다. 우리가 여기서 말하는 '자바를 한다.' '자바로 일을 한다'
'자바로 코딩을한다' 할때 우리가 JVM의 해시코드를 C코드로 분석하고 들여다보진 않습니다.
다 참조변수를 복사해서(당연하겠지만 새로운 메모리값을 부여받습니다. 좀 더 정확히 말씀드리면 해시값)
서로를 연결하죠. 컬렉션 프레임워크(DS)쪽으로 가도 마찬가지 개념으로 이해해야합니다.
즉 일반적으로 말하고 사용하는 JAVA에서는 포인터란 개념은 존재하지 않는다는 표현이 옳습니다.
C포인터의 특징인 콜바이레퍼런스랑 메모리의 직접 제어 및 접근이, 통상적으로 말하는 자바에서는
JVM에 의해서 하이딩된다는 얘기죠. 그걸 가지고 JAVA에는 포인터가 있다라고 정의내린다면
뭐 그럴수도 있겠네요. 황인종이나 백인종이나 사람은 사람인듯이요.
쉽게 정리하죠. 자바 포인터의 유무를 묻는 대다수의 질문들의 골자는 포인터 특성을 놓고 비교합니다.
황인종도 특성이 있고 백인종도 특성이 있다.를 비교하는게 아니라요.
황인종의 노란 살색 특성이 백인종의 살색에도 있느냐. 이걸 묻는겁니다.
결국 이 답변에는 백인종에는 없다라고 말하는것이 옳게 되는거구요.
저는 그런 의미에서 자바에는 포인터가 없다고 말씀드린겁니다.
논란의 여지가 종식되었으면 하는 바입니다.

semmal의 이미지

정정하자면, C는 call by reference가 아니고 call by value만 씁니다.

또, 자바에서 스스로 NullPointer로 뭔가를 하면 안된다고 비명을 질러도, 레퍼런스라고 말씀하는군요.
자바 개발자들이 무려 포인터와 레퍼런스를 구별못해서 NullReferenceException이라고 안하고 NullPointerException이라고 했을까요?
당연하게도 레퍼런스에는 Null Reference라는게 있을 수 없거든요.
애초에 자바의 레퍼런스는 레퍼런스처럼 동작하기는 하지만 결코 레퍼런스가 될 수 없으며, 그냥 포인터로 보는게 정확합니다.

C의 포인터가 레퍼런스처럼 쓸 수 있지만, 그냥 포인터라고 부르듯이 말입니다.

------------------------------
How many legs does a dog have?

익명 사용자의 이미지

JAVA에서 널포인트에러가 나는건 compiler가 코드를 JVM에 넘겨주는 과정에서 변수값이 없거나 참조값이 잘못된 경우에 나는겁니다.
그걸 가지고 JAVA에 C개념의 메모리 접근 및 직접제어 특성의 포인터가 있니 없니를 판가름하시다니;;
그리고 C가 value 만 쓴다는건 어느분 생각이신가요? C by Dessection의 저자 Kelly씨가 울고 가겠군영.
call by reference와 call by value 개념부터 제대로 된 책으로 한번 다시 보시는게 어떨런지;; 모르는건 부끄러운게 아닙니다.
확실치 않은 지식을 자존심 세운답시고 사실인양 전파하는게 부끄러운거죠.
NullPointer란 단어가 존재하므로 JVM이 아닌 JAVA에 C포인터의 특성이 존재한다는 거랑 C에는 call by value만 쓴다는 부분,
말씀하신 부분들 출처좀 알려주세요. 자신의 머리속에서 나오신건지 아니면 어떤 책의 저자께서 그렇게 말을 한건지 대단히 궁금합니다.

semmal의 이미지

참 이상한 지식을 가지고 옳다고 하는군요.

레퍼런스인데 변수값이 없거나 참조값이 잘못될 수가 있는겁니까?
C에는 value만 넘어간다는 건 C를 제대로 배운 사람이라면 누구나 아는 상식아닌가요?
인자를 integer를 넘기면 값이고, pointer로 넘기면 레퍼런스인가요?
integer로 넘긴다음 pointer로 캐스팅해서 사용하면 그건 value인가요? reference인가요? 그 호출은 call by value인가요? call by reference인가요?
본글과 상관없는 주제로 당연한걸 책 일일이 찾으면서 대응하기는 귀찮고,

http://en.wikipedia.org/wiki/Evaluation_strategy

The description "call-by-value where the value is a reference" is common (but should not be understood as being call-by-reference); another term is call-by-sharing. Thus the behaviour of call-by-value Java or Visual Basic and call-by-value C or Pascal are significantly different: in C or Pascal, calling a function with a large structure as an argument will cause the entire structure to be copied, potentially causing serious performance degradation, and mutations to the structure are invisible to the caller. However, in Java or Visual Basic only the reference to the structure is copied, which is fast, and mutations to the structure are visible to the caller.

Even among languages that don't exactly support call-by-reference, many, including C and ML, support explicit references (objects that refer to other objects), such as pointers (objects representing the memory addresses of other objects), and these can be used to effect or simulate call-by-reference (but with the complication that a function's caller must explicitly generate the reference to supply as an argument).

Also known as "call by object" or "call by object-sharing" is an evaluation strategy first named by Barbara Liskov et al. for the language CLU in 1974[1]. It is used by languages such as Python[2], Iota, Java (for object references)[3], Ruby, Scheme, OCaml, AppleScript, and many other languages. However, the term "call by sharing" is not in common use; the terminology is inconsistent across different sources. For example, in the Java community, they say that Java is pass-by-value, whereas in the Ruby community, they say that Ruby is pass-by-reference[citation needed], even though the two languages exhibit the same semantics. Call-by-sharing implies that values in the language are based on objects rather than primitive types.

제가 가져온 부분만 읽지 말고 처음부터 그냥 꼼꼼히 한번 읽어보시구요. 포인터가 왜 value인지는 곰곰히 고민해보세요.
중의적으로 레퍼런스다 값이다 하는 말에 휩쓸려서 단어 그대로 책을 그대로 이해하는건 좋은 글읽는 방법이 아닙니다.

시간은 금이라고 누가 말했다고 정말 시간을 금이라고 부르면 곤란한겁니다.

자바에서 사용하는 NullPointerException이라는 이름을 JVM에 떠넘기는 말쏨씨가 예술입니다. 자바가 JVM안쓰고 G-Machine이나 WAM을 쓴다고 하더라도,
자바의 정의때문에 무조건 특정상황에서 NullPointerException은 떠야 합니다.

확실치 않은 지식을 자존심 세운답시고 사실인양 전파하는게 부끄러운거죠. => 이 말은 말 그대로 돌려드리지요.

------------------------------
How many legs does a dog have?

익명 사용자의 이미지

C에 call by reference가 왜 없나요?
C는 call by value를 이용해서 call by reference를 흉내낼뿐,
완벽하다고 할수는 없지만 분명 call by value와 call by reference는 C언어에 공존하고 계산되어집니다.
엄밀히 말하면 C에는 pass by reference가 없는거지요.

출처 : http://c-faq.com/ptrs/passbyref.html

semmal의 이미지

simulate는 없는 것을 있는 것처럼 만들때 사용합니다.
실제로 도로를 달리지 못하는 자동차를 "마치" 도로를 달리는 자동차처럼 달리도록 하면, 자동차 시뮬레이터라고 부릅니다.
reference가 존재하는데, 굳이 value를 써서 simulate할 이유가 없지요.
출처에 기입하신 내용은 제 출처에도 정확히 들어가 있는 내용입니다.

또 혹시나해서 덧붙이지만, reference의 구현을 pointer로 한다는 것과, pointer를 써서 reference처럼 쓴다는 것은 완전히 다릅니다.

------------------------------
How many legs does a dog have?

익명 사용자의 이미지

C에서 콜바이벨류와 콜바이레퍼런스의 탄생배경을 생각해보시면 이해가 갈거같습니다.
애초에 C가 태어났을때 콜바이벨류만 존재했고 데이터를 핸들링했습니다.
근데 메모리의 직간접적 접근제어의 필요성에 의해서 콜바이레퍼런스란
개념이 필요하였고 그래서 벨류를 통해 레퍼런스를 구현한겁니다.
레퍼런스를 만들수있는데 못만들어서 벨류로 만든게 아니라
원래 벨류를 통해서 레퍼런스를 만드는거라고 이해하시면 됩니다.
이렇게 생각은 안해보셨습니까? 완벽한 콜바이레퍼런스가 존재합니까?
이미 개념이 정립이 되었으니 어떤 언어에서는 그렇게 모델링되었을수도 있겠지만
어쨌든 자동차가 뚝딱하고 아무것도 없는 것에서 탄생한게 아니라
바퀴 달리고 움직이는 수동 마차에서 현재의 오토 자동차로 파생된거처럼,
우리는 누구도 간단한 마차랑 복잡한 자동차를 같다고 하지 않죠.
전제하고 말씀하시는 경향이 강하신데 본인이 틀린걸수도 있다는 생각을 잘 안하시는거 같습니다.

JuEUS-U의 이미지

이 문제는 transparency라는 단어로 끝나게 된답니다 ㅡ,ㅡ
C언어는 call by value지만, call by reference를 구현하는게 가능합니다. (non-transparent)
자바에서는 transparent하게 call by reference를 사용할 수 있죠.
기준에 따라서 없다고도 있다고도 할 수 있습니다 ㅡㅡ;;;

semmal의 이미지

잠깐 이상한데,
자바든 C든 call by value입니다만...
단지, 오브젝트를 다룰때 C는 pointer를 통해 부르고, 자바는 reference를 통해 부를 뿐이지.
(이 두 가지가 근본적으로 무엇이 다른지는, 개인적으로 여전히 잘 모르겠습니다만)
둘 다 call by value라는 점은 제가 올린 swap 예제에서 알 수 있는 것 아닌가요?

------------------------------
How many legs does a dog have?

익명 사용자의 이미지

포인터가 있다없다 ? 쓸모없는 논쟁같아요 .

일단, 변수가 뭔가를 참조한다는걸 포인터라고 정의한다면 있다고 할 수 있죠 .

인스턴스변수가 바로 참조하는 변수니까요 .

하지만 C처럼 메모리 연산을하고 메모리를 자유자제로 다루는 특성을 포인터라고 본다면, 자바엔 없다가 맞습니다.

C는 포인터 변수를 선언해 메모리 조작이 가능하지만, 자바는 그게 허용되지 않아요 .

전 포인터 변수 그 자체보다 특성을 우선시 하기때문에 자바에 포인터가 없다고 말하는 사람입니다 .

포인터가 있건 없건, 자바에선 신경 쓸 필요가 없는데 굳이 왜 따질까요 ..

메모리 연산을 하는 것도 아니고 ..

안전한 포인터를 사용한다는 말도 넓게보면 틀린말은 아닙니다.

메모리 참조를 하긴 하되 , 메모리연산이나 조작을 못하도록 하는 것이니까요 .

어떤 기준으로 판단하냐에 따라 달라지니까요 .

그러나 일반적으로 따졌을때는 자바에는 포인터가 없다고 보는 개념이 중론입니다.

NullPointerException .. 보통 참조하는 걸 포인터라고 보기때문에 예외처리 클래스명을 이렇게 만들었지 않나 싶습니다.

String str = new String("String");

이렇게 인스턴스를 생성하면 str 변수가 메모리에 생성되고 String이라는 문자열이 메모리에 생성됩니다. 그리고 문자열 "String"의 메모리 주소를 JVM이 맵핑한뒤 str변수에 맵핑된 값을 넣게 됩니다.

str -> "String" 의 형태가 되는거지요 . str이 "String" 이라는 문자열을 가리키게 되는겁니다.

C의
char* str = "String";

문법과 비슷하다고 볼 수 있지요 .
하지만 C의경우

str+1 , str+2 이런식으로 메모리 이동이 가능한 반면 자바는 불가능 합니다.

반쪽짜리 포인터라면 포인터고 , 자바에서 포인터 개념을 중요시 하지는 않기때문에 포인터가 없다고 말하는 사람도 많은 것 입니다.

익명 사용자의 이미지

끝없는 논쟁거리지만 이 글이 젤 정답에 가깝네요.

semmal의 이미지

무엇이 포인터냐에 대한 논쟁은 kldp에 오래전부터 있었습니다.
역시 찾아보시면 될 일이고,

http://en.wikipedia.org/wiki/Pointer_%28computing%29

In computer science, a pointer is a programming language data type whose value refers directly to (or "points to") another value stored elsewhere in the computer memory using its address.

먼저 C의 포인터만이 "진짜 포인터"는 아닙니다. 포인터를 쓰는 언어는 상당히 많습니다.
포인터는 주소를 사용해서 컴퓨터 메모리를 가리키는 데이터를 말합니다.
주소 연산 같은 거 상관없이 말입니다.

그리고 포인터는 결국 value 이며 결코 reference가 될 수 없습니다.

------------------------------
How many legs does a dog have?

익명 사용자의 이미지

부부싸움이네요. 내가 생각하는 포인터 vs 니가 생각하는 포인터
뒤에 글자만 가지고 싸우는 거나 마찬가지입니다. 포인터로 글 올라온 거보면 다 옳은 말입니다.
어디까지 포인터로 볼것이냐에 대한 서로의 관점의 차이로 인해서 배틀이되고있네요.
일반적으로는 자바는 포인터가 없다고 하죠. 이거는 메모리 직접 연산하고 제어하는 C포인터를 말하는거죠.
위에 님이 말하는 포인터는 그냥 가리키는 개념의 포인터. 이것이 포인터라면 자바도 온통 천지에 다 포인터입니다.
둘 중 어떤 개념이 좀 더 포괄적이고 정석적으로 자바에 쓰이고 있는지는 여러 다른분들의 판단에 맡기겠습니다.

semmal의 이미지

이제는 협상과 정치인가요?

익숙하기는 하지만 재밌는 반응입니다.

겪을때마다 신선합니다.

------------------------------
How many legs does a dog have?

익명 사용자의 이미지

지켜보던 사람으로써 참 재밌군요. 5~6년전 쯤에 semmal 님 본인 역시 잘못된 지식으로
빡빡우기시다가 댓글로 창피를 당하셨던거 기억합니다만.....개구리 올챙이적 생각 못한다지요.

semmal의 이미지

빡빡 우겼다가 잘못 인정하고 배웠지 않습니까?

5~6년전 잘못했으니 잘못된 내용을 그냥 지켜볼까요?

참 이상한 반응이네요.

포인터 논쟁으로는 못까겠으니 이제는 사람을 까겠다는겁니까?

맘껏 까세요.

누구의 인생 수준이 낮아지는지는 계속 해보시면 깨닫게 되실 듯 합니다.

------------------------------
How many legs does a dog have?

semmal의 이미지

빡빡 우겼다가 잘못 인정하고 배웠지 않습니까?
----
5~6년전에 달랑 지식 하나 배우고, 더 중요한 걸 못배웠군요.
얼마전에도 비슷한 일이 있었는데, 그때도 전혀 몰랐던 것을, 그걸 이제야 깨달았네요.
빡빡 우겨서 겨우 하나 또 배웠습니다만,
다음 5~6년 후에 또 나만 맞다고 이렇게 빡빡 우기는 일이 없어야 할텐데요.
저를 상대해주신다고 수고해주신 많은 분들 감사합니다.
모욕적인 말을 듣고도 계속 대화에 응해주신 분들도 감사합니다.
진심으로 사과드립니다.

------------------------------
How many legs does a dog have?

익명 사용자의 이미지

멋있으십니다. 토론은 토론일뿐 맘에 담아두지는 마세요 ^_^
개인적인 감정이 있어서 그런것도 아닌데요 뭘. 저도 다 잊겠습니다.
그럼 즐거운 프로그래밍하면서 다같이 성장합시다!
사람은 이러면서 배우는거 아니겠습니까.

dwlee의 이미지

semmal님이 소개해 주신 위키피디아 문서(http://en.wikipedia.org/wiki/Pointer_%28computing%29)에 아래와 같은 내용이 있습니다.

"One major problem with pointers is that as long as they can be directly manipulated as a number, they can be made to point to unused addresses or to data which is being used for other purposes. Many languages, including most functional programming languages and recent imperative languages like Java, replace pointers with a more opaque type of reference, typically referred to as simply a reference, which can only be used to refer to objects and not manipulated as numbers, preventing this type of error. Array indexing is handled as a special case."

위 단락에서 아래 문장을 발췌해서 보겠습니다.

"Many languages, including most functional programming languages and recent imperative languages like Java, replace pointers with a more opaque type of reference, typically referred to as simply a reference"

Java에서는 포인터를 없애고, 포인터를 한 단계 더 추상화 해서 '레퍼런스'라는 타입으로 포인터를 대체한 것이 아닐까 생각합니다.

외국 애들이 해당 사항에 대해 토론해 놓은 것을 참고해 보는 것도 재미있네요.

http://stackoverflow.com/questions/2629357/does-java-have-pointers
http://www.coderanch.com/t/396747/java/java/Does-java-have-pointers

Stackoverflow 링크의 댓글 중,
Java의 '레퍼런스' 타입은 포인터 라기 보다는 핸들에 가깝다는 의견이 인상 깊네요.

댓글에서 보면 아래와 같은 내용이 있습니다.

"The JVM is at liberty to move objects around within the VM memory, and most likely will do during garbage collection. The references however still point to that object, despite its movement within memory."

포인터는 주로 메모리의 위치를 가리키는 반면,
Java의 레퍼런스는 추상화된 VM 메모리 공간 내의 '객체'를 가리키죠.
(아래 댓글에서, C언어 포인터의 정의는 객체를 가리키는 것이지 메모리주소를 담는 변수가 아니라고 말씀하신 분이 계시지만,
대부분의 C언어 컴파일러 실제 구현은 메모리 위치를 담는 식이므로..)

Java의 레퍼런스 변수가 하나가 특정 객체를 가리키고 있을 때,
프로그래머는 그 객체가 실제 메모리 내 어느 위치에 존재하는 지 알 수 없습니다.
하지만 그 객체는 JVM에 의해서 수시로 메모리 내 다른 위치로 옮겨질 수 있습니다.
(레퍼런스 변수는 여전히 그 객체를 가리키고 있구요.)

저는 포인터의 조작적 정의를 'C언어에서의 포인터 정의'로 하는 것이 좋다고 생각하여,
'Java에는 포인터가 없다' 에 한표를 던집니다.

neocoin의 이미지

스펙 참고하세요. NullPointerException 라고 이름 지어진 이유가 되는 부분입니다.

http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.3.1

The reference values (often just references) are pointers to these objects,
 and a special null reference, which refers to no object.

의미 관점에서 객체를 가리키는 포인터라서 이름 지은겁니다. C의 포인터 같은 메모리 지칭하는 의미로 쓰이지 않았습니다.

그래서 'NullPointerException 이름으로 Java에 포인터가 있다' 할수는 없죠.
그리고 여기 표현에서 null reference 도 언급되는데, 다른 댓글에서 불가능하다는 부분은 아마 다른 관점으로 해석하시지 않았나 싶습니다.

Java Spec 에서 C포인터 같은 존재나 단어는 등장하지 않습니다. primitive type, reference type 이 다입니다.
이렇게 정의된 상황에서 포인터가 있다 없다라는 논의가 가능한건지 저는 의문입니다.

즉, Java Spec에 포인터와 그 정확한 정의가 언급되지 않는 상황에서, 각자의 약간씩 서로 다른 의미의 포인터 정의로 인해서 논의가 계속 평행선을 달릴 것 같습니다.

semmal의 이미지

같은 말이라도 참 다르게 해석하네요.

"(저장장소에 저장된 - 설마 저장안된 객체가 있지는 않을테구요.) 객체를 가리키는 pointer"와, 저장장소에 저장된 데이터를 "주소값으로 가리키는 pointer"가 다르다는 말인가요?
제가 보기에는 내 포인터가 그 포인터 맞다고 긍정하는 것 처럼 보입니다.
제가 결론을 내리고 봐서 그런가요?

다른 쪽을 먼저 찾아보면,
reference는 이미 다른 공간에 존재하는 데이터를 간접적으로 접근하는 주소를 말합니다.
그런 레퍼런스에 null이 있을 수 있나요?
존재하지 않는 데이터를 간접적으로 접근한다구요?

만약에 자바가 정말 레퍼런스를 쓴다면, 빈 오브젝트(라고해도 어쨌든 메모리에 저장되어있는 오브젝트, 존재하지만 단지 비어있다는 것을 뜻하는 오브젝트)를 가리키고 있어야 합니다.
그래야 NullReferenceException을 띄울 수 있겠지요.
빈 오브젝트를 reference를 하지 않고, 직접 pointer를 쓰기때문에, NullPointerException을 띄울 수 밖에요.

------------------------------
How many legs does a dog have?

neocoin의 이미지

제가 저 스펙의 pointers 를 문맥의 의미로 이해한 이유는 Java spec의 카테고리와 형 정의시 pointer 라는 단어를 사용하지 않기 때문입니다.

이글을 보니 더욱 이 쓰레드 전체에서 semmal 님이 의미하시는 포인터의 의미를 어떻게 사용하시는지를 모르겠습니다.
포인터가 의미하는게 무엇인가요?

C에서 이야기하는 메모리 포인터는 아닌거 같은데 어떤 의미로 사용하시며, Java Spec 에서 무엇을 지칭하시는 건가요?

----

http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.7

null literal 을 null reference 로 정의하고 있습니다. 왜 정의한 이들이 reference 로 표현한걸 포인터로 대입시켜야 하는지 잘 모르겠습니다. ;;

semmal의 이미지

C에서 실제기계의 저장공간을 주소값으로 가리키는 pointer와
Java에서 가상기계의 저장공간(그래봐야 실제기계 저장공간에 매핑되겠지만)을 주소값을 가리키는 pointer가 다르게 취급되어야할 이유가 있나요?

자바에는 주소연산자나 포인터연산자는 없습니다.
하지만 포인터는 있지요.

그 마지막 증거를 내보자면,
모든 포인터를 쓰는 프로그램은 널 포인터를 참조하면 딱 한가지 동작을 합니다. 죽어버립니다.
제 경험이 부족해서 그런지 몰라도 그렇지 않는 프로그램은 못봤습니다.
자바에서 NullPointerException나면? 역시 죽어버립니다.

자바가 정말 reference를 쓰는 것이고, NullPointerException이라고 명칭을 붙였더라도 실제로는 빈 오브젝트(반복하지만, 비었다는 의미만 가지고 있을 뿐, 실제로 메모리에 위치하고 있는)를 참조하고 있다고 가정해봅시다.
그럼 실시간으로 빈오브젝트를 참조하려는지 확인이 가능합니다.
그 뒤에 NullPointerException을 발생시키고, 사람들은 이걸 catch 할 수 있어야겠지요.
몇년간 자바 안썼는데, 그새 바뀌었는지는 몰라도 NullPointerException은 catch가 안되는 걸로 압니다만.

NullPointerException이 catch가 된다면 제가 틀렸을 수도 있습니다.
catch가 안된다면, 정확히 C처럼 그냥 물리주소 가리키는 pointer 쓰다가 죽어버리는 것이지요.

----
null literal 을 null reference 로 정의하고 있습니다. 왜 정의한 이들이 reference 로 표현한걸 포인터로 대입시켜야 하는지 잘 모르겠습니다.

>왜냐하면 reference는 null이 있을 수 없기 때문입니다.
reference는 메모리 상에 위치한 데이터를 가리키고 있어야 합니다.
null이 들어가 있는게 아니라, 빈오브젝트를 가리키고 있어야 reference라고 할 수 있으니까요.

------------------------------
How many legs does a dog have?

neocoin의 이미지

예 다르게 취급되어야 한다고 생각해요. Java 가 정의부터 reference가 object를 지칭하는 것으로 정의하였며, C의 메모리 지칭하는 포인터와 다르게 이야기하고 있는데, 그걸 왜 같게 생각해야 하는지 이해하기 어렵습니다.

언어를 비교해서 함께 이야기 하시려면 이런 다른 점에 대해서 용어 정의를 정확히 하시는게 어떨가 싶습니다. 그렇지 않다면 영원히 다른 글에서 처럼 평행선을 갈것 같네요.

----

그리고 논외로..

인용


모든 포인터를 쓰는 프로그램은 널 포인터를 참조하면 딱 한가지 동작을 합니다. 죽어버립니다.

이건 언어의 구현 나름입니다. 예를 들어 Objective C 는 null pointer 에 메세지를 보내면(주1), 아무 동작을 하지 않습니다. delegate 가 일상적인 Objective C에서 이건 매우 편하네요.

그리고 Java 예전 부터 NullPointerExcption 잡을 수 있습니다. 아마 기억하시는 건 다른 상황인거 같네요. (Java 1에서는 안되었나요? 하도 오래전이라 기억이 안납니다.) 아래를 의미하시는게 맞다면요.

class B{
	void say(){System.out.println("hello");}
}
 
public class A {
	public static void main(String[] args) {
		try {
			B b = null;
			b.say();
		} catch (Exception e) {
			System.out.println("catched");
		}
	}
 
}

주1) 여기서 메세지를 보낸다는 표현으로 함수 호출을 이야기한 이유는 Objective C 에서 그렇게 표현되어 있기 때문입니다.

semmal의 이미지

1. Java는 reference를 쓴다. Java에서 쓰는 reference에는 null이 직접 들어간다.
2. 보통 컴퓨터 과학과 공학에서 쓰는 reference는 저장공간에 존재하고 있는 데이터를 가리키는 주소다. 그러므로 null을 가리킬 수 없다.
3. 1과 2에서, Java의 reference와 컴퓨터 과학/공학에서 쓰는 reference는 다르다.
4. 3에서, 컴퓨터 과학/공학에서 쓰는 "call by reference의 reference"와 Java의 reference는 다르다.
5. 컴퓨터 과학/공학에서 pointer는 null이 들어가며, Java의 reference와 정확히 같은 동작을 수행한다.
6. 그러므로 자바에서 뭐라고 부르든, Java는 컴퓨터 과학/공학적으로 보면 pointer를 쓴다.
7. Java는 그러므로 call by value를 쓴다.

이상한 점 있으면 더 이야기해보도록 하죠.

덧)RuntimeException은 안잡아지지 않나요?
이상하네... 일단 확인해보겠습니다.

------------------------------
How many legs does a dog have?

neocoin의 이미지

죄송합니다. semmal 님이 말씀하고 있는걸 조금 더 이해하고 싶어서 의견을 단 것입니다.
제 사과 과정을 이야기 해서 결론 내고 싶지는 않은 심정입니다.
(의견을 듣고 이해하고 조율하는 과정에서 시간이 많이 들어가고, 생업이 있어서요. ;;)

저는 Java의 reference를 call by value로 이해하고 그에 맞추어 사고하고 프로그래밍 해왔습니다.

그런 결론을 얻는 과정에 2~7의 사고 과정을 거치지는 않았습니다. 그리고 위 과정에 100% 는 동의하지 않습니다.

저는 언어를 비교하지 않는 이상 해당 언어가 말하는 용어로 표현한다고 생각하며, 그래서 사고 과정은 상이함은 평행선을 이룰꺼 같습니다.

ps. 파스칼 한지가 하도 오래되서 기억이 안나는데, 언어 차원에서 지원하는 call by reference 는 파스칼 정도 밖에 없었던거 같습니다. 그냥 이렇게 기억하고 있습니다.

semmal의 이미지

일단 neocoin님과 말을 하다 생긴 의문점은,

일단 Objective-C에서 클래스에 들어가는 0은 null이 아니라 nil 오브젝트를 뜻하는 것으로 알고 있는데요.
이게 null 포인터를 쓰는 건지는 정확히 모르겠습니다.
잘 아시는 분 계시면 댓글 달아주시면 감사하겠습니다.
아니면, 언제라도 Objective-C 공부하다가 알게되면 제가 추가하도록 하지요.

또 다른 의문점은, 제가 Java를 쓸 당시에는 NullPointerException이 catch가 안되어서, 늘상 null 검사를 했던 걸로 기억합니다.
거의 무조건 적으로 말이죠.
자바 버전업이 되면서 바뀐건지, 뭔가 다른 테크닉이 들어간건지 알 수 없습니다.
이것 역시 잘 아시는 분 계시면 댓글 달아주시면 감사하겠습니다.
인터넷 찾아봐도 뒤죽박죽이고, 자바는 앞으로 쓸 일이 거의 없을 것 같아서 제가 언제 이 일로 댓글을 달 수 있을지는 모르겠습니다.

그리고 마지막으로 제가 잘못 알고 있었던 것은,
C는 어셈블러 수준에서 null 포인터 참조로 죽어버립니다만, 포인터를 쓰는 언어라도 가상기계상에서 돌아가는 녀석은 그렇지 않은게(그렇지 않게 만들어져있는게) 맞는 듯 합니다.
그러므로 자바도 얼마든지 구현에 따라 null 포인터 참조에 관계없이 살아있을 수 있고, 현재로써는 NullPointerException을 catch할 수 있는 것 같습니다.

단지, 긴 토론의 결과는 NullPointerException이 null을 참조해서 발생하는지, 빈오브젝트를 참조해서 발생하는지만 정확히 따져보면 될 것 같습니다.
하지만, 위 과정에 동의를 안하신다니 뭐라고 더이상 말하기도 힘들겠군요.

------------------------------
How many legs does a dog have?

neocoin의 이미지

Objective c 는 C의 수퍼셋이며, nil 은 null pointer를 의미합니다. 아시다시피 C에서 null pointer 는 키워드 정의된게 없습니다.

제 생각에는 Objective C는 null 이라는 키워드가 구 C 소스에 상수 정의된 가능성 때문에 nil을 키워드로 지정한거 같네요. 그래서 Objective C상에서는 pointer에 대해서 그냥 0 써도 상관없습니다.

----

Java exception 관련

NullPointerException 의 경우 제 경험상에서는 JNI에 걸쳐서 로직이 구성되지 않는 이상 NullPointerException을 잡는다고 죽는 경우는 기억하지 못합니다.(ibm, sun 그랬는데, 충분히 발생할 수 있다고 생각합니다.) 다만, 이를 많이 시도하면 segment fault 나는 경우가 간혹 발생하여 저도 NullPointerException catch를 통한 로직 구현은 피했습니다. (반면에 JDK에 parseInt 같은건 Exception을 이용한 로직 구현처리가 되어 있죠. 처음 봤을때 그 황당함이 기억나네요.) 만약 JVM이 죽는다면 구현체에 의존한 버그였지 Java Lang spec에 부합하지는 않습니다.

그리고 말씀 중에

...그러므로 자바도 얼마든지 구현에 따라 null 포인터 참조에 관계없이 살아있을 수 있고...

이부분을 구현에 따라서 모호하게 넘어가기에는 이건 힘든 부분입니다. parse integer 처럼 Exception을 기반으로한 로직들이 JDK상에 존재할 수 있기 때문이죠. 그래서 Java의 언어 약속상 Exception을 잡으면 프로그램은 잘 살아 있어야 합니다. 구현에 따른다기 보다 그 구현체가 잘못된거겠죠.

-----

저는 semmal 님께서 말씀하시는 과정에서 jvm 이 java language 추상화 계층을 나누지 않고 포인터 이슈를 말씀하는 걸로 이해됩니다. 이러한 접근 법에 대하여 저는 반대하며, 애초 전제가 달라서 의견 일치가 힘드다고 생각합니다. 그래서 이야기는 저도 이만할까 합니다.

그럼 오늘도 즐거운 프로그래밍 되세요.

semmal의 이미지

Objective-C는 그렇게 해석을 하는 군요.

그리고, NullPointerException과 다른 Exception에 관련된 문제는 제 기억이 잘못됐든 제 지식이 잘못됐든, 확실히 제가 틀린 것 같습니다..

----

일단 포인터에 대한 이슈는 더 이상 대화가 진행이 안되겠지만, 일단 추가하도록 하겠습니다.

자바에서 swap을 http://dhplanner.blogspot.com/2009/11/java-%EC%97%90%EC%84%9C%EC%9D%98-call-by-value-%EC%99%80-call-by.html에서 긁어와봤습니다.

class Test {
    private static void swap(Integer a, Integer b) {
        Integer temp = a;
        a = b;
        b = temp;
    }
 
    public static void main(String args[]) {
        Integer a = new Integer(1);
        Integer b = new Integer(2);
 
        System.out.println("a => " + a.intValue());
        System.out.println("b => " + b.intValue());
 
        swap(a, b);
 
        System.out.println("------- swap 후 -------");
 
        System.out.println("a => " + a.intValue());
        System.out.println("b => " + b.intValue());
    }
}

C++ pointer로 동일하게 작성합니다.

#include <stdio.h>
 
typedef int* Integer;
 
int intValue(int* value)
{
	return *value;
}
 
int* newInteger(int n)
{
	return new int(n);
}
 
void swap(Integer a, Integer b)
{
	Integer temp = a;
	a = b;
	b = temp;
}
 
int main(void) {
	Integer a = newInteger(1);
	Integer b = newInteger(2);
 
	printf("a => %d\n",intValue(a));
	printf("b => %d\n",intValue(b));
 
	swap(a, b);
 
	printf("------- swap 후 -------\n");
 
	printf("a => %d\n",intValue(a));
	printf("b => %d\n",intValue(b));
}

C++ reference로 동일하게 작성합니다.

#include <stdio.h>
 
typedef int Integer;
 
int& intValue(int& value)
{
	return value;
}
 
int newInteger(int n)
{
	return n;
}
 
void swap(Integer& a, Integer& b)
{
	Integer temp = a;
	a = b;
	b = temp;
}
 
int main(void) {
	Integer a = newInteger(1);
	Integer b = newInteger(2);
 
	printf("a => %d\n",intValue(a));
	printf("b => %d\n",intValue(b));
 
	swap(a, b);
 
	printf("------- swap 후 -------\n");
 
	printf("a => %d\n",intValue(a));
	printf("b => %d\n",intValue(b));
}

다 돌려보시면, Java의 reference와 C++의 pointer는 동일하게, 주소만 바뀌어서 제대로 swap이 되지 않습니다.

C++의 reference는 정상적으로 swap이 됩니다.

이러한 동작도 Abstraction Layer와 관계가 있는건가요?

------------------------------
How many legs does a dog have?

익명 사용자의 이미지

결국은 또 이렇게 되는군요. 저도 길게 써봤자 되도않은 논쟁만 벌어질거같아서 부부싸움얘기로 마무리지었지만,
이로써 semmal 님은 앞으로 확실치 않은 지식을 "단정"지어서 사실인양 전파하시는걸 자제하시게 되겠군요.
개인의 경험과 생각이 중요한만큼 "일반성"을 토대로한 타인의 생각또한 존중되어져야 합니다.
자기보다 더 뛰어난 사람이 있을수도 있고 자기의 생각과 방향이 잘못되었을수도 있는거니깐요.
자신의 생각과 다르다하여, 자신이 알고있는것과 다르기때문에 타인의 의견을 마치 소설썼다는 식으로 무시하고
이젠 협상과 정치냐, 재밌다는 식으로 비꼬는 발언하시며 본인의 주장을 관철시키기 위해 토론방향을 이끌어가는건
분명 바람직한 태도는 아니라고 생각합니다. 애초에 스타트를 다른곳에서 해서 서로 다른 곳을 향해달렸지만,
어쨌거나 잘못된 부분은 인정하시고 여기서 일단락 짓는 모습 보여주신 것도 여러모로 좋은 결과입니다.
보는 사람들은 토론 내용도 토론자의 자세도 많이 배우게 되니깐요.
비록 생각은 다르지만 예시와 관련자료 첨부해서 진리를 알고자
노력하신 모습 보여주신 점은 배울만한 점이라 생각합니다.
그럼 한단계 더 성숙해지신 모습 기대하겠습니다.
수고들하셨습니다.

p.s. 질문하신글 논외의 글을 적게되어 유감입니다.

neocoin의 이미지

예 , 이런 경우가 문제입니다. 말씀처럼 swap 은 Java의 call by value 를 이야기하는 모범 주제지요. 좋은 예제를 상기시켜 주셔서 감사합니다.
(Pascal 뿐 아니라 C++ 도 있다는것을 간과했습니다. )

이 소스를 설명하기위해서 C++에서 말하는 reference 와 Java 의 reference 는 다릅니다. 어느쪽이 더 일반적인 용어라고 하신다면 글쎄요.. 전 둘다 일반적인 용어라고 부르기에 부족하다고 생각합니다. 둘 다 해당 언어의 세상에 적합한 용어입니다.

그렇다면 이 두차이를 설명하시고 다른 분들께 말씀을 시작하셔야 할 것 같아요. 서로 다른 분야의 두 용어를 같은 선상에서 말씀하시고, 오직 C/C++ 관점으로 Java를 이야기 하면, 서로가 이해할 수 없는 이야기의 나열일 뿐입니다.

저는 이러한 관점에서 다른 분들과 대립을 세우는게 아닌가 생각합니다. 보통 이런 논의는 상당히 기본 지식에 해당하는 부분을 지적하는 거라서 묘하게 자존심 긁는 면이 있죠. :)

그리고 마지막 말씀대로 동작과 구성, 용어는 각 언어의 추상 계층과 밀접하게 관계 있다고 생각합니다.

neocoin의 이미지

수정이 안되어서 답답한 면이 있는데,

이건 언어의 구현 나름입니다. -> 이건 언어의 정의 나름입니다.

이 말을 의미하며 적었습니다. 이후/이전 댓글에 '구현'이란 표현이 jvm 같이 '언어의 구현체'이지 정의를 의미한게 아닌데 잘못 적었습니다. 그래서 글이 잘못 전달될 수 있겠네요. 편집하려는 순간에 잠겨 버렸습니다. 양해 부탁드립니다.

preisner의 이미지

모두들 그만 자제 하시는게 좋겠습니다.
주장의 옭고 그름을 떠나서 주제와 상관 없는 논제로 논쟁을 벌이는 것은 원글 작성자에게 예의 없는 행동입니다.
더 논쟁을 하고 싶으시면 별도로 주제를 하나 열어 계속 하시는게 좋겠습니다.

달리나음의 이미지

1. ISO C언어의 포인터 역시 객체(object)를 가리키는 것이라고 명세되어 있습니다. 특정 메모리 주소를 의미하는 것이 아닙니다. 객체를 가리키는 방법 중의 하나가 메모리 주소가 될 수도 있는 것입니다. (스펙을 참조하십시요.)

2. Java의 레퍼런스가 C의 포인터에 비해 제약이 많습니다. 그렇기 때문에 조금 더 안전하게 쓰일 가능성이 있습니다. 여기에 대해 동의하지 않는다면 어떤 대화도 진전이 없겠지요.

3. 또, C와 Java 모두 pointer나 reference 값을 이용하여 call by value를 사용할 수 있는 언어일 뿐. Call by reference와는 무관합니다.

neocoin의 이미지

그러고 보니 C 명세를 볼때도 그 부분이 인상깊었는데, 평소 포인터 연산을 다루다보니 이야기 속에서 저도 어느덧 C 포인터가 메모리만을 가리킨다고 단정하고 이야기를 하고 말았네요.

상기시켜 주셔서 정말 감사합니다.

익명 사용자의 이미지

포인터에 대한 정의부터 해야겠죠..
포인터를 주소 관련 연산자라고 정의하면 자바에는 포인터가 없습니다.
포인터를 가르키는 것(참조)으로 정의하면 자바, 파이썬, 루비에도 포인터가 있게 됩니다.
논쟁 끝, 그만 싸우삼.

퀘이크의 이미지

자바에 포인터에 대한 말을 한마디 했더니 이렇게 댓글이 많이 달리다니;;

이게 이렇게 어려운 문제였나?;; 저는 포인터가 없다고 생각했는데 틀리진 않았군요.

페이지