본문 바로가기

CS

값에 의한 호출 & 주소에 의한 호출 & 참조에 의한 호출

값 타입과 참조 타입의 종류

1) 값 형식과 참조 형식

값,주소,참조에 의한 호출에 대해 알아보기에 앞서 값 형식과 참조 형식에 대한 이해가 필요하다.

값/참조 형식의 차이를 이해하기 위해서는 스택과 의 이해가 필요한데 윈도우 프로그램은 기본적으로 하나의 스레드를 갖는다. 그리고 개별 스레드마다 전용으로 사용할 수 있는 저장소가 메모리에 할당되는데 이 영역을 스택이라고 한다. 반대로 힙은 프로그램의 필요에 의해, 메모리를 요청할 때 사용할 수 있는 저장소다. 수업에서 배운 바와 같이 힙에 메모리를 할당하는 것은 개발자가 명시적으로 요청한 것이므로 스택의 메모리를 할당하고 해제하는 것과는 다르게 해제하는 과정이 별도로 필요하다.
이러한 개념을 바탕으로 값 형식의 변수는 값 자체가 스택 영역에 할당되고 변수는 그 메모리를 가리키는 것을 의미한다. 또한 해당 변수가 실제 값을 보유하고 있는 데이터 형식으로 이러한 형식의 변수는 변수 자체에 직접적으로 값을 저장하며 변수가 다른 변수에 할당될 때 해당 값이 복사된다.
값 형식은 정수, 부동 소수점, 구조체, 열거형 등이 예시가 될 수 있다.
참조 형식을 가리키는 변수는 변수 값을 담기 위해 힙 영역을 추가로 할당한 다음 스택에서 그 힙의 주소를 가리킨다. 즉 메모리 위치를 참조하고 있는 데이터 형식을 나타내는 것으로 이러한 형식의 변수는 변수가 다른 변수에 할당될 때 해당 메모리의 위치가 복사된다. c++에서는 포인터와 참조자가 그 예시가 된다.
그리고 값 형식이 스택에 할당된다고 하여 참조 형식이 힙에만 할당된다는 뜻은 아니며 참조 형식의 변수는 스택 또는 힙에 저장될 수 있다.

 

 

2) call by value, call by address, call by reference

단순한 비교. 그러나 근본적 차이가 존재한다.


프로그램에서 함수를 호출할 때 매개변수의 종류에 따라 호출 방식을 분류할 수 있다 .
먼저 값에 의한 호출은 코드에서 넘겨주는 인자 값이 함수의 매개 변수에 복사되어 전달된다. 이는 값을 전달한다는 개념으로 매개변수에 복사된 값이 스택에 생성되고 함수 실행후 스택에서 사라지고 함수 안에서 일어난 변화는 원본 값에 영향을 미치지 않는다.
매개 변수에 들어간 인자 값은 원본이 아니라 복사되어 들어간 것이며 매개변수들을 담은 공간과 실제 변수의 공간은 다른 메모리 주소를 가지기 때문에 결과적으로 함수 내에서 생긴 변화는 밖의 데이터에 영향을 주지 못한다.

그러나 주소에 의한 호출참조에 의한 호출의 경우는 값에 의한 호출과는 달리 매개 변수에 들어가는 인자값이 값의 복사물이 아니라 값에 해당하는 메모리 주소가 들어가기 때문에 변수의 메모리 주소를 통한 접근으로 원본의 수정이 가능해진다. 또한 값을 복사하는 값에 의한 호출과는 다르게 값을 복사하는 시간 소모가 없다.
여기서 주소에 의한 호출과 참조에 의한 호출은 메모리 주소를 통한 원본으로의 접근이라는 같은 원리를 공유하지만 주소에 의한 호출은 포인터를 통해 주소에 대한 역참조로 메모리 주소에 접근한다는 것과 기존 변수에 대한 별칭인 참조자를 통해 접근한다는 차이가 존재한다.

참조자는 변수 앞에 & 기호를 사용하여 선언되고 참조자는 선언된 변수와 동일한 메모리 위치를 가리키기 때문에 변수와 참조자 모두 같은 값을 가리킨다. 따라서 참조자를 통해 변수의 값을 변경하면 해당 변수의 값도 변경된다.
또한 참조자는 선언될 때 반드시 다른 변수로 초기화되어야 하고 초기화 후에는 참조자가 참조하는 변수를 변경할 수 있지만 다른 변수를 참조할 수 없다는 특징을 갖고 있다.
마지막으로 참조자는 null로 초기화될 수 없으며 항상 유효한 메모리 위치를 참조해야한다.

'CS' 카테고리의 다른 글

비트연산자  (0) 2023.10.27
오버플로우와 언더플로우  (0) 2023.10.26
부동소수점의 의미와 표현  (0) 2023.10.25
이진법과 2의 보수  (0) 2023.10.25