call by pointer와 call by reference의 차이점이 있습니까? cpp코드의 가독성을 제외한 call by reference가 가지는 장점이 있나요?
우선 레퍼런스는 쓰기 쉽습니다. 포인터처럼 쓸 때마다 역참조 연산자를 쓸 필요가 없죠. 이것만으로도 충분히 쓸 이유가 됩니다. 값으로 전달(call by value)과 코드상으로는 차이가 없기 때문에 쉽게 대체할 수 있죠.
하지만 제가 생각하기에 이보다 더 중요한 점은 레퍼런스는 포인터보다 더 안전하다는 것입니다. 포인터는 실수로 덧셈 뺄셈 연산을 수행하는 것만으로도 잘못된 위치를 가리키게 됩니다. 레퍼런스는 이런 일이 없습니다. 레퍼런스는 심지어 널을 가리키는 것도 불가능합니다.
----블로그 / 위키 / 리눅스 스크린샷 갤러리
많은 분들이 잘못 알고 계신 부분인데, 레퍼런스도 널을 가리키는게 가능합니다. (심지어 Joel Spolsky 도 틀린적 있죠)
void foo(int& bar) { // do whatever with bar }
void main() { int* baz = 0; // 혹은 NULL, nullptr
foo(*baz); }
내부 구현은 포인터를 이용하는 것과 별반 다르지 않지만 포인터를 이용할 경우 NULL 체크를 해줄 필요성이 있는데 반해 레퍼런스를 이용할 경우는 그럴 필요가 없습니다.
1. call by reference는 기본적으로 NULL을 허용하지 않는다. 2. call by reference는 copy constructor 등에서 코드의 가독성을 높인다. 등의 잠점이 있을 수 있습니다.
다만 C언어의 직관성(기계어로 어떻게 번역되느냐)이 있지만 C++에서는 코드의 번역에 대한 자세한 이해를 요구하는 단점이 있기도 합니다.
하지만 C++ 한번 맛들이면 C로 rollback하기는 어렵다는... ^^
www.gilgil.net
답변 감사합니다^^
포인터를 쓰는 경우와 레퍼런스를 쓰는 경우는 일단 문법이 다릅니다. ^^ 이게 농담같지만 정말 중요한 차이입니다.
연산자 오버로딩도 사실상 함수호출입니다. operator+()를 구현할때 하나는 포인터를 사용하고 하나는 레퍼런스를 사용해서 구현해 놨다고 해봅시다.
포인터를 쓰면 a + &b 라고 써서 호출해야겠지만 레퍼런스를 쓰면 a + b 라고 자연스럽게 쓸 수 있습니다.
실제로 포인터는 파라미터에 넘겨주고자 하는 변수의 주소값을 "복사" 해서 넣어줍니다.
말그대로 값이 복사되기 때문에, 해당 주소값을 이용해서 주소를 증가시키거나 하는 작업을 할수 있습니다.
NULL check나 가독성 등 레퍼런스가 장점은 있으나, 주소를 이용해서 프로그래밍 하는 경우에는 포인터를 사용해야합니다.
언제나 시작
텍스트 포맷에 대한 자세한 정보
<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]
우선 레퍼런스는 쓰기 쉽습니다. 포인터처럼 쓸 때마다
우선 레퍼런스는 쓰기 쉽습니다. 포인터처럼 쓸 때마다 역참조 연산자를 쓸 필요가 없죠. 이것만으로도 충분히 쓸 이유가 됩니다. 값으로 전달(call by value)과 코드상으로는 차이가 없기 때문에 쉽게 대체할 수 있죠.
하지만 제가 생각하기에 이보다 더 중요한 점은 레퍼런스는 포인터보다 더 안전하다는 것입니다. 포인터는 실수로 덧셈 뺄셈 연산을 수행하는 것만으로도 잘못된 위치를 가리키게 됩니다. 레퍼런스는 이런 일이 없습니다. 레퍼런스는 심지어 널을 가리키는 것도 불가능합니다.
----
블로그 / 위키 / 리눅스 스크린샷 갤러리
널을 가리키는 것 가능합니다.
많은 분들이 잘못 알고 계신 부분인데, 레퍼런스도 널을 가리키는게 가능합니다. (심지어 Joel Spolsky 도 틀린적 있죠)
void foo(int& bar)
{
// do whatever with bar
}
void main()
{
int* baz = 0; // 혹은 NULL, nullptr
foo(*baz);
}
내부 구현은 포인터를 이용하는 것과 별반 다르지
내부 구현은 포인터를 이용하는 것과 별반 다르지 않지만 포인터를 이용할 경우 NULL 체크를 해줄 필요성이 있는데 반해 레퍼런스를 이용할 경우는 그럴 필요가 없습니다.
사람마다 다를 수 있는데요
1. call by reference는 기본적으로 NULL을 허용하지 않는다.
2. call by reference는 copy constructor 등에서 코드의 가독성을 높인다.
등의 잠점이 있을 수 있습니다.
다만 C언어의 직관성(기계어로 어떻게 번역되느냐)이 있지만
C++에서는 코드의 번역에 대한 자세한 이해를 요구하는 단점이 있기도 합니다.
하지만 C++ 한번 맛들이면 C로 rollback하기는 어렵다는... ^^
www.gilgil.net
답변 감사합니다^^
답변 감사합니다^^
포인터를 쓰는 경우와 레퍼런스를 쓰는 경우는 일단
포인터를 쓰는 경우와 레퍼런스를 쓰는 경우는 일단 문법이 다릅니다. ^^
이게 농담같지만 정말 중요한 차이입니다.
연산자 오버로딩도 사실상 함수호출입니다.
operator+()를 구현할때 하나는 포인터를 사용하고 하나는 레퍼런스를 사용해서 구현해 놨다고 해봅시다.
포인터를 쓰면 a + &b 라고 써서 호출해야겠지만
레퍼런스를 쓰면 a + b 라고 자연스럽게 쓸 수 있습니다.
실제로 포인터는
실제로 포인터는 파라미터에 넘겨주고자 하는 변수의 주소값을 "복사" 해서 넣어줍니다.
말그대로 값이 복사되기 때문에, 해당 주소값을 이용해서 주소를 증가시키거나 하는 작업을 할수 있습니다.
NULL check나 가독성 등 레퍼런스가 장점은 있으나, 주소를 이용해서 프로그래밍 하는 경우에는 포인터를 사용해야합니다.
언제나 시작
댓글 달기