본문 바로가기

C

[2] 인수와 포인터

728x90

아마 공부를 하면서도 어렵고 복잡한 내용을 공부하다 보면 내가 왜 이걸 해야 하지?라는 의문이 모두들 한 번씩을 들었을 거라고 생각합니다.

 

어디에 어떻게 어떤 상황에 쓰이는지를 아는 것은 내가 이것을 배워야 할 강한 동기가 되기도 하죠.

 

포인터에도 수많은 활용방법이 있겠지만, 이번에는 함수와 연관 지어서 생각해 보겠습니다.

 

만약 포인터를 쓰지 않고 두 변수안에 들어있는 값을 바꿔주는 함수를 만든다고 하면, 어떻게 만들 수 있을까요?

아마 굉장히 복잡하고, 쉽게는 만들 수 없을 것 같습니다.

왜냐하면, 인수를 전달해서 함수 내부에서 값을 바꿔도 함수 밖의 원래 변수에는 영향을 미치지 못합니다. 인수를 전달할 때 값을 직접 전달하는 게 아니라 복사된 값을 전달하기 때문입니다. 이런 전달 방식을 "값 전달"이라고 합니다.

<일반 함수로 값 교환>

실제로 함수 내부에서는 값이 바뀌었는데 밖으로 나왔을 때는 다시 원래 상태인 모습입니다. 사실 원래 값은 애초에 바뀌지 않았습니다. 위에서 설명했듯이 함수에는 복사된 값이 들어가 처리가 진행됐기 때문입니다.

 

<포인터를 사용해서 값교환>

하지만 포인터로 "메모리 주소에 있는 값"에 직접 접근하면 간단하게 두 수를 교환하는 유용한 함수를 만들 수 있습니다.

주의할 점은 함수에 인수를 전달할 때 매개변수포인터 변수이므로 &(어드레스 연산자)을 붙여 "주소 값"을 전달해야 합니다.

 

실제로 함수 안에서의 값뿐만 아니라 함수 바깥의 변수에도 직접 영향을 줘서 바뀐 것을 알 수 있습니다.

이것은 포인터를 통해 주소에 있는 값을 직접 바꿨기 때문입니다. 이렇게 주소를 전달하는 방식을 가리켜 "참조 전달"이라고 합니다.

 

이렇게 포인터의 효용성을 알아봄으로써 왜 포인터를 써야 하는가에 대한 답의 일부를 알아보았습니다. 이 책에서 앞으로 설명할 내용들 외에도 여러 가지 장점이 있겠지만, 차근차근 궁금증들을 해결하며 알아가 보도록 하겠습니다.

 

const

이번에는 포인터 선언 시 타입 앞에 const를 붙이는 것을 잠깐 보도록 하겠습니다.

const 키워드를 사용한 변수에 값을 대입하고 나면 다시는 바꿀 수 없습니다.

 

왜 const를 사용할까?

그렇다면 왜 const를 사용해야 할까요? 얼핏 보면 그냥 값을 안 바꾸면 그만인데 굳이 번거롭게 사용하는 이유가 궁금합니다.

그 이유는 바로 실수나 오류를 방지하기 위해서입니다. 사실 모든 const키워드는 오류를 방지하기 위해 사용합니다.

 

물론 사용하지 않고 짤 수 있다면 상관이 없습니다. 하지만 사람을 실수를 하기 마련이고, 코드가 1000줄, 10000줄 이상이 넘어가면 무조건 실수하지 않는다고 장담할 수 없을 것입니다. 또, 같이 협업을 하다 보면 동료가 어떤 생각을 가지고 짰는지 속을 들여다볼 수 없기 때문에 의도를 잘못 파악해 실수를 할 수도 있죠.

만약 절대 바뀌면 안 되는 고객의 ID 같은 데이터를 처리하다가 실수로 바꾸기라도 하는 코드를 짜게 되면 큰일이 날 것입니다.

이런 오류를 미연에 방지하고, 자신을 포함해 협업하는 동료들에게도 바꾸면 안되는 값이라는 것을 명시해주기 위해 const를 사용합니다.

 

<const 키워드를 사용한 포인터 코드>

const가 아닌 값을 바꾸면 잘 바뀝니다.

 

하지만 const로 지정된 변수의 값을 바꾸려고 하면 아래 예시처럼 오류가 발생해서 바꾸는 것을 막습니다.

지금은 간단한 예시를 들었지만, 변수가 많아지고 코드가 길고 복잡해지면 이렇게 const 선언을 통해서 바꾸면 안되는 값을 실수로 바꾸는 것을 방지할 수 있습니다.

옛날에 배울 때는 왜 필요한지도 모르고 배웠어서 필요성이 별로 느껴지지 않았던 부분이었는데, 이제 보니 굉장히 유용한 도구라고 생각되지 않나요?ㅎㅎㅎ

 

 

이상으로 칠판 하나 설명을 마치도록 하겠습니다.

728x90

'C' 카테고리의 다른 글

[5] 함수와 배열인수  (0) 2021.04.23
[4] 이중 포인터(포인터의 포인터)  (0) 2021.04.23
[3] 배열과 포인터의 관계  (0) 2021.04.22
[1] 포인터  (0) 2021.04.21
[0] C언어를 시작하며  (0) 2021.04.21