엑셀 중급_VBA 와 매크로 (1)

  1. 프로그래밍의 불변의 법칙

    이미 소프트웨어 개발 방법들은 많은 것들이 나와 있습니다. 프로그래밍 전문가들이 만들어 놓은 툴에 일반 프로그래머들은 거기에 맞추어서 따라가면 됩니다. 몇 가지 SSADM, FDD, Behavior-Driven Development 등 외계어 들이 많죠. 제가 이걸 아느냐? 하나도 모릅니다. 그러나 어떤 프로그램 개발 방법이던지 기본적으로 따르는 원리 3가지는 같습니다. 문제점 파악 >> 계획 >> 코딩 입니다. 아무리 간단한 프로그램 이라도 이 3가지의 순서에 따라 따라가면 됩니다. 아이폰으로 토플 퀴즈 프로그램을 만든다고 합시다.

    첫째로, 영어의 4영역중 어떤 것을 강조할 것인지, 어느 대상으로 삼을지 파악을 해야 합니다.

    둘째로, 어플의 인터페이스, 기능들을 계획합니다.

    셋째로, 코딩에 들어갑니다.

    정말 단순하고 당연해 보이지만 막상 처음 코딩을 배우는 사람들은 문제를 보면 당장 코딩 시작부터 합니다. 문제점을 정확히 파악해야만 코딩 시간도 단축 시킬 수 있습니다.

  2. VBA의 프로그램 패러다임 Object Oriented Programming (객체 지향 언어)의 이점

    객체 지향 언어가 아닌 언어들은 포트란, 코볼, 어셈블리 등이 있습니다. 이런 언어들을 Procedurer Language 라고 합니다. 지금 중급 코스에서 두 언어의 차이점을 정확히 알 필요는 없지만 VBA는 객체 지향 언어이며 왜 객체 지향 언어가 대세가 되었는지는 알아두면 좋습니다. 굉장히 추상적이라 경험을 통해서 깨달아 가야 하지만 처음에 한번이라도 들어 놓으면 "아~ 그래서 그랬구나" 이렇게 되는 거 아시죠?

    사실 제가 중급에서 소개해 드릴 VBA정도의 코딩은 객체 지향 언어가 굳이 필요하지 않습니다. 객체 지향 언어가 가지는 가장 큰 이점은 코드가 점점 커져서 내가 쓴 코드도 기억 못할 정도가 될 때 유지 보수가 쉬워진다는 것에 있습니다. 이 사실을 알고 있으면 VBA를 공부 하면서 왜 이런 명령어들이 이런 식으로 구성 되는지 알아서 깨우치게 됩니다. 지금은 설명을 해도 마음에 와 닿지 않을 수 있습니다. 이건 분명히 경험으로 알아가야 하는 부분입니다.

    또 다른 컴퓨터 패러다임으로는 Logic programming language, Functional programming language 등이 있지만 저도 들어 보기만 했고 먼지도 모릅니다. 그러나 여러분들이 흔히 들어본 C++, C#, Java, PHP, Python 등은 모두 객체 지향 언어 입니다.

    객체 지향 언어의 3가지 요소는 객체, 그 객체의 성질, 그리고 METHOD(함수와 비슷하고 Behavior라고도 합니다) 입니다

     

  3. Object (객체)는 무엇인가?

    프로그램에서 객체는 속성을 가지고 있는 모든 것 이라고 하면 엄청 애매 모호 하죠? 일단 VBA를 시작하기 전에 프로그래밍 코딩 안에서의 객체는 실생활에서의 객체와 비슷하다고 생각하면 됩니다. 예를 들어 사과를 생각해 봅시다. 사과는 실체를 가지고 있는 객체입니다. 사과는 맛있을 수도 있고 색깔을 가질 수 있고 무게를 가질 수 있습니다. 사과가 가질 수 있는 실체 이외의 것들을 속성 (Property)라고 합니다. 보통 하나의 객체는 여러 개의 속성을 가질 수 있습니다. 또 객체는 행동(Behavior) 할 수 있습니다. 사과는 떨어 질 수 있고 물에 떠내려 갈 수 있습니다. 이건 Property가 아니죠. 객체지향 언어에서 객체를 나타내는 것은 객체의 Identity, Property, Behavior (Method) 입니다.

    엑셀에서 객체는 무엇일까요? 프로그래밍 안에서의 실체라고 생각하면 가장 쉽습니다. (정확히는 아닐 수도 있습니다) 엑셀에서의 객체는, 셀, 워크시트, 워크 북 등 엑셀에서 실체를 가지고 있는 것들이라고 보시면 되고 엑셀의 셀은 셀 크기, 색깔, 맞춤 등 속성을 가질 수 있으며 복사, 지우기 등 행동을 할 수 있습니다.

     

    차라는 객체는 색깔 (Property)를 가질 수 있고 시동 (Behavior)을 걸 수 있습니다.

     

  4. 객체 지향 언어의 Class

    먼저 여기서 Class의 개념이 이해가 안가도 크게 지장은 없습니다. 중급에서는 VBA코드에 클래스를 사용하지 않을 것 입니다. 그렇지만 Class는 우리가 정의 하지 않아도 VBA안에서 이미 기본으로 정의 되어 있습니다.

    클래스와 객체는 사실 떼어서 생각할 수 없습니다. 객체 지향언어를 사용하는 가장 큰 이유는 클래스 때문입니다. 클래스를 사용하기에 유지보수가 쉬워지고 관리가 편리해 집니다. 클래스는 객체를 생성하기 위해 사용됩니다. 클래스는 객체를 위한 정의입니다. 우리가 차를 만든다고 하면 설계도가 필요합니다. 하나의 설계도로 여러 개의 차를 만들 수 있죠. 이때 설계도는 차라는 객체를 만들기 위한 클래스가 됩니다. 설계도에는 차가 무엇을 하는지 어떤 속성을 갖는지 모두 들어 있습니다. 차는 주차 할 수도, 시동을 걸 수도, 또 속도를 올릴 수도 있습니다. 차가 무엇을 할 수 (Behavior) 있는지 설계도 에서 역시 결정합니다. 차는 여러 개의 색상을 가질 수 있지만 모든 선택이 가능한 색상은 미리 설계단계에서 정해 집니다. 그 미리 디자인된 설계도에 따라서 차의 속성의 종류가 결정되는 것 입니다.

    클래스는 집을 짓기 위해 집의 속성을 미리 결정해 놓은 설계도 입니다.

    또 다른 하나의 예로 은행 계좌라는 클래스를 만든다고 합시다. 은행 계좌 에는 계좌번호, 잔금, 개설일, 계좌 종류 등의 속성이 있습니다. 우리가 은행 계좌라는 Class를 만들 때 은행 계좌는 이러한 속성을 가질 수 있다고만 정의를 하지 얼마만큼의 잔금이 있는지, 개설 일이 언제인지는 정하지 않습니다. 즉 Class는 Class를 이용해서 생성되는 객체들의 특징을 미리 정해 놓는 것 입니다. 은행 계좌라는 클래스를 만들 때 계좌로 무엇을 할 수 있는지 (Behavior)를 또 정의 합니다. 계좌는 개설 될 수도, 예금 할 수도, 출금 할 수도 있습니다. 하나의 계좌로 할 수 있는 모든 것들을 클래스에서 정의해 주는 것 입니다. 자 이제 이해가 좀 가시나요? 우리가 은행 계좌라는 클래스를 정의했으면 이제 그 클래스를 바탕으로 계좌를 개설 해야겠죠. 클래스를 바탕으로 생성되는 하나 하나의 계좌가 객체 (Object)가 되며 이 하나하나의 객체는 각자의 성질 (계좌, 번호, 개설일)을 가질 수 있고 또 하나 하나의 객체는 행동 (개설, 예금, 출금)을 할 수 있습니다.

    클래스는 우리가 정할 수도 있고 VBA에서 이미 정해 놓은 것을 사용할 수 도 있습니다. 중급 편에서는 클래스를 정의하지는 않지만 모든 코딩에는 이미 VBA프로그램 자체의 클래스가 포함 되어 있습니다.

    클래스를 이해 못해도 크게 상관은 없지만 클래스의 개념을 알고 있으면 VBA코딩을 이해 하는데 크게 도움이 되고 모든 VBA코딩은 이 객체 지향 언어의 원리에서 절대 벗어 날 수가 없습니다.

     

    학사 학위를 할 때 A+를 받아도 도저히 이해할 수 없어서 그냥 외웠던 부분들이 있습니다. 세월이 지나고 박사학위를 하면서 몇 년 전에 이해가 가지 않았던 부분들이 갑자기 얽힌 실타래가 풀리 듯 머릿속에서 정리가 되고 정리가 되고 나면 아무것도 아닌 것들이 되죠. 제가 아무리 쉽게 설명한다고 했지만 사실 프로그래밍에서 실제 명령어의 이해보다 이런 개념 이해가 훨씬 어려울 수 있습니다. 너무 추상적이지요. 그래도 개념을 먼저 설명 드리는 이유는 일단 한번이라도 읽어 두면 코딩을 하다가 분명히 깨우치는 순간이 옵니다. 그리고 개념을 이해 해야 프로그래밍의 기본 원리로 모든 코딩에 자신감이 붙고 쉬워집니다.

+ Recent posts