본문으로 바로가기

03. 코딩과 디버깅에 관하여

 

3.4 디버깅과 테스팅

 

디버깅에 관하여

 디버거는 유용하지만, 프로그래밍 대회에서의 코드는 길지 않기 때문에 소스를 읽어 가며 검증하는 것이 가능하며 더 빠르다. 그러므로, 디버거 없이 프로그램의 버그를 찾아내는 연습을 해야 한다. ① 오동작하는 작은 입력을 먼저 찾아내면 디버깅하기 용이하다. ② 단정문 assertion 을 사용하여 내부 상태를 검증해본다. ③ 프로그램의 중산 계산 결과를 출력하여 검사한다.

프로그램이 런타임 오류를 내며 종료할 때 디버거가 용이할 것이다.

테스트에 관하여

스캐폴딩 이라는 유용한 테스트 기법이 있다. 임의의 작은 입력을 자동으로 생성해 프로그램을 돌려 보고, 그 답안을 검증하는 프로그램을 짜는 것이 스캐폴딩이다. 내 코드와 비교할 대상이 없다면, 작은 입력에서만 동작하는 더 느리지만 단순한 알고리즘을 사용해 답을 검증하면 된다.


3.5 변수 범위의 이해

산술 오버플로

 어떤 식의 계산 값이 반환되는 자료형의 표현 가능한 범위를 벗어나는 경우이다. 대부분의 프로그래밍 언어들은 연산 과정에서 오버플로가 나더라도 경고를 해주지 않기에 위험하다. 자료형에 비해 너무 큰 결과 값이나 연산 과정 중 너무 큰 중간 값에 의한 오버플로들은 코드의 논리를 보는 것만으로는 찾아내기 힘들다. 너무 큰 무한대 값을 설정하였을 때도 발생할 수 있는데 int 형에서 2^31 - 1 같은 너무 큰 값을 썼을 때 발생한다.

오버플로가 나지 않을 크기의 값을 선택하는 것이 좋습니다. 저는 987,654,321 을 사용합니다.

오버플로 피해가기

1. 더 큰 자료형을 사용한다.

2. 연산의 순서를 바꾼다.

3. 점화식을 이용하여 연산을 변형한다.

자료형의 프로모션

이항 연산자들은 두 개의 피연산자를 받는데, 만약 피연산자의 자료형이 다르거나 자료형의 범위가 너무 작은 경우 컴파일러들은 이들을 같은 자료형으로 변환하여 계산하는데 이를 프로모션 이라고 한다. C++ 은 아래와 같은 프로모션 규칙들이 적용된다.

1. 정수형 / 실수형 : 정수형이 실수형으로 변환

2. 양쪽 다 정수형 혹은 양쪽 다 실수형 : 보다 넓은 범위를 갖는 자료형으로 변환

3. 양쪽 다 int 형 보다 작은 정수형 : 양쪽 다 int 형으로 변환

4. unsigned signed : 부호 없는 unsigned 로 변환

$$(signed -2) + (unsigned 0) = 4,294,967,294$$

unsigned 는 양수만 가능하기 때문에 -2 를 unsigned 로 변형하며 나타난 오류이다. 이러한 오류는 계산과정 속에 숨어있기 때문에 찾기 어렵다.


3.6 실수 자료형의 이해

 

반응형