← 기록 / Miscellaneous

오답노트

알게 모르게 정말 추상화란 강력한 힘을 부여한다. 특히 컴퓨터의 경우 low level에서는 트랜지스터가 작동하고 있다는 사실을 알아채기 정말 어렵다. 그리고 low level은 다 챙기기엔 귀찮기도 하고 개발하기에 시간도 많이 소요되고..

이 글의 목차
  1. Low level
  2. 내실을 다지자

Low level

알게 모르게 정말 추상화란 강력한 힘을 부여한다. 특히 컴퓨터의 경우 low level에서는 트랜지스터가 작동하고 있다는 사실을 알아채기 정말 어렵다. 그리고 low level은 다 챙기기엔 귀찮기도 하고 개발하기에 시간도 많이 소요되고..

나도 javascript와 같이 효율적으로 구현하는 high level의 개발을 선호하는 편이지만, low level까지 알지 못한다면 가끔씩 이해하기 어려운 문제를 발견했을 때 쉽게 눈치채기 어렵다.

오늘 저지른 실수 한가지를 공유해본다.

for (unsigned int i = 0; i <= 0xFFFFFFFFU; ++i) {
    validation(i);
}

위 로직은 작성자가 의도한 바에 따르면 0 에서 0xFFFFFFFFU 까지 루프를 돌고 종료될 것이다. 과연 그럴까?

문제가 되는 지점은 0xFFFFFFFFU 다음의 숫자이다. 0xFFFFFFFFU 다음의 숫자가 무엇일까? 여기서 아차 싶었다. 나도 모르게 for 문을 추상화 해서 생각하고 있었던 것. 사실 위 로직은 i 라는 변수를 지속적으로 업데이트 하면서 비교를 하고 있을 따름이다.

overflow가 일어나기 때문에 0xFFFFFFFFU + 1U = 0 이다. 즉, 위 루프는 얼핏 보면 약 42억번 동작할 것 같지만, 무한루프에 빠진다. 잠시나마 골머리 썩혔던 문제고, 알고나면 별 문제 아닌데, 알고나면 김샌다. 이런 일 없도록 low level의 공부를 게을리 해서는 안될 거 같다.

내실을 다지자

상위 알고리즘을 푼다고 해서 자동적으로 모든 알고리즘을 아는 것은 아니다. 최근에도 MST 라는 것의 개념을 처음 접했고(이름은 들어봤다 했을지라도), 그래프에서의 cycle을 어떻게 쉽게 판정하는지도 알게 됐다. Union Find의 첫 활용 예를 알게 됐다고 해야하나.. 개발을 좋아하기 때문에 구현 문제에 강한 느낌인데 이것 말고도 다 잘해야 한다. 그것이 프로니까.. (오글오글)