자바에는 포인터가 없다고 들었습니다

athxue의 이미지

그렇다면 저수준의 하드웨어 제어는 불가능 한건가요? 불편한점이 있을꺼
같은데요?

욱성군의 이미지

자바 자체가 VM 위에서 돌아가니 저수준의 제어는 어렵지요 :)

superwtk의 이미지

글쎄요.. 포인터가 없다고 하기엔 무리가 있어보이네요.

Object o1 = new Object();
Object o2 = o1;

이라고 했을 때, o1 객체가 o2 객체로 복사되는 것이 아니라, o1 객체가 참조하고 있는 곳과 똑같은 곳을 참조하도록 할 뿐입니다. o1.hashcode() 와 o2.hashcode() 의 값을 비교해보면 알 수 있겠죠.

포인터 연산만 못하게 되어있을 뿐, 실제로는 포인터라고 볼 수 있겠죠.

http://blog.superwtk.com/

kewlbear의 이미지

가비지 콜렉션을 위해 레퍼런스 카운팅을 하니 그냥 포인터라고 하긴 좀 그렇고 스마트 포인터의 일종이라고 하면 어떨까요?

winner의 이미지

GC 는 보통 참조계수는 하지 않습니다.

Hyun의 이미지

참조계수?
조금만 더 자세히 설명해주실수 있으신가요? (이 글, 오래전 글이군요...)

r0x2tk1t의 이미지

제 개인적인 생각으로는

포인터라는 용어만이 존재하지 않을 뿐입니다.
자바에서는 흔히 참조라고 하죠. 포인터의 개념을-
메모리 구조로 보면 C++의 포인터와 유사합니다.

I think I can!!
Google Talk::chanju_dot_jeon(at)gmail_dot_com

日新 日日新 又日新
Google Talk::chanju_dot_jeon(at)gmail_dot_com

semmal의 이미지

포인터는 그냥 개념일 뿐입니다.
C++에서는 그 개념을 나름대로의 방식으로 구현해서 쓰고 있을 뿐이지요.
마찬가지로 Java에서는 superwtk님의 말처럼 구현해서 쓸 수 있습니다.
프로그래밍을 하신다면 개념과 구현은 정확히 구별하고 말씀하셔야합니다.
개념적으로 말하자면 C에서 말하는 expression과 statement도 잘못된 표현이랍니다. ^^

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

An의 이미지

포인터는 그냥 개념일 뿐인게 아니고 씨퓨 레벨 기계어에서 지원되는 "기능"입니다. 포인터가 없으면 기계 자체가 돌아가질 않아요.

semmal의 이미지

class A {
}

class B {
A b;
}

B클래스가 A클래스를 지니고 있다면 "개념적으로" B클래스는 A클래스의 포인터로 볼 수도 있습니다.
포인터를 나타내는 방법은 아주 많습니다.

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

An의 이미지

포인터는 주소값을 갖는 변수에요. 클래스를 저렇게 구성하는 걸 보고 아무도 포인터라고 하지 않아요.

mach의 이미지

저수준 제어가 불가능한 것만은 아닙니다.
1) JNI 를 사용하여 제어 할 수 있을것입니다.
- C/C++등으로 저수준 드라이버를 만들고, 이를 자바와 연동이 되는 메카니즘(프레임워크)인 JNI로 빌드하는 것입니다.

2) IPC사용
- 저수준 제어를 하는 다른 프로그램 언어로 만들고, 이 프로그램을 독립적으로 수행시킨 후, 자바와 IPC로 통신을 하는 방법입니다.

1,2 둘다 일장일단이 있으며, 여러 조건을 보고 사용하시면 되겠습니다.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

ㅡ,.ㅡ;;의 이미지

아무래도 포인터가 없으면 불편해서..


----------------------------------------------------------------------------

...의 이미지

