컬렉션 사용할 때 주의할 점

비주얼베이직 닷넷으로 프로그래밍할 때 컬렉션을  사용하면 간편하게 개체 집합을 다룰 수 있다. 컬렉션을 주로 For Each…Next 문과 함께 사용하게 되는데, 다음의 내용을 주의해야 한다.

  • 컬렉션 수정 불가. GetEnumerator에서 반환된 열거자 개체를 사용하여 요소를 추가하거나 삭제하거나 바꾸거나 다시 정렬하여 컬렉션을 변경할 수는 없다. For EachNext 루프를 시작한 다음 컬렉션을 변경하면 열거자 개체는 유효하지 않게 되고, 다음에 요소에 액세스하려고 하면InvalidOperationException 예외가 발생한다.
  • 컬렉션 요소 수정 불가. 열거자 개체의 Current 속성은 ReadOnly(Visual Basic)이며 각 컬렉션 요소의 로컬 복사본을 반환한다. 이것은 For EachNext 루프에서 요소 자체를 수정할 수 없음을 의미한다. 모든 수정 내용은 Current의 로컬 복사본에만 영향을 주며 내부 컬렉션에 반영되지는 않는다.(중요!)  그러나 요소가 참조 형식인 경우에는 요소가 가리키는 인스턴스의 멤버를 수정할 수 있다. 다음은 이에 대한 예이다.

아래는 안되는 코드

‘그래서 수정한 코드 = 되는 코드

한글 텍스트 파일 읽기

한글 텍스트 파일을 읽기 위해서는 인코딩을 다음과 같이 지정해 주어야 한다.

List와 Dictionary 클래스

.NET Framework v1.1이하에서는 ArrayList와 HashTable을 이용하여 콜렉션을 관리하였다.

ArrayList는 항목이 중복될 수 있는 콜렉션을 관리하며 추가된 순서(인덱스)가 중요한 관리대상이다. 예를 들어 벽체의 구성은 벽돌, 단열재, 방습층, 벽돌 등과 같이 중복되는 재료가 있는 경우이기 때문에 ArrayList를 사용하는 것이 좋다.

HashTable은 항목이 중복될 수 없는 콜렉션을 관리하며 중복되지 않는 키(key)가 중요한 관리대상이다. 예를 들어, 건축재료 전체 목록을 관리하고자 한다면 이름을 키(key)로하여 각 재료의 물성치를 관리할 수 있다.

이 둘을 안전하게 사용하려면 자료형(data type)을 항상 검토하여야 한다.

저장할 자료형을 정하여, 이와 다를 경우 코딩시부터 오류를 발생시키도록 강력한 자료형검토를 보장하는 클래스가 v2.0에서 추가되었다.

Generic.ListGeneric.Dictionary가 바로 새로 추가된 클래스들이다.

———

*주의 : .NET Framework v2.0에 Generic이 추가된 것임. 기존의 ArrayList와 HashTable은 계속사용할 수 있음

Main프로시저로 윈도우 프로그램을 실행시키기

윈도우 프로그래밍에서는 폼을 이용하여 창(윈도우)을 만들어 화면에 보여준다.

시작 폼(form) 없이 윈도우프로그램을 실행시키려면 다음과 같이 하면 된다.

1. 모듈에 Main 프로시저를 정의한다.

2. 방법1 :폼의 메소드를 활용하기

3.방법2 : Application.Run 이용

이 방법으로 윈도우프로그램을 실행시킨 경우, 종료하려면 다음과 같은 메소드를 사용한다.
프로그램을 끝낼 때는 Application.Exit()를 호출한다.

문자열을 읽어서 단어로 나누어 주는 함수 짜기

입력받은 문자열을 쉼표와 빈칸에 따라 단어를 나누어 준다.

여기서 3)과 5)가 많이 비슷하고 중복된 것으로 느낄 것이다.
그래서 어느 한 쪽을 지워버리면 어떤 일이 생길까?
시간이 되시면 한 번씩 해보면 좋을 것 같다.
결론부터 말하자면, 빈 문자열도 하나의 단어처럼 취급될 수 있다.
즉, 원하는 결과를 제대로 얻을 수 없다.

[사용법]

XML 주석활용하기-내가 짠 함수에 대한 설명이 보이게

프로그램 작성시 중요한 것 중의 하나가 주석을 적절하게 다는 것이다.
이제 주석 처리가 VB.NET 2005에 들어오면서 획기적으로 발전하였다. 단순한 주석에서 머무르지 않고 이제는 XML 주석을 통해 각 코드에 구조화된 주석을 쉽게 첨가할 수 있게 되었다. 주석을 작성할 때 각 요소들의 상단에 작은따옴표 3개(”’)를 입력하면(원래 비베의 주석은 작은따옴표 한 개면 됨) [그림1]과 같이 자동으로 XML 주석이 생성되는 것을 확인 할 수 있다.


