본문 바로가기

내가 꾸는 꿈

포인터 #2 [노베이스 게임개발 16일차]

반응형

지난 시간에 배웠던 포인터를 더 잘 익히기 위해 연습문제를 풀어보았다.

 

*사용자로부터 입력을 받아 두 수를 덧셈하는 프로그램을 만드세요. 덧셈을 할 때 원본변수를 만들고 포인터 데이터 타입을 이용해 숫자를 조작하세요.

 

문제를 보고 어떤 식으로 해야 할지 모르겠어서 일단 강의를 보며 포인터에 익숙해 지기로 하고 강의를 따라가 보았다.

 

 

먼저 두 원본 변수인 a, b를 만들고 두 값을 더한 결과인 result 또한 만들어 주었다.

 

그리고 값을 입력받을 함수를 헤더파일에 선언 후 소스파일에 getInt 함수를 통해 값을 입력받을 준비를 했다.

 

포인터 데이터 타입인 pa, pb, presult를 만든 후 각각에 원본변수의 주소값을 넣어준다. (p는 포인터의 p이다.)

이렇게 되면 pa, pb, presult는 참조변수가 되어 각각 원본변수를 참조하고 있는 상태이다.

 

 

그 후 실제 값을 조작하기 위해서는 애스터리스크 * 를 각 참조변수 앞에 붙여 직접적으로 조작하면 된다.

 

그런 다음 pa와 pb에 값을 입력받아 실제값을 조작한 후 그 둘을 더하면 실제로는 직접적인 조작을 하지 않은 원본변수를 출력하지만 값은 그 a와 b의 값 그 둘을 더한 result값이 출력되게 된다.

 

실제로 완전히 이해되지는 않지만 계속해서 진행한 후 다시 돌아와서 이해해 보려고 한다.

 

이번엔 스스로 문제를 풀어보았다.

 

*사용자로부터 입력을 받아 두 수의 사칙연산을 하는 프로그램을 만드세요. 사칙연산을 할 때 원본 변수를 만들고 포인터 데이터 타입을 이용해 숫자를 조작하세요.

 

이전시간에 배웠던 문자열을 입력하는 방식을 복습하며 포인터를 적용시켜 문제를 풀어보았다.

 

이번에 사용했던 포인터처럼 문자열을 입력할 char 또한 애스터리스크를 넣어 포인터 데이터 타입으로 만든 후 

원본변수인 cal의 주소를 조작할 수 있게 만들었다.

그 후 원본변수들을 이용하여 사칙연산의 계산과 출력을 할 수 있게 만들었다.

 

하지만 결괏값에 오류가 생겼고 나는 입력과정에서 지난 시간에 만들었던 getInt함수를 고쳐야 한다는 걸 깨달았다.

getInt() 함수는 정수형 타입이므로 문자열을 위한 새로운 입력함수를 만들어야 했다.

 

다음과 같이 char를 입력하는 함수를 만든 후 다시 실행해 보니

프로그램이 정상적으로 작동되는 모습이다.

 

그런데 왜 포인터를 써가며 간단하게 만들 수 있는 문장들을 어렵게 꼬아놓은 걸까?

 

포인터는 여러 가지 경우로 사용될 수 있지만 몇 가지 예를 들어보면

두 변수의 값을 서로 교체해야 하는 경우가 있을 수 있다.

이를 스왑이라고 하는데 이를 이용하려 할 때 포인터를 사용하지 않으면 함수를 사용할 수 없게 된다.

 

그림에서 v1과 v2의 값을 서로 바꾸려면 임시로 temp라는 변수를 이용하면 되는데

v1의 값을 temp에 저장해 놓은 후 v1에 v2의 값을 저장한다.

그다음 v2에 temp에 저장되어 있는 초기 v1의 값을 저장하면 두 값이 바뀌게 된다.

 

이것을 스왑이라고 하는데 이를 함수로 만들 수 있다.

void는 return이 필요 없는 타입이고 방금 사용했던 스왑을 그림과 같이 함수로 만든 후 15번처럼 v1, v2를 넣어주면 함수는 완성이다.

하지만 실제로 이 함수는 실행되지 않는다.

 

왜냐하면 v1, v2가 swap함수의 a와 b로 새로운 변수가 만들어지기 때문이다.

다시 말하면 swap함수의 a에 v1이 들어간다기보다는 v1과 a는 값만 같고 서로 다른 변수가 된다.

그렇기 때문에 실제로 v1과 v2 변수의 값은 그대로 유지가 되기 때문에 값이 바뀌지 않는다.

 

포인터를 사용하면 이를 해결할 수 있다.

 

먼저 swap함수의 파라미터에 애스터리스크를 붙여서 주소값을 받아오게 된다.

그러면 이 파라미터에 int타입의 주소값이 들어와야 한다.

그래서 main함수에서 swap함수를 실행할 때 &를 넣어 주소값으로 집어넣게 되면 간접적으로 주소값을 조작할 수 있다.

파라미터 a에 v1의 주소값이 들어가면 주소값을 간접적으로 변경하여 값을 바꿀 수 있게 된다.

 

변수 앞에 &를 붙이게 되면 함수 밖에 있는 값을 조작할 수 있게 된다.

 

 

 

후기:

더 심도 깊은 프로그램을 작성하기 위해서는 포인터가 꼭 필요할 것 같다. 다시 꾸준히 공부를 시작해야겠다.

 

 

 

*본 포스팅은 학생의 입장에서 쓴 글로 정확하지 않을 수 있으며 댓글로 피드백해 주시면 감사하겠습니다.

클래스 101 개발자 라라 님의 강의를 통해 학습한 내용을 기반으로 두고 있습니다.

반응형