비주얼 베이직으로 프로그램 개발하는데...
매우 난감한 상황이 발생한다.

비주엘 베이직에서는, 대부분의 프로그래밍 언어가 그렇듯, 값을 전달할 때 참조에 의해 전달하는 것과 값 자체로 전달하는 두가지 방법을 사용할 수 있다.

문제는, 그럼에도 불구하고 "포인터"라는 개념이 없다는 것이다.

그 결과, = 연산자를 사용할 때, 이게 도대체 값으로 넘어가는건지 주소로 넘어가는건지 알 수 없게 되어 버리는 경우가 많다.
그리고 당연히 메모리 참조 오류가 발생하게 된다.

답답하다. -_-

그 다음으로 답답한건 배열의 선언과 사용이다.
배열은 다음과 같이 선언한다.
dim arr(10) as integer
자, 질문이다. 위와 같이 선언하면 사용할 수 있는 배열의 크기는 모두 몇칸일까?
정답은 "11"칸이다. 인덱스가 0부터 10까지 갈 수 있다. 내가 C에 익숙해서 그런건지는 모르겠지만, 저 사소한 차이가 개발에 아주 큰 어려움을 주고 있다. 대체 0부터 어디까지 세야 하는건지 쓸 때마다 헷갈린다.
딱 10개만 쓰고 싶으면 그냥 1부터 시작해서 쓰라고 "책"에는 나와 있지만, 숫자는 0부터 시작하는 것이 정석이다. -_-

생각해보니, 내가 만든 배열이야 0부터 쓰든 1부터 쓰든 문제가 없지만, 남이 쓴거 가져다 쓸 때는 골치아파지는 문제가 생길 수도 있다. 그 사람이 1부터 시작했는데 내가 0부터 시작하기로 한다거나, 그 사람이 9까지 쓰기로 했는데 내가 10까지 쓰기로 한다거나 하면 엉뚱한 값이 들어와 버릴 수도 있다. 즉, 애초에 0부터 10까지 11칸을 쓰기로 하는 것이 가장 정확하다는 뜻이다.

MS에서...C랑 다른 무언가를 만들려고 하다가 좀 삽질한 듯 싶다.

셋째로...
조건절 평가할 때 전부 다 계산해보고 한다. 이건 단점인지 장점인지 모르겠지만 불편하다. 예를들어
if Not (objData is nothing) and objData.someFlag then
    someFunction(objData)
end if

이렇게 쓰면 objData가 nothing(이라고 쓰고 Null이라고 읽는다) 인 경우에는 오류가 발생한다. 왜냐하면 objData.someFlag는 아직 정의되지도 않은 객체의 속성이기 때문에 객체 참조 오류가 나오는 것이다. 하지만 이미 objData가 nothing이라는 조건이 만족되었기 때문에 그냥 넘어가면 안되는 걸까? 끝까지 평가를 다 해봐야 아나...그것도 and로 이어진 조건들인데. 똑똑하지 못한 것 같다.

*추가 : and 대신에 andAlso 연산자를 쓰면 앞에서 조건이 만족되면 뒤쪽은 계산하지 않는다.
by snowall 2009. 7. 24. 22:27