말씀하신 데로 자바 언어 자체만 가지고는 저수준 하드웨어 제어가 불가능합니다. 하지만 윈도나 리눅스같은 운영체제가 C 로 된 api 만을 제공하므로 C/C++과 어셈블리를 제외한 언어들도 그 언어 자체만 가지고는 저수준의 하드웨어 제어를 못하는 것은 마찬가지 아닐지요. 대부분의 언어에서 저수준 하드웨어 제어를 위해서는 자바의 JNI 처럼 C 를 이용해서 그 언어로 wrapping 된 api 를 만드는 것이 일반적인 방법이라고 알고 있습니다.
저수준 하드웨어를 제외한 포인터의 장점은 레퍼런스(c++, 자바)를 이용해 거의 커버할 수 있다고 생각합니다.
레퍼런스를 사용하면 포인터 연산을 할 수 없는데, 이는 자바 류에서는 포인터 연산이 장점이라기보다는 단점으로 보고 제외한 것으로 알고 있습니다.

ㅡ,.ㅡ;;의 이미지

"이는 자바 류에서는 포인터 연산이 장점이라기보다는 단점으로 보고 제외한 것으로 알고 있습니다"

여기에서 자바와 C의 매우큰차이죠..

같은걸보고 한명은 장점이라고 하고 한명은 단점이라고 하는...

여담입니다만...

사람마다 생각의차이가있고 취향이 다르니 각자 편한거 사용하면된다고 했더니..

Java하시는분이 그렇게하면안된다더군요.. java 가대세라면서.. 대세를 따라야 한다고..ㅡㅡ;;
개인의 취향은 포기해줘야된다고..ㅡㅡ;;

좀어이가 없었죠.. Java가 얼마나 사용하는지 몰라도
제가볼때는 그런사고라면 세상에 발전은 없습니다.. 새로운무엇을 시도하려면 현제의 대세가
그것을 밟아 버릴테니까요..

역시나 그런이론이었다면 애초 C가 대세일때 java는 탄생조차 하지못했을겁니다. "너혼자 어줍잖은거 쓰지말고 대세를따라라.."한다면..말이죠..


----------------------------------------------------------------------------

Trace의 이미지

C/C++로 프로그램하던 많은 분들이 "Java에도 포인터가 있다. 아니, 전부 다 포인터다." 라고 하시는데, 이는 틀린 이야기는 아니지만 정확하게 맞지도 않습니다.

결론부터 말씀드리자면, 자바에는 포인터가 없습니다. 다시 말해서 메모리의 주소값이라는 개념은 사용하지 않습니다. 단지 어떤 객체에 대한 reference가 있을 뿐입니다.

"그게 그거 아니냐." 고 하실지 모르지만, 이는 엄연히 다릅니다. 포인터는 reference를 구현하는 하나의 방법이지만, 얼마든지 다른 방법들도 있습니다. 예컨대 모든 객체를 table에 기록해 놓고, reference는 그 table상의 index로 구현하는 것도 가능합니다. 프로그래밍 레벨에서라면 자바에서는 그 reference의 구현 방법은 알 필요가 없습니다.

이를 포인터로 이해하는 것은 C/C++의 개념을 통해서 자바를 이해하려는 것입니다. 그렇게 이해한다고 해서 특별한 문제는 없지만, 어쨌든 자바 자체에 포인터의 개념이 포함되어 있다고는 할 수는 없습니다.

혹은 앞의 분 말씀대로 포인터라는 것을 모든 reference를 포함하는 개념으로 사용해서 이해하는 것도 나쁘지는 않겠습니다만, 일반적인 용어 사용의 문제에서 보면 포인터라는 것은 C/C++에서 사용되는 용어이며 주소값의 의미로 굳어져 있습니다. 오히려 reference가 OOP에서 널리 사용되어 온 용어인 만큼 reference가 포인터의 일종이라기보다는 포인터가 reference의 일종이라고 하는 편이 오해를 줄이는데 도움이 될 것 같습니다.