[그림 1] 비베20005에서 XML 자동 주석 달기

해당 요소에 대한 XML 주석 작성 후 다른 곳에서 그 요소를 참조하게 되면 작성된 XML 주석의 내용이 인텔리센스로 표현되어 코딩시 혼동을 방지할 수 있다. 

[그림2], [그림3]은 작성된 XML 주석이 참조시 사용되는 예이다.

[그림 2] XML 주석의 활용 – 첫째 인자에 대한 설명이 나옴

 
[그림 3] XML 주석의 활용 – 둘째 인자에 대한 설명이 나옴

[For your information]
Visual Basic에서는 프로젝트를 빌드할 때 자동으로 XML 설명서 파일을 생성합니다. 이 파일은 응용 프로그램 출력 디렉터리에 AssemblyName.xml로 나타납니다. 이 파일은 XML 파일이므로 필요할 경우 다른 출력 형식으로 쉽게 변환할 수 있습니다. XML 주석을 사용하면 쉽고 편리하게 코드 설명서를 생성할 수 있습니다. 즉, 코드를 작성하는 동안에는 IntelliSense로, 응용 프로그램을 빌드한 후에는 코드 설명서로 생성할 수 있습니다. (출처 : Visual Basic 2005의 언어 향상)

리팩터링(refactoring)

리팩터링(refactoring)
1. 정의
– 기존 코드의 설계를 개선하는 절차
– 동작(operation)을 보존하는 변환
-> 겉으로 보이는 동작을 바꾸지 않고, 이해하거나 수정하기 쉽게 소프트웨어의 내부 구조를 바꾸는 것 (Martin Fowler)

2. 리팩터링을 하는 이유
– 새로운 코드를 더 쉽게 추가할 수 있도록 하기 위해
– 기존 코드의 설계를 개선하기 위해
– 기존 코드를 더 잘 이해하기 위해
– 덜 짜증나는 코드로 만들기 위해

“Any fool can write code that a computer can understand. Good programmers write code that humans can understand.
컴퓨터가 이해하는 코드는 어느 바보나 짤 수 있다. 훌륭한 프로그래머는 사람이 이해할 수 있는 코드를 짠다.” – Martin Fowler

<참고>
패턴(pattern) : 반복해 나나타는 설계 문제에 대한 표준 해법
설계 초기 단계부터 패턴을 적용하는 것보다 기존 설계를 개선하는 데 패턴을 사용하는 것이 더 낫다.

If문과 Select문의 비교

프로그래밍의 가장 기본 중의 하나가 If문에 의한 실행의 분기일 것이다.

단순한 분기에서부터 다중 분기까지 가능하다.

<문제>

성적 점수에 따라 평점(A, B, C, D, F 등으로 표시되는 것. 학점하고 구분)을 반환하는 함수를 작성하라.

1) If문을 이용한 함수 1

조건이 굉장히 복잡하게 보이지만, 계산 논리를 한번에 알아볼 수 있다.
이렇게 다중 분기하는 경우 다음과 같이 Select문을 생각해 볼 수 있다.

2)Select문을 이용한 함수

이 함수는 심각한 문제를 안고 있다. 즉, 85.5와 같은 점수에 대해서는 “F”를 줄 수 있기 때문이다.
Case 간에 비어있는 범위가 생길 수 있다는 점에서 유의해야 한다.

3)다시 If문을 이용한 함수

처음 If문을 간결하게 다시 작성하면 다음과 같이 할 수 있다.

여기서 중요하게 볼 것은 처음 조건문은 그 다음 조건문의 필터 역할을 한다는 것이다.

예를들어 85.5점은 처음 조건문부터해서 두번째 조건문까지 만족하지 않는다. 그러나, 세번째 조건문에서는 통과하여 평점을 받게 된다. 즉, 세번째 조건문에 ’90보다 작다’는 필터가 두번째의 조건문을 통해서 만들어진 것이다.

주의사항 : 제대로 된 필터 기능을 사용하고자 한다면, 점수가 고득점부터 저득점으로 내려오든, 저득점에서 고득점으로 올라가든, 일정한 순서로 조건문을 배열해야 한다는 점이다.

정령 Select문으로는 해결할 수 없는가?
이것을 Select문으로 바꾸면 다음과 같이 될 것이다.

