학습내용
포인터와 레퍼런스
도전실습
//포인터나 레퍼런스를 두 수의 값을 교환하는 함수 만들기
//void SwapByPointer(int pA, int pB);
//void SwapByReference(int& refA, int& refB);
강의 내용을 바탕으로 포인터와 레퍼런스를 이용하여 두 값을 교환하는 함수 만들기를 진행하였다.


메인함수 이전에 만들어 두어서 작동가능한 상태로 구현해놓았고

최종적으로 메인함수에서 값을 입력받아서 함수를 호출하게끔 구현을 해놓았다. 과제를 수행하면서 잘못된 입력을 받았을때를 대비하여 개인적인생각대로 예외처리를 구현을 해놓았는데 프로그램을 실행시켜보니 의도와 전혀다른 동작이 일어났다. 원래구현대로라면 잘못된 입력이 들어왔을때 함수호출까지 가서 잘못된 입력이다 라는것을 호출하게끔 구현을 해놓았으나 실상 프로그램을 실행시켜보니 잘못된입력을 하자마자 프로그램이 종료된다. 해당이유가 궁금해서 찾아보았는데, c++에서 cin 으로 잘못된 값을 입력받았을시, ex) int형인데 char형입력 cin에서 받고있는 자료형에서 벗어난 값을 입력할경우 cin이 fasle 를 반환시키면서 모든 프로그램의 동작이 멈추는것을 알 수 있었다. 실제로 중단점을 찍고 실행을 시켜본 결과

첫번째로 입력받는 값이 a인데 0 즉 false 를 반환하고 바로 동작이 멈춰버리는것을 확인 할 수 있었다. 이를 해결하기위해 구글링을 해본 결과,

해당내용을 알 수 있었는데 정리하자면, 잘못된 입력을 할시에 false 를 반환한 다음 그 잘못된 입력이 cin 입력버퍼에 그대로 남아있다는 것이다. 따라서 잘못된 입력을 받은다음 재입력을 시키는 동작을 하고 싶으면 입력버퍼를 지우고 다시 입력을 받는 동작을 무한 반복하게끔 해줘야 한다라는 사실을 깨달았다.
cin false 는 cin.clear() 함수로 오류플래그를 초기화 시켜서 다시 동작을 진행시킬 수 있고
그런 다음에 입력버퍼에 남아있는 잘못된 입력을 지워주어야 하는데
cin.ignore()라는 함수를 이용하면된다. 매개변수로 cin.ignore( n, delim) 해당값들을 받아오는데 n은 무시할 문자의수이며 ,delim 은 무시를 중단할 종료문자를 받는다. 하지만cin에서 입력을 받는값은 매번다를 수 있기때문에 정해놓고 무시를 하는것보단 입력받아온 값의 끝까지 검사를 한후 잘못된입력이 있으면 버릴 수 있게동작해야한다 때문에 좀 더 찾아본결과 전처리기로 limits 를 추가하게되면 numeric_limits::max() 를 사용 할 수 있게되는데 이것은 받아온 입력의 끝까지 크기를 나타낸것이다 그리고 입력받은 부분의 끝은 항상 개행이므로, delim에 '\n' 을 넣어주게 되면 문장전체를 검사하고 잘못된 입력처리를 할 수 있게되는것이다. 따라서, 
이렇게 코드를 변경해주었는데 눈에 띄는부분이있다 a와 b를 입력받는 입력받는 구조이기때문에 변수만 다를분 동작 자체는 똑같다 전시간에 배웠던 함수를 쓰는이유가 생각나 해당 부분을 함수로 만들어주기로했다.

checkint에서는 정수인지 아닌지만 구별하면 되기때문에 조건을 두개로 구현해주었다.

trigger에선 1또는 2만 와야함으로 조건을 추가해서 구현해주었다

최종적으로 구현한모습이다. 이로써 발생할 수 있는 예외는 전부 처리했다고 생각한다 또 문제가 생기면 고쳐봐야겠다. 결과적으로 오늘은 cin의 시스템을 이해하고 잘못된 입력을 받았을시 프로그램을 종료시키는것이아닌 이어서 동작하는 방법을 터득했다.