semmal의 이미지

각 언어마다 포인터라는 개념은 다 있고, 각자의 구현과 쓰는 방법이 다 다릅니다.
단지 C/C++/asm에서 쓰는 포인터만이 "진정한 포인터"라고 생각하시는 모양이군요.
그렇게 생각하기게 된 계기가 무엇인지요?
이런 댓글을 보면 다른 분들이 게시판을 실명제로 운영하자는 말씀에 심하게 공감이 가네요.

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

cleol의 이미지

전 An 님이 아니지만 그냥 끼어들고 싶어져서^^;
전 일상 업무에서 자바를 가장 많이 사용하지만 자바에도 포인터가 있다고 말하는 사람들을 볼때면 참 답답합니다. 보통 그런 사람들과 좀 더 이야기를 나누어보면 C 포인터가 무엇인지 잘 모르거나, 아니면 포인터라는 용어는 C/C++ 를 통해서 알게됬지만 C/C++ 에서 사용하는 의미보다 넓은 의미로 마음대로 확장해서 사용하는 것이더군요.
포인터라는 말에 대해 모두가 인정하는 구체적인 '정의'는 존재하지 않지만 일반적으로 포인터라는 말을 사용할때면 C/C++ 의 포인터를 지칭합니다. semmal 님이 말씀하시는 '포인터 개념'에 대해서는 보통 '레퍼런스'라는 용어를사용하지요.(C++ 의 레퍼런스를 말하는 것이 아닙니다. C++ 은 레퍼런스라는 용어를 보다 한정적인 뜻으로 사용합니다.) 그리고 asm 을 지칭하셨는데 asm 에는 포인터라는 '개념'조차 없습니다. 포인터는 일종의 데이터 타입인데 asm 에는 데이터 타입이라는 것이 있지도 않고, asm 이 하는 일이 메모리를 직접 다루는 일이므로 직접 메모리 조작보다 추상적인 포인터 같은 개념이 필요할 이유도 없습니다.

포인터라는 용어의 의미에 대해서는 Trace 님이 정리하신 내용이 좋은 답변인것 같습니다.
그리고 원래 질문중에 하나였던 편리성 여부와 저수준 하드웨어 제어에 대해서는 ... 님이 말씀하신게 좋은 답변인 것 같구요.

semmal의 이미지

위키피디아를 살펴봤습니다.

In computer science, a pointer is a programming language datatype whose value refers directly to ("points to") another value stored elsewhere in the computer memory using its address.
컴퓨터 과학 분야에서, 포인터는 프로그래밍 언어 데이터타입이다. 이 데이터 타입은 다른 값으로부터 참조되는 값을 저장하는데, 그 참조되는 값은 컴퓨터 메모리상에 주소 어딘가에 저장되어있다.
A pointer is a simple implementation of the general reference datatype (although it is quite different from the facility referred to as a reference in C++).
(C++의 레퍼런스처럼, 참조되는 방법이 많이 다르더라도-"C++에서는 포인터와 레퍼런스가 서로 다르게 취급되는 것에 대한 말") 포인터는 보통의 레퍼런스 데이터타입의 구현이다.
Pointers are so commonly used as references that sometimes people use the word "pointer" to refer to references in general;
포인터는 보통 레퍼런스처럼 사용되는데, 어떤 사람들은 일반적으로 레퍼런스를 참조하는 것을 포인터라고 부른다.
however, more properly it only applies to data structures whose interface explicitly allows it to be manipulated as a memory address.
즉, 더 정확하게 말하자면, 포인터는 여러 데이터 구조를, 메모리 주소를 써서 다루게하는 명시적인 인터페이스일 뿐이다.

덧붙여 레퍼런스에 대한 설명입니다.