4) 다시 Select문을 이용한 함수
Is라는 키워드를 사용하면 다음과 같이 작성할 수 있다.

이 방법도 Case 점수가 일정한 순서로 배치되어 가능하다는 점을 유의해야 한다.

Single.Parse()처럼 문자열을 객체로 만드는 방법

Single.Parse()는 문자열을 읽어서 그 값을 Single형 값으로 바꾸어준다.

myValue는 단정도 실수인 36.5가 된다.

이 방법은 파일에서 문자열을 읽어온 후에, 그 값을 전환하는데 있어서 매우 유용하다.

같은 방법으로 문자열을 읽어서 특정 객체를 생성시키려면 다음과 같이 하면 된다.

<작성하고자 하는 클래스>

1) String형 매개변수를 갖는 생성자를 선언한다.

그리고, 생성자 코드 안에 문자열을 해석할 InternalParse를 호출한다.

생성자 내용을 간단하게 하는 것이 좋다.

다른 함수(초기화메소드)를 이용하면, 인스턴스 변수에 대한 초기화를 생성자 이외에서도 할 수 있다.

2) InternalParse() 메소드를 작성한다.

3) Parse() 메소드를 작성한다.

이 때, 이 클래스의 인스턴스 없이 Parse()메소드를 호출하기 위해서는 Shared를 선언한다.

4)사용법

이름은 ‘김창선’이고 나이는 ‘4’인 mySon 인스턴스가 생긴다.

Visual Basic.NET의 구조

1. Visual Basic.NET의 소스파일에는 무엇이 들어있나?
– 확장자가 .vb인 소스코드 파일에서는 클래스를 정의

– 모듈(module) -> 암시적으로 공유되는 클래스의 특수 형태로 볼 수 있음

2. 클래스(class) 안에는 무엇이 들어 있나?
– 메소드(method)가 한 개 이상 들어 있음

3. 메소드 안에는 무엇이 들어 있나?
– 처리할 일을 지시하는 내용이 들어있음
-> 일련의 명령문이 들어 있음

4. 클래스를 해부한다면?
비베닷넷에서는 프로그램을 실행시키기 위한 Main함수, 클래스, 폼을 지정해야 함
시작 함수로서의 Main에 대한 정의는 어떻게 하는가?

콘솔프로그램을 작성하고자 한다면 다음과 같이 하면 된다.

5. Main함수를 가지고 윈도우 프로그램을 실행하려면?
1) Application.Run 메소드를 이용

프로그램을 끝낼 때는 Application.Exit()라고 하면 된다.
2) 폼의 ShowDialog메소드를 이용

3) 폼의 Show메소드를 이용

6. 메소드(method)란?
1) 뭔가를 하는 것
명령문 : 선언, 대입, 메소드 호출 등
2) 뭔가를 여러 번 반복하는 것
순환문 : For, While
For : 반복횟수를 알 때
While : 반복횟수를 모르며, 탈출조건은 알 때.
3) 조건에 따라 뭔가를 하는 것
분기문 : If/Else, Select Case

7. 그렇다면 클래스는 어떻게 설계해야 하는가?
– 클래스를 설계할 때믄 그 클래스 유형으로부터 생성되는 객체에 대해 생각한다.
객체에서 아는 것 -> 인스턴스 변수
객체에서 하는 것 -> 메소드
– 이 클래스가 무엇을 할 것인가(역할-> 메소드)를 먼저 생각한다.

– 클래스와 객체 사이에는 어떤 차이가 있는가?
클래스는 객체(인스턴스)를 만들기 위한 청사진 -> 그 유형의 객체를 만드는 방법을 알려주는 역할을 한다
클래스는 하나이나 객체는 여럿이 될 수 있다.

8. 점(.) 연산자
– 클래스 내부의 상태와 행동을 어떻게 참조/호출하는가?
– 점(.) 연산자는 객체의 상태(인스턴스 변수)와 행동(메소드)을 접근할 수 있게 해주는 역할을 한다.

9. 결국 비베닷넷의 프로그램은 무엇이라 할 수 있는가?
-클래스를 통해여 만들어진 객체들의 연극
– 비베닷넷 프로그램이란 객체가 다른 객체와 대화하는 것에 불과함
– 대화한다는 것은 객체에서 서로 다른 객체의 메소드를 호출하는 것을 의미함.

-> myDog에게 Bark하라고 말함
-> myDog에게 Bark하라는 메시지를 전함
-> myDog이라는 변수로 참조할 수 있는 객체를 이용하여 Bark()라는 메소드를 호출하라는 뜻

– 메시지 = 참조변수 + 점(.)연산자 + 메소드