삽질의 현장/- C++

[삽잡이::C++] vector 삽질 일지

shovelman 2015. 8. 1. 11:31


안녕하세요 삽잡이 입니다.


이번 시간에는 간략하게 시행 착오들을 겪으며 삽질을 한....

지금 생각해보면 내가 이런 허접한 실수를 했단 말인가... 

하는 오류들을 정리해보려고 합니다.


물론... 가장 큰 목적은 

나의 삽질을 기억하고 다시는 이런 실수를 하지 않기 위해서입니다.



1. vector안에 NULL 이 들어 있다면?


말 그대로 입니다. 

간단하게(?) 도서 관리 프로그램을 구현하고 있었습니다. 매우 간단하게 말입니다...

미리 vector의 사이즈를 100으로 resize 해놓고 모두 0으로 초기화를 했습니다.  


왜냐, 원하는 인덱스 값에 데이터를 집어 넣으려고 한 이유죠...

기존 vector를 사용할 때 push_back 이나 insert 같은 경우에는 

데이터를 입력함으로써 vector의 사이즈가 유동적으로 변경될 수 있지만,

아에 100이라는 크기를 fix해두고 

0이라면 데이터가 들어있지 않은, 0이 외의 값은 데이터가 들어있는...

이와 같이 데이터의 유무를 판단하려 했습니다.


너무 쉽죠?? 

하지만... 인덱스 내부에 데이터가 들어있는지 확인하고 

있다면 반환해주는 기능을 구현했습니다.



주석과 같이 key값을 비교하는 부분에서 문제가 발생하고야 말았습니다.


이처럼, 하하...  왜 그 당시에는 생각이 안났는지...

시간이 쪼곰 지난후에 알겠더군요... 내가 이런 허접한 실수를...

뭘까요? 물론, "저렇게 코드를 보여줄 듯 말듯이 공개해놓고 내가 알 수 있겠냐 ㅡㅡ "

하실 수 있지만...


이유에 대해서 설명해드려보겠습니다...

벡터의 사이즈 100으로 재할당 했으며, 모두 0으로 데이터를 초기화 했습니다.


그런데, 생각해보겠습니다...

100개의 공간중 어느 인덱스에 데이터가 들어있을지 모릅니다.

즉, 위와 같이 for문을 돌리게 된다면, if문에서 조건을 비교할 때 에러가 발생합니다.


처음부터 데이터가 있다면 운이 좋게 한번은 if문을 통과할 수 있겠지만,

그 다음에 공간은 0 이라면?... 또 에러가 발생할 것입니다.

 


왜냐? 0은 NULL의 의미를 또한 가지고 있습니다.

즉, vector index에 0이라는 값이 들어있다는것은 즉, 내부가 NULL이라는 것이지요.


아무 존재하지 않는 개체 내부의 값에 접근을 하려고 하니

컴파일 시 문제는 없지만, 실행 시 프로그램이 터지게 되는 것이였습니다.


따라서 아래와 같은 수정을 했습니다.



간단하게, if문 내 조건이 temp... 

즉, 어떠한 값이 있다면 참으로 해당 조건문이 실행되게 말입니다.


이렇게 쉬운 것을... 하하... 부끄럽습니다



2. vector에 직접 접근하기


이번에도 위와 같이 비슷한 사태였는데 정말 부끄럽지만,

이 부끄러움을 공개하고 다시는 이와 같은 실수를 하지 않으리라! 다짐하며!



booklist 라는 vector 내부에 직접 접근을 하여

해당 위치에 데이터가 있다면, 해당 내부를 출력해주는 코드를 작성했습니다.


뭐... 조금만, 아주 조금만 째려보셔도 문제의 이유는 단방에 찾으실 수 있습니다.



이렇게 또 터져버렸습니다... 

'vector subscript out of range' 이 문구가 거슬려 이유를 찾아 떠나게 되었죠...


이 오류는 'vector 내 할당 되지 않은 index 에 접근하려고 하여 에러'를 나타내는 것이였습니다.

해당 되지 않은 index에 접근하려 했다고?? 뭐지?? 해서 째려봤는데...




하하...

초기 값은 0으로 시작해놓고 vector 위치는 0-1 즉 -1부터 찾고 있었습니다...

부끄럽군요 허허허...



아무튼... 막상 되돌아보면 뭐 이딴 거에 내 시간을 보냈나 생각할 수 있다만,

단순한 삽잡이는 그런 생각은 딱히 들지 않네요...


물론, 한번 경험했으니... 다시 또 그런다면 스스로에게 싸다구를... 날려야겠지만요

당시에는 뭐 그리 안보이는지... 허허허


뭐... 하지만... 배운건 있는거 같습니다!

아무튼... 의미 없는 삽질은 없다~!


이상 삽잡이였습니다.