In computer science, a reference is a small object containing information which refers to data elsewhere, as opposed to containing the data itself.
컴퓨터 과학 분야에서, 레퍼런스는 데이터가 그 자신을 뜻하는 것과는 반대로, 어딘가에 있는 데이터를 참조하는 정보를 뜻하는 작은 오브젝트다.
Accessing the value that a reference refers to is called dereferencing it.
레퍼런스가 참조하는 값을 살펴보는 것은 디레퍼런싱이라고 부른다.
References are fundamental in constructing many data structures and in exchanging information between different parts of a program.
레퍼런스는 많은 데이터 구조를 만들거나, 프로그램의 서로 다른 부분의 정보를 교환할때 쓰는 기본 도구다.

레퍼런스는 데이터 자신이 아니라 그 데이터를 가리키는 오브젝트를 뜻하고, 포인터는 레퍼런스의 구현이라고 되어있습니다.

위에서 적힌대로 설명하자면, 어떤 프로그래밍 언어도 "메모리를 쓰지 않는" 언어는 없으며, 당연히 데이터와 함께 데이터를 가리키는 레퍼러스의 개념이 있고, 당연하게 레퍼런스를 쓸수 있게 구현한 "포인터"를 쓰고 있습니다.
즉, 어떤 언어건 간에 포인터는 무조건 존재합니다. 왜냐하면 포인터가 없다면 프로그램자체가 불가능하기 때문입니다.
어떤 오브젝트에서 다른 오브젝트를 가리킬 방법이 없다면, 어떻게 프로그램을 짤 수 있겠습니까?

제가 말씀하고자하는 바는 애초에 "포인터가 없어서 저수준의 하드웨어 제어는 불가능한가"라는 질문자체가 잘못되었다는 것을 지적하려고 했던 것입니다. 물론 의도와는 다른 방향으로 글이 전개된 것은 있습니다 (__)

어쨌든 다시 정확히 말씀드리자면, 포인터의 존재유무와 저수준의 하드웨어 제어는 서로 관계가 없습니다.

1. 어떤 언어가 저수준 하드웨어 제어가 편할 수도 불편할 수는 있습니다.
2. 어떤 언어가 포인터를 쓰는 문법이 편하고 불편할 수는 있습니다.
3. 어떤 언어가 포인터와 저수준 하드웨어 제어가 서로 잘 맞물리는 경우도 서로 관계없는 경우도 있을 수 있습니다.

따져보면 C는 1과 3은 좋은 편이지만 2가 반드시 좋다고 말할 수 없습니다. 왜냐하면 추상 수준이 그만큼 낮기때문에 복잡한 포인터의 연관관계가 얽히게 되면 프로그래밍이 더 어려워질 수 있습니다. C에서 포인터가 그렇게 편하다면 프로그램 거의 모든 부분을 포인터만으로 작성해도 불편함이 없어야 합니다. 실제로 이렇게 하기에는 너무 많은 메모리 충돌문제 등이 발생해서 어렵죠.

Java는 1과 3이 불편합니다면, 2는 C보다는 편하다고 볼 수 있습니다. 일단 저수준에서 한단계 올라선 추상수준을 지니고 있기때문에, 최소한의 메모리 문제에서 자유롭습니다. 하지만 여전히 추상수준이 낮아서, 프로그램이 정말 복잡한 레퍼런스 관계를 가진다면 주의를 해가면서 써야합니다.

Prolog와 같은 언어는 역시 1과 3이 안좋습니다만, 2는 아주 편합니다. 보이는 오브젝트는 모두 포인터로 구성되고 추상수준이 매우 높아서 각각의 오브젝트를 가리키는데 불편함이 없습니다.

"포인터의 유무는 저수준 하드웨어 제어와는 상관없는 문제고, C의 경우에는 포인터의 문법이 하드웨어 제어와 잘 맞아들어간 경우다."라고 결론 내릴 수 있겠습니다.

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

...의 이미지

Quote:

