amplitude.init("2e2e5a386856efdf3237cf254a9d14d9"

[개념 콕] 값에 의한 호출과 참조에 의한 호출

내일배움캠프 수료생이 개발에 꼭 필요한 핵심 개념만 콕 집어 드립니다.
Jun 07, 2024
[개념 콕] 값에 의한 호출과 참조에 의한 호출
✍🏼
개발을 시작하시는 여러분, 정보가 너무 많고 배워야 할 것도 산더미라 어디서부터 시작해야 할지 막막하신가요? 내일배움캠프 수료생들이 4개월 동안 배운 엄선된 핵심 개념을 직접 정리해서 알려 드립니다. 공부하다 막히거나 헷갈리는 개념이 있다면 개념 콕으로 정리해보세요.
 
값에 의한 호출은 값 타입의 데이터를 복사하여 함수에 전달하므로 원본 데이터에 영향을 주지 않습니다. 반면, 참조에 의한 호출은 참조 타입의 데이터 주소를 함수에 전달하므로 원본 데이터를 직접 변경할 수 있습니다. 함수의 매개변수 타입에 따라 데이터가 스택과 힙 메모리에서 다뤄지는 방식이 달라집니다. 값 타입과 참조 타입의 차이, 그리고 스택과 힙 메모리의 동작 방식에 대해 알면서 어떤 방식으로 데이터의 타입을 나누는지, 해당 데이터는 어떤 방식으로 가져오는지 알게 되었습니다. 그럼 이를 바탕으로 어떤 경우에 함수 내부에서 값을 바꿨을 때 함수 밖에서도 값이 바뀌는지 알아보도록 합시다.
함수가 실행되면 스택에 해당 함수와 매개변수, 관련된 변수가 로드됩니다. 우린 여기서 ‘매개변수’에 주목할 필요가 있습니다. 전달된 매개변수가 원시 타입의 값이건, 참조 타입의 값이건 우선 스택 영역에 로드 되는데요. 즉 기존의 값이 있건 없건, 일단 새로운 값이 복사되어 메모리에 로드되는 것입니다. 이를 바탕으로 두 가지의 호출 방법을 알아봅시다.
 
 

값에 의한 호출(call by value)

원시 타입의 값이 스택에 존재하고 있다고 가정합시다. 이 값을 함수에 전달한다면 해당 값은 복사가 되어 함수에 전달되고 스택에 매개변수로 로드되어야 합니다. 즉 해당 값 그 자체가 복사되어 함수에 전달됩니다. 값이 직접 복사되어 호출되었기 때문에 값에 의한 호출이라고 부르는 것이죠.
notion image
 
 

참조에 의한 호출(call by reference)

앞서 참조 타입에 대해 설명하며, 참조 타입의 값은 스택에 주소값이 로드된다고 했습니다. 기본적으로 참조 타입 값 역시 함수에 전달되면 값에 의한 호출과 같이 변수가 복사되어 전달됩니다. 하지만 원시 타입의 값과 다른 점은 복사되는 값이 값 그 자체가 아닌 참조 주소라는 것입니다. 따라서 함수 내부에 새로운 값을 전달했다 하더라도 힙 메모리에서의 주소만 전달되는 것이기 때문에 결과적으로 함수 내부의 매개변수와 외부의 변수는 같은 값을 사용하고 있다는 말이죠. 결국 함수 내부와 외부는 같은 값을 사용 중이기 때문에 함수 내부에서 값을 변경하더라도 외부의 값이 변경되는 사태가 발생하는 것입니다!
notion image
이런 방식은 참조 주소만을 복사해 호출하기 때문에 참조에 의한 호출이라고 부릅니다. 또한 이를 얕은 복사라고 부릅니다.
 
 

한 걸음 더) List, Map은 안바뀌는데요?

Kotlin에서는 Int, Boolean, Float, Char와 같이 기본적인 원시 타입 값을 제외한 StringCollection 타입의 값들은 모두 참조 타입의 값이기 때문에 참조에 의한 호출이 발생하죠. 하지만 String 타입의 값은 타입의 경우 함수 내부에서 값을 변경해도 외부의 값이 변경되지 않습니다. 왜 그럴까요?
사실 이러한 타입의 값들은 모두 참조에 의한 호출로 불러올 수 있지만, Kotlin 내부에서 값에 의한 호출처럼 작동하도록 만들어졌기 때문에 내부의 값과 외부의 값이 서로 영향을 받지 않게 되는 것입니다.
그리고 Mutable이 붙지 않은 ListMap 같은 타입은 애초에 따로 값을 추가하거나 수정하는 게 불가능합니다. 즉, 함수 내부에서 수정할 수 없습니다. 만약 해당 값을 함수 내부에서 할당해 아예 다른 list로 대체하는 경우 새로운 주소에 리스트가 생성돼 전혀 다른 값이 되기 때문에 변경되지 않습니다.
 
 

내일배움캠프는 개발에 필요한 핵심만 배웁니다

지금까지 꼭 필요한 개발 지식에 대해 알아보았습니다. 내일배움캠프에서는 전문가들이 선별한 핵심 개발 지식으로 개발 공부도, 취업도 보다 효율적으로 할 수 있는데요. 국내 유수의 IT기업 출신 튜터님들과 실습 위주의 독보적인 커리큘럼으로 개발자 취업을 체계적으로 준비해보세요. 내일배움캠프 4개월, 여러분 인생의 가장 큰 터닝 포인트입니다.
 
 
CREDIT
글 | 배영수 내일배움캠프 수료생 편집 | 정효재 팀스파르타 에디터
 
 

취업 준비, 어디서부터 시작해야 할지 모르겠다면?

 
🧐비전공자인데 IT 업계 취업할 수 있을까?
😟프로젝트 경험이 부족한데, 어떻게 준비해야 할까?
🥺IT 기업으로 이직하고 싶은데 뭐부터 시작해야 할까?
 
이런 고민을 하고 있다면, 내일배움캠프의 IT 취업 컨설팅을 받아보세요.
취업 코칭 전문가들이 여러분의 고민을 해결해 드립니다.
 
다음 링크에 이메일을 입력하시면 메일로 1:1 커리어 상담권과 취준 자료집을 보내드릴게요.
 
Share article
Subscribe to our newsletter
RSSPowered by inblog