2007/03/20 20:57
RL.C omputer
1. A=3이라고 한다면
2. 여기서 B=A라고 한다면

3. B=5라면

4. 포인터를 사용한 참조호출에서의 차이
A=3
C=&A
B=*C
라는 C코드가 있다면 , 이렇게 된다.

즉, 2에서 말한 CALL BY REFERENCE를 실현한다.
여기까진 문제가 아닌데, 만약 위의 코드에서
B=7이라고 하게 되면

즉, 원치 않았던 A의 값이 바뀌는 결과를 초래한다.
그럼 원론적으로, CALL BY VALUE만 쓰면 되지 않느냐고 물을지도 모르는데,
저렇게 간단한 값은 상관없지만, 백만개쯤 되는 배열을 CALL BY VALUE로 쓰면
백만개나 되는 값을 복사해야 하는 것이다. 시스템에도 부하가 걸리고, 메모리도 두배 낭비다.
C에서 포인터가 위험한 것은 위와 같은 이유다. A는 바꾸고 싶은 생각이 없었는데, 바뀐 것이다.
물론 DANGING POINTER라거나, 포인터 연산을 통한 위험한 메모리 어드레스 간섭또한 무서운 것이다.
하지만 원론적으로, 어짜피 포인터는 위와같은 위험에서 진화해 나가서 더 위험한 결과를
초래하게 된다. C언어는 구조상 포인터 없이는 프로그래밍이 불가능하므로 포인터 연산 기법이 발달해있고
이는 아차하는 순간 치명적 오류를 낸다.
CALL BY REF가 C에 필요한 경우는 이런 경우를 제외하고도 많다. PASCAL이나 BASIC같은
CALL BY VALUE중심 언어들은 어떤 식으로든 (BYREF명령어가 있거나, 포인터가 있거나)
CALL BY REF를 지원하기 마련이다.
포인터가 사용되어야 할 경우는 생각보다 많다.
C에서는 모든것이 '함수'다. 함수의 정의를 생각해보면, 입력값은 뭐든 관계없지만, 출력값이 하나여야 한다.
(물론 VOID형도 있지만 일단 논외로 하자)
이것은 값은 두개 리턴해야 하는 경우에는 난감한 문제를 부른다.
SWAP같은것은 값을 두개 받아서 두개를 리턴해야 한다. 하지만 함수는 값을 하나밖에 리턴 못한다.
어떻게 할 것인가. 일반적인 구현으로는, 값 두개를 받아서, 그 두개를 배열로 묶은 다음, 배열의 포인터를
리턴하는 방법을 쓴다. 받은 후에 배열을 다시 분해하는 것이다.
사실 C에서는 이 방법 말고는 SWAP을 구현할 방법이 없다.
<계속..>
GC원리
(사진)
3. B=5라면
4. 포인터를 사용한 참조호출에서의 차이
A=3
C=&A
B=*C
라는 C코드가 있다면 , 이렇게 된다.
즉, 2에서 말한 CALL BY REFERENCE를 실현한다.
여기까진 문제가 아닌데, 만약 위의 코드에서
B=7이라고 하게 되면
즉, 원치 않았던 A의 값이 바뀌는 결과를 초래한다.
그럼 원론적으로, CALL BY VALUE만 쓰면 되지 않느냐고 물을지도 모르는데,
저렇게 간단한 값은 상관없지만, 백만개쯤 되는 배열을 CALL BY VALUE로 쓰면
백만개나 되는 값을 복사해야 하는 것이다. 시스템에도 부하가 걸리고, 메모리도 두배 낭비다.
C에서 포인터가 위험한 것은 위와 같은 이유다. A는 바꾸고 싶은 생각이 없었는데, 바뀐 것이다.
물론 DANGING POINTER라거나, 포인터 연산을 통한 위험한 메모리 어드레스 간섭또한 무서운 것이다.
하지만 원론적으로, 어짜피 포인터는 위와같은 위험에서 진화해 나가서 더 위험한 결과를
초래하게 된다. C언어는 구조상 포인터 없이는 프로그래밍이 불가능하므로 포인터 연산 기법이 발달해있고
이는 아차하는 순간 치명적 오류를 낸다.
CALL BY REF가 C에 필요한 경우는 이런 경우를 제외하고도 많다. PASCAL이나 BASIC같은
CALL BY VALUE중심 언어들은 어떤 식으로든 (BYREF명령어가 있거나, 포인터가 있거나)
CALL BY REF를 지원하기 마련이다.
포인터가 사용되어야 할 경우는 생각보다 많다.
C에서는 모든것이 '함수'다. 함수의 정의를 생각해보면, 입력값은 뭐든 관계없지만, 출력값이 하나여야 한다.
(물론 VOID형도 있지만 일단 논외로 하자)
이것은 값은 두개 리턴해야 하는 경우에는 난감한 문제를 부른다.
SWAP같은것은 값을 두개 받아서 두개를 리턴해야 한다. 하지만 함수는 값을 하나밖에 리턴 못한다.
어떻게 할 것인가. 일반적인 구현으로는, 값 두개를 받아서, 그 두개를 배열로 묶은 다음, 배열의 포인터를
리턴하는 방법을 쓴다. 받은 후에 배열을 다시 분해하는 것이다.
사실 C에서는 이 방법 말고는 SWAP을 구현할 방법이 없다.
<계속..>
GC원리
(사진)