however, more properly it only applies to data structures whose interface explicitly allows it to be manipulated as a memory address.
즉, 더 정확하게 말하자면, 포인터는 여러 데이터 구조를, 메모리 주소를 써서 다루게하는 명시적인 인터페이스일 뿐이다.

해석이 잘못되었습니다. 보다 잘 해석하자면

"그러나 그것은(포인터라는 단어는) 메모리 주소를 명시적으로(또는 직접) 다둘 수 있는 인터페이스가 있는(제공되는) 데이터 구조(자료형)에만 적용되야 한다."

입니다. 즉, 이 문장을 쓴 사람의 입장은 자바의 레퍼런스같은 것을 포인터라고 부르면 안된다는 뜻입니다.

__의 이미지

그러나 그것은(포인터라는 단어는) 데이터 구조를 메모리 주소값으로 직접 다룰 수 있도록 허용되는 인터페이스가 있을 경우에만 적용하는 것이 보다 적합하다.

하고 해석해야 하지 않을까요? 어쨌거나 이 사람이 자바의 레퍼런스를 포인터라고 부르지 않을 것은 맞군요.

Prentice의 이미지

Quote:
Quote:
however, more properly it only applies to data structures whose interface explicitly allows it to be manipulated as a memory address.
즉, 더 정확하게 말하자면, 포인터는 여러 데이터 구조를, 메모리 주소를 써서 다루게하는 명시적인 인터페이스일 뿐이다.

해석이 잘못되었습니다. 보다 잘 해석하자면

"그러나 그것은(포인터라는 단어는) 메모리 주소를 명시적으로(또는 직접) 다둘 수 있는 인터페이스가 있는(제공되는) 데이터 구조(자료형)에만 적용되야 한다."

입니다. 즉, 이 문장을 쓴 사람의 입장은 자바의 레퍼런스같은 것을 포인터라고 부르면 안된다는 뜻입니다.


Wikipedia는 어느쪽 입장에도 손을 들어주지 않는 것을 원칙으로 합니다. More properly는 "엄밀히 말하자면" 쪽에 훨씬 가깝다고 생각합니다.
semmal의 이미지

그렇다면 제가 길게 쓴 글이 다 틀린 것이군요.
결국 제가 하는 말은 "레퍼런스를 다루는 것이 포인터다"라는 논리에 근거한 것이었는데 말이죠.
제가 너무 확대해석을 한 것이겠네요.
안되는 영어 해석해가면서 길게 길게 적었는데 그야말로 털썩입니다.
님의 해석이 정확하십니다.
위의 글이 너무너무 부끄럽고, 잘못된 걸 알게되서 다행스럽다는 생각도 드네요.
두고두고 놔두면서 제 얄팍한 지식을 좀 더 가다듬는 계기로 삼아야겠네요.

다시 결론 내리자면 "제가 틀렸습니다." 어이쿠.

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

...의 이미지

여담이지만, semmal 님 멋있습니다. 지금 황우석 관련된 다른 글태래 보다가 왔는데... 정말 가관이더군요. 사람들이 토론에서 semmal 님 같은 태도 좀 보였으면 좋겠습니다.

An의 이미지

프로그래밍은 프로그래밍 책을 사서 정통으로 배워야 해요.
인터넷에 떠도는 글 몇개 줏어읽고 전부 이해했다고 그게 지식이 되는게 아니에요.
그거는 모르는 사람들 앞에서 어깨 힘줄 때는 먹힐지 모르지만 전문가들 앞에서는 금방 뽀록나요.
어떤 언어든지 5년 이상 그 언어로 프로그램을 직접 짜본 다음 이건 이렇고 이건 이렇다 말씀을 해주세요.
그전에 얘기하는거는 전부 완벽하게 이해한 지식이 아니에요.

thyoo의 이미지

Abraham Lincoln posed this question: “How many legs does a dog have?” The reply of course was four.

Lincoln asked, “If we call the tail a leg, then how many legs does a dog have?” The reply: Five.

