한동안 업뎃이 지연되었으므로 몰아서 올립니다. ㅋㅋㅋ 앞으로 빵꾸 안낼게요 ㅎㅎ
------------------------------------ 절 취 선 ---------------------------------------------
Call by value? Call by refernce?
이게 무슨말일까.. 자.. 이것을 알려면 잠시 함수로 돌아가줘야할 필요가 잇어.
함수를 우리가 호출할때 인자를 넘겨줄수 있었지?
넘기는 방식은
void main(){
int a=4;
int b=3;
...
myfun( a,b);
...
}
myfun(int a, int b){
....
}
이렇게 사용이 되었다는걸 기억할거야
자.. 이경우가 call by value라 불려.. 단순히 지금은 변수 자체를 던져주었잖아.. 그치? 이경우 a와 b가 실제로 넘어가지 않고 myfun에서 새로이 a,b가 생겨서 거기에 값만 복사가 되는거야. 실제로 프로그램에서 함수가 실행되면.. (호출되면..) 메모리 스택에 현재 상황에서 상위 영역에 호출되는 함수를 위한 영역을 새로 잡아.. 그리고 거기에 필요한 데이터를 복사하는거지... 음...
그니까..
| main함수영역 | myfun 영역 |
| int a, int b | a의사본 b의사본 |
이런식으로 존재하게 된다랄까? 이렇게되면.. myfun에서 a의 사본과 b의 사본을 아무리 지지고 볶아도..
메인함수의 a와 b에는 아 무 런 영향을 주지 않겠지?
음.. 예를 들자면.. 우리가 main에서 myfun을 호출했어....
myfun에서는 자기가 넘겨받은 a와 b의 값을 하나씩 증가시키는 역할을 해..
즉 myfun이...
myfun(int a,, int b){
a++;
b++;
printf("%d %d\n",a,b);
}
이렇게 선언되어있고...
main함수에서...
main(){
int a=4;
int b=3;
printf("%d %d\n",a,b);
myfun(a,b);
printf("%d %d\n",a,b);
}
이렇게 소스코드가 있다고 할 경우.. 프로그램을 실행한 후의 결과값은...
4 3 << main에서 출력
5 4 <<myfun에서 출력
4 3 << main에서 출력
이렇게 된다는거지.. 이유는 아까 위에서 설명한대로임 ^^
만약 우리가 myfun에서 계산한 어떤값을 main으로 가지고와서 활용을 하고싶다면.. 아니면 변화된 어떤값을 사용하고 싶다면.. 방법이 몇가지 있겠지?
우선적으로 3가지만 들어볼게..
1. a와 b를 전역변수로 사용한다.
a와 b의 범위가 프로그램 전체에 얽히도록 선언해주는 방법이야.. 그러면 myfun에서든 어디서든 a와 b를 건드릴수 있지.. 그렇게된다면.. 정말.. 최악이겠지? 아무데서나 저 a와b를 건드리게될테니.. 뭐.. 여튼 비추야..
2. 리턴값의 활용
리턴값을 줘서 메인에서 myfun을 호출하고 그 결과를 가져와서 반영하는방법.. 이거도 괜찮은 방법이지
근데 만약 건드려야할게 한개가 아니라 더 많다면? 이건 좀 골치아픈이야기가 될거같아..
3. 포인터로 주소값을 넘겨준다 (Call By Reference)
이것이 포인터 사용 목적중에 한가지야. 아까 Call By value는 함수를 호출할때 변수 값(Value)만 넘겨줘서 복사해서 사용하는것이었지만... 이경우는 포인터를 사용하여 변수의 주소값을 넘겨줘서 호출된 myfun에서 참조(reference)하여 사용하도록 하는거지.
사용 방식은.. 대략...
void main(){
int *a=4;
int *b=3;
...
myfun( a,b);
...
}
myfun(int &a, int &b){
....
}
이렇게 되지 이경우... myfun이 호출되었을때..
메모리에 들어간 것을 보자.
| main 함수 영역 | myfun영역 |
| int a, int b | a의포인터, b의포인터 |
이렇게 올라가게 된단다.. myfun에서 a의 포인터를 넘겨받으면 call by value처럼 myfun안의 사본을 가지고 값을 읽는게 아니라. 포인터가 가진 주소를 참조하여 (여기서 포인터가 가진 주소는 main함수 영역의 a를 가리키겠지? 혹은 b나) 값을 읽어와.
자.. 그럼 call by reference로 호출을 하였을때.. myfun에서 a값을 건드리게 되면.. main함수에 있는 a를 직접 건드리게 된단다. 그러면... myfun에서 a와 b를 가지고 지지고 볶으면... 그게 main에 있는 a와 b에도 영향을 주게된다는거지.
자.. 아까 위의 코드를 call by reference로 바꺼볼게
myfun(int &a,, int &b){
a++;
b++;
printf("%d %d\n",*a,*b);
}
main(){
int *a=4;
int *b=3;
printf("%d %d\n",*a,*b);
myfun(a,b);
printf("%d %d\n",*a,*b);
}
이 결과값은..
4 3 <<main에서 myfun호출전에 출력
5 4 <<myfun에서 출력
5 4 <<myfun호출된 후 main에서 출력
이렇게 출력된다는거지.. 영향을 받는다는 말이 무슨뜻인지 알겠지?
그렇다면 어떠한 함수를 호출하고 그결과를 다시 활용해보고싶다면.. 포인터를 쓰는편이 좋겠지?
그리고 call by reference로 호출당하는 함수로 작성할때.... 함수의 파라미터는 &를 붙여서 받는다는거
잊지말길바래... 저 &가 왜 붙었냐하면.. *의 반대로 생각하라고하면 될라나?
*로 넘어간건... &로 받아준다.. 그냥 이렇게 생각하면 대.. &a하면 a의 주소를 받아와라.. 머 이런의미야
반대로 *이 붙으면 이 주소로 가라 는 의미가 되고...
아까 포인터 선언시에는 *a로 선언한다는거 알지? 기억하고있겠지?
포인터를 우리가 사용할때는
a = 주소값 이렇게 사용을 하였어... 포인터로 선언된 변수는 주소값만을 가질 수 있다고했잖으니..
근데.. a가 가리키고있는 주소에 내가 직접 값을 넣고싶으면... *을 붙였지?
*a = 4; 이의미는 a가 가리키고 있는 주소에 4를 대입해라~ 라는 의미거든...
즉 *포인터변수명 은.. 그 포인터변수가 가리키는 주소로 가서 무엇을 해라라는 의미...
값을 읽든 쓰든 변경하든말이지..
*포인터변수 = 일반변수 처럼 생각하고 사용되어진다는말
자.. *이 빠져있으면 주소값만을 가지게된다.........
이게 포인트고.. ㅎㅎㅎㅎ
자 myfun(a,b)라고 호출을 해서 난 주소 값을 넘겨줬어...
그러면 받는쪽도 주소값을 받아와야하잖아?
그래서 int a가 아닌 int &a 로 받아오게 된거지.... int *a는 안되나 하고 궁금해하겠지만...
*a는 아까 말하기로... a가 가리키는 주소에 직접..가서.. 변수처럼 쓰이는거라고했지?
그러면 넘겨주는건 주소를 주는데 받는애는 일반 변수로 받아...
이러면 컴퓨터가 싫증내 ㅋㅋㅋㅋ 그니까.. 안대겠지? ㅋㅋㅋㅋㅋㅋ
주소값으로 받아줘야하므로 &를 붙인다.. ㅋㅋㅋㅋ 이상-
call by reference에 대해서만 설명했고... 3부에서 메모리 동적할당을 하도록 하겠습니다
