티스토리 뷰

오늘은 inout 파라미터에 대해 알아보겠습니다!

inout 파라미터를 알아보기 전에 먼저 알아야 할 것이 있습니다!

값 타입, 참조타입, 메모리인데요! 간단하게 살펴보고 inout 파라미터에 대해 살펴보겠습니다!

혹시 구조체는 값 타입, 클래스는 참조타입 들어보셨나요? 너무나 유명한 얘기죠 ..

그렇다면 값 타입은 무엇이고 참조 타입은 무엇일까요?
그 전에 메모리의 구조에 대해서 간단하게 살펴보겠습니다!

 

메모리는 코드, 데이터, 힙, 스택 총 4개의 구역으로 나누어 사용합니다!!

  • 코드(프로그램)에는 앱의 모든 코드가 존재합니다.
  • 데이터전역변수 / 타입(static/class)변수가 존재하며 앱이 실행되는 동안 불변합니다.
  • 동적할당을 위한 영역이며 크기가 크고, 개발자가 잘 관리할 필요가 있는 데이터가 존재합니다.
  • 스택함수실행을 위한 임시적 공간이며 크기가 작고 빠르게 사용하기 위한 데이터가 존재합니다.

 

그렇다면 작성한 코드가 어떻게 메모리에 들어가게 될까요?

나의 나이와 친구 나이를 구하는 간단한 함수를 만들어 보았습니다.

위의 작성한 코드는 메모리 영역 중 코드에 해당합니다! 따라서 그림으로 살펴보면 아래와 같이 들어갈 것입니다.

모든 코드가 코드영역에 올라가게 되면 순차적으로 한줄씩 실행됩니다.

그렇다면 코드는 어떻게 작동 될까요?

코드가 실행됨에 따라 스택에 쌓이고 메모리 공간을 가지게 됩니다. (스택 영역은 높은 메모리 주소부터 할당을 받습니다.)

함수가 종료되면 저장된 메모리도 해제됩니다! (임시 메모리 영역)

아래 그림을 참고해주세요 . . .

그렇다면 값 타입과 참조 타입이 대체 무엇일까요?

이 부분은 사실 구조체와 클래스에서 뚜렷한 차이가 있는데요 이 부분은 나중에 포스팅할게요!

값 타입은 값을 다른 공간에 새롭게 복사해서, 복사된 인자를 전달합니다. 즉 원래의 값은 변하지 않습니다.
참조 타입은 데이터를 전달할 때 값의 메모리 위치(주소)를 전달합니다.

지금은 이렇게 간단하게 살펴보고 넘어가겠습니다!

그렇다면 왜 값타입과 참조타입을 알아본 것일까요?

함수에서 사용하는 파라미터들은 값타입이기 때문인데요!!!!

num1과 num2를 스왑하는 함수를 만들어보았습니다.

하지만 너무나 당연하게도 위와 같은 에러가 발생합니다.

그 이유를 살펴보면 함수의 파라미터는 값타입이기 때문에 값을 복사되어서 사용하기때문에 직접적인 변경이 불가능하기 때문인데요.

즉 원래의 값을 변경하는 것 자체가 불가능한 것이죠!

그렇다면 어떻게 변수를 직접 스왑할 수 있을까요?

inout 파라미터

inout 파라미터는 참조로 전달합니다. (매우 중요!)

아까 참조타입은 메모리 주소를 전달한다고 했는데 기억하시나요?!

inout 키워드를 사용한다면 파라미터 a가 let a 복사해서 전달하는 것이 아니라 기존의 변수 num1의 메모리 주소값을 사용하기 때문에 변경 가능합니다!

즉 inout 키워드를 사용함으로 num1의 메모리 공간을 직접적으로 사용가능하게 됩니다.

위와 같이 스왑해서 잘 나오게 됩니다!

쫌 신기하더라구요 ..

inout 키워드를 사용할 때 주의할 점이 있습니다

  • 앰퍼샌드(&) 기호를 붙여야 한다.
  • 상수 및 리터럴은 수정이 불가능하므로 인수로 전달할 수 없다.


함수와 메모리를 관련지어 야무지게 포스팅을 해보려고 했는데 . . 의도치 않게 inout 파라미터를 알아보았네요 . .

inout 파라미터를 공부하면서 값 타입, 참조타입, 메모리에 대해 자세히 알 수 있게 되어서 좋았습니다.. !!

지금까지 inout 파라미터에 대해 알아보았습니다. . 다음에는 더 좋은 글로 찾아 뵙겠습니다 . . .. . . .

'Swift 문법 정리 - iOS' 카테고리의 다른 글

[Swift] switch문 안에 조건 (where절)  (2) 2022.04.12
[Swift] 랜덤함수  (0) 2021.09.26
[Swift] assert? guard?  (0) 2021.08.24
[Swift] 클로저  (0) 2021.08.03
[Swift] 클래스 VS 구조체 / 열거형  (0) 2021.08.02
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함