“No,” Lincoln said, “Just because you call a tail a leg doesn’t make it so.”

http://www.geocities.com/Heartland/2964/homily16Sundayc.html
___________________________________
Less is More (Robert Browning)

___________________________________
Less is More (Robert Browning)

semmal의 이미지

저에게 딱 들어맞는 말인 것 같습니다. ㅠㅠ
꼬리를 다리라고 부르면 다리는 하나뿐인게죠.

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

semmal의 이미지

잘못된 지식을 혼자서 알고있는 것은 죄라고 할 것은 없겠지만, 그걸 전파까지 하면 정말 심각한 죄죠.
욕먹어도 쌉니다.
이제 막 kldp 활동을 시작했는데, 긴장 바짝하고 한동안 근신해야겠습니다.

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

semmal의 이미지

그런데 제가 엄청난 고수는 아니지만 C를 1993년부터 써왔습니다. C++는 1996년부터구요.
대학원 공부때문에 최근 몇년간 다른 언어를 많이 접하고 깊이도 얕은 것은 사실이지만,
프로그래밍을 정통으로 배우지 못했다고 하거나 인터넷에 떠도는 글 몇개 줏어보고 라는 말은 심히 거슬리네요.
같은 말이라도 익명이 아니라 실제 아이디로 말씀하셨다면 조금이나마 덜 기분나쁘겠는데요.

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

An의 이미지

포인터의 포자도 모르는 말씀을 하시길래 프로그램은 정통으로 배워야한다고 말씀드린 것 뿐이에요.
표현이 거슬렸다면 사과드려요.

익명 사용자의 이미지

이것 저것 배우고 가려고 들어왔는데...
눈쌀 찌푸려지게 만드는 덧글이네요
공부에 정통이 있긴 합니까?
그 기준은 무엇이지요?
정통으로 배우게 학습 순서좀 공유해주세요.

semmal의 이미지

Scheme으로 쓰여진 책입니다.
다른 글에서 설명했다시피 MIT에서 학부생 가르치는데 쓰는 책이죠.
그 책에 pointer라는 용어가 나옵니다.
아마 이걸 본 이후로 제가 포인터에 대한 개념을 확장하게 된 것이라 생각합니다.
실제로 lisp에는 C/C++의 포인터가 없습니다.
하지만 이 책에서 pointer라는 용어를 쓰면서 정확하게 메모리에서의 포인터과 같은 개념으로 썼습니다.
지금와서 생각해보니 약간의 차이가 있기야했지만...
C/C++에서의 pointer는 프로그래밍 할때의 포인터고, 이 책에서의 pointer는 컴파일러를 만드는 과정에서 레퍼런스할 수 있는 포인터를 쓰는 것이네요.
포인터의 포자도 몰라서라기 보다는 쓸데없이 부정확하게 많이 알아서가 문제겠지요.
사과하시는것 같지는 않지만 받아들이겠습니다.
다음에는 치고박고 싸우더라도 실명으로 대화를 나눴으면 하는 군요.

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

ㅡ,.ㅡ;;의 이미지

그런데 의외로 JAVA 하시는분들이 자바에도 포인터가 있다고 우기는경우가 많더군요..

그뿐아니라 대부분비슷한논리를 펼치는것을보는데
자바하시는분들은 이런이야기들도 공유 하나요?


----------------------------------------------------------------------------

superwtk의 이미지

제가 용어의 정의에 대해서 확실히 생각해보지 않고 답변을 달았습니다. 다음부턴 자바의 레퍼런스를 포인터라고 말하지 않겠습니다.

http://blog.superwtk.com/

pool007의 이미지

Quote:

그런데 의외로 JAVA 하시는분들이 자바에도 포인터가 있다고 우기는경우가 많더군요..

그뿐아니라 대부분비슷한논리를 펼치는것을보는데
자바하시는분들은 이런이야기들도 공유 하나요?

위 인용문에 대한 질문에는 동의를 못하는 것이 제 입장입니다. 언어를 익힌다는 것은, 기존의
틀 안에서 새로운 언어를 다 이해해보자는것이 목적이 아니라, 새로운 언어로 새롭게 사고하고자하는 것입니다.

자바는 레퍼런스만 있을 뿐 포인터는 없습니다. 물론 그 구현은 포인터로 되어있겠죠. 그리고 포인터라는건
결국 indirect 하게 메모리 위치를 addressing할 뿐입니다. 즉 실제 객체의 위치가 또다른 메모리 공간에
저장되어있어서, 그걸 통해서 메모리 위치를 가보겠다는 것입니다. 그러나 그것은 구현의 입장이고,
자바는 자바의 방식으로 이해하는 것이 맞습니다. 참조는 참조고, 스마트 포인터도 아니고, 포인터도 아닙니다.
실제로 스마트 포인터처럼 변수가 스코프를 벗어난다고 메모리가 해제되는 것도 아니니까요.
자바는 자바이게 놓아 두세요. 자바는 C도 C++도 아닙니다. 그 둘의 유산을 물려받았지만 같은 언어가
아닙니다...

자바와 C++의 레퍼런스의 차이는 존재합니다. C++의 경우 한번 레퍼런스가 되면 그걸 바꿀 수가 없지만
자바는 가능하다는 것 등이요.. 또 C++의 레퍼런스는 null로 초기화 할 수 없으나 자바는 가능합니다.
한편 C/C++의 포인터는 널로 초기화할 수 있죠. C++의 레퍼런스는 할당후 변경할 수 없으나
자바는 가능합니다. C/C++에서 널을 할당후 사용하면 프로그램이 죽지만 자바는 NullPointerException
예외를 발생시킵니다.

보통 보면 자바를 약간 하는 정도의 분들이 자바를 설명할때 꼭 포인터의 개념을 끌어들이시는데 정말 정말
저는 그런 설명방식에 반대합니다. 자바를 처음 배우는 사람들이 포인터가 뭔지 제대로 알고 있는 경우도
드문데 꼭 이전 언어의 프레임웍을 끌어들여 설명해야하는지 의문입니다...

Quote:

자바 류에서는 포인터 연산이 장점이라기보다는 단점으로 보고 제외한 것으로 알고 있습니다.

바로 이런 이유에서 자바에서 포인터를 제외하였습니다. 자바는 태생이 보안을 염두에 두고 설계된 언어입니다.
제임스 고슬링 아저씨도 바로 객체의 접근이 모두 안전하게 처리된다는 것을 자바의 최대 장점으로 꼽습니다.

Quote:

가비지 콜렉션을 위해 레퍼런스 카운팅을 하니 그냥 포인터라고 하긴 좀 그렇고 스마트 포인터의 일종이라고 하면 어떨까요

자바는 레퍼런스 카운팅을 하지 않습니다. 레퍼런스 카운팅은 circular 한 참조가 있을경우 해결이 불가능하잖아요.
요즘은 다들 mark & sweep 으로 출발해서 변형된 방식을 사용합니다.

원래의 질문인

Quote:

그렇다면 저수준의 하드웨어 제어는 불가능 한건가요? 불편한점이 있을꺼
같은데요?

에 대해서는 '불편합니다'가 답입니다. 자바는 virtual machine상에서 돌아가므로 원래의 하드웨어를
접근할 수 없습니다. 저수준 제어가 꼭 필요하다면 C로 구현하고 JNI로 랩핑해서 자바에서 접근해야만 합니다.
그런데 그러다보면 배보다 배꼽이 클 것 같습니다. 만약 자바를 잘하시는데 하드웨어 제어를 해보고 싶다고
생각하시면, 일단 라이브러리를 찾아보세요. 가령 패킷 캡처의 경우 자바에도 라이브러리가 잘 구축되어
오픈소스로 공개가 되어있거든요.

--
Passion is like genius; a miracle.

--
Passion is like genius; a miracle.

우후랄라의 이미지

이미 남들이 다 한 이야기를 왜 또 반복하시나요?

pool007의 이미지

@우후랄라:

다섯가지로 질문드리겠습니다. 앞서,

1) 누가 '자바를 자바이게 하라'라고 설명했습니까? 언어를 배우는것은 기존의 개념을 배제하는 의미라고 누가 앞서서 말했습니까?
2) 누가 자바에서 포인터를 없앤 이유를 보안때문이라고 앞서서 설명했습니까?
3) 여기서 누가 자바의 GC가 레퍼런스 카운팅이 아니며 mark & sweep 이라고 했습니까? 또한 auto_ptr 류와 다르다고 말했습니까?
4) 누가 JNI 랩핑 클래스를 구현하기에 앞서 찾아보라고 말했습니까? 누가 자바로 하게 되면 오히려 오버헤드가 클 수 있다고 말했습니까?

마지막으로,
5) 당신은 왜 여기에 아무 필요없는 (non-informative)이야기를 덧붙입니까?

--
Passion is like genius; a miracle.

--
Passion is like genius; a miracle.

익명 사용자의 이미지

뭐 다들 이리 심각하시는지.

익명 사용자의 이미지

프로그래밍 언어는 기본적으로 똑 같은겁니다
플로우 차트에나오는 move, compare, jump명령으로 모든 기계는 돌아가는 거죠
심각하게 생각 할 필요가 전혀 없습니다

익명 사용자의 이미지

그렇다면 사람의 언어(말)도 기본적으로 똑같습니다.
그냥 성대가 울리고 이 파동이 고막을 진동시키는 거죠...

... 이생각에 동의할 수 없다면
프로그래밍 언어가 기본적으로 같다는것에 대해
다시한번 생각해 봅시다.

kj의 이미지

자바로 쓰여진 코드를 c++로 번역?하는 도중에 과연 어떤 부분에서 포인터를 이용하여 coding 해야하는가에 대한 궁금증을 가지던 차에 이 글에 까지 오게되었습니다. 포인터란 무엇인지가 확실히 선명해졌습니다. 여기에 고수분들이 많이 계시지만, 한마디 하자면... 포인터는 메모리 주소에 접근할 수 있도록 그 메모리 주소를 저장하는 하나의 변수라고 이해하고 있습니다. 비쥬얼스튜디오에서 디버그할 때 주로 DEBUG-WINDOW-MEMORY 경로로 각 메모리 주소에 저장되는 값들을 추적하게 되는데, 이 때 직접 메모리에 저장되는 값들과 그 주소를 확인할 수 있으므로, 포인터와 참조에 대한 개념을 잡기위해 가장 확실한 방법이라고 생각됩니다. 틀린내용이 있거나, 논쟁거리가 될 수 있는 부분은 주저마시고 지적해주시면 감사하겠습니다.

u235의 이미지

왜냐하면 사용자가 작성한 변수명/함수명은 컴파일시 절대주소든 상대주소든 특정 주소값으로 변역되기 때문입니다.
중요한건 상대주소는 컴파일시 결정되고 절대주소는 매실행시마다 다르게 된다는것인데
포인터가 없는 언어라 함은 상대주소만을 사용하며 절대주소는 참조/활용이 차단되며
포인터가 있는 언어는 절대주소, 상대주소가 모두 참조/ 사용이 가능한 언어입니다.
아마도 절대주소를 직접 핸들링할 필요가 있는 경우라면 H/W를 직접 제어하는 드라이버나 시스템적 코드일 것이나 C/C++는 그렇지 않은 경우에도 흔히 쓰여지고 있는데 규모가 커지면 가독성문제가 있습니다.
포인터가 없는 언어는 직접접근/활용이 제한된 언어를 말합니다.

James Gostling

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.