[myLV.net 집필진 강좌 – 웅킹킹킹]
안녕하세요. 웅킹킹킹 입니다.
지난 강좌에서 클래스와 클래스의 구성요소(데이터멤버, Method), Method의 종류(정적 디스패치, 다이나믹 디스패치), 상속에 대해서 함께 알아봤습니다. 바로 이어서 지난 강좌의 내용을 LabVIEW에서 구현을 해보는 실습 시간을 가져보도록 하겠습니다.
그림 1 Save 클래스 다이어그램
그림 1은 지난 강좌에서 상속관계를 설명하기 위해 사용한 Save 프로그램의 클래스 다이어그램입니다. Save 프로그램은 ASCII와 Binary 두 가지 방식으로 무작위 데이터를 파일로 저장을 할 수 있는 프로그램입니다. 우선 클래스 다이어그램을 조금 설명을 드리자면, 많이들 알고 계시는 Flow Chart와 비슷한 개념으로 OOP의 설계도입니다. 처음 접하시는 분들이 보셔도 한눈에 Save 클래스를 ASCII, Binary 클래스가 상속받는 다는 것을 알 수 있습니다.
그림 2 Save 클래스
그림 2를 보시면 Save 클래스를 기준으로 클래스 다이어그램의 클래스의 표기법을 알 수 있습니다. 클래스의 구성요소의 정보가 표기된 것을 볼 수 있습니다.
우리는 현재 클래스 다이어그램에서 상속관계와 클래스의 표기법 정도만 알아가는 정도면 충분합니다. 하지만 앞으로 계속해서OOP, Actor Framework를 배우는 과정에서 클래스 다이어그램을 매우 중요하며 꼭 이해를 하셔야 됩니다. 왜냐하면 OOP로 작업 시 상속관계가 매우 중요하게 됩니다. 한참을 프로그래밍을 했는데 상속관계를 다시 설계를 해야 하는 상황이 만약에 생긴다면 이는 엄청난 손실로 다가옵니다. 기존 POP의 코드 수정과는 차원이 다른 수정작업을 해야 됩니다. 그래서 프로그래밍 작업 전 사전에 클래스간 상속관계와 상호관계를 확실히 설계한 뒤에 프로그래밍을 해야 하기 때문에 클래스 다이어그램에 대한 이해는 매우 중요합니다.
클래스 다이어그램에 대한 강좌도 추후 업데이트할 예정입니다.
그럼 LabVIEW로 ASCII, Binary로 데이터 저장을 할 수 있는 프로그래밍 실습을 시작하도록 하겠습니다.
① 파일 → 새로 만들기 → 새 프로젝트, Save 프로젝트를 생성.
② 내 컴퓨터 아래에 Save, ASCII, Binary 버추얼 폴더 생성.
③ Save폴더에 저장.
그림 3 참고.
그림 3 Save 프로젝트
2. 클래스 생성
① Save 버추얼 폴더에서 새로 만들기 → 클래스, Save 클래스 생성.
② Save\Class\Save 폴더에 Save 클래스 저장.
③ Save 클래스 마우스 우 클릭 후 프로퍼티 설정에서 그림 4와 같이 아이콘 편집.
그림 4 Save 클래스 아이콘 편집
④ ASCII 버추얼 폴더에서 새로 만들기 → 클래스, ASCII 클래스 생성.
⑤ Save\Class\ASCII 폴더에 ASCII 클래스 저장.
⑥ 과 같은 방식으로 ASCII 명칭으로 아이콘 편집.
⑦ Binary 버추얼 폴더에서 새로 만들기 → 클래스, Binary 클래스 생성.
⑧ Save\Class\Binary 폴더에 Binary 클래스 저장.
⑨ 과 같은 방식으로 Binary 명칭으로 아이콘 편집.
3. 클래스 상속
① ASCII 클래스 마우스 우 클릭 후 프로퍼티 → 상속 항목에서 상속변경 선택 후 Save.lvclass 선택하고 선택된 것에서 상속 버튼 클릭. 그림 5 참조.
그림 5 클래스 상속
② ①과 같은 방식으로 Binary 클래스도 Save 클래스로부터 상속 설정.
③ LabVIEW 메뉴모음에서 보기 → LabVIEW 계층구조 선택하여 상속관계 확인.
그림 6 LabVIEW 계층구조
4. Save 클래스 코드 작업
① Save 클래스의 Save.ctl (Data 멤버) 선택하여 ‘바이트 스트림 파일 참조 번호’ 컨트롤을 그림 7과 같이 클러스터에 포함.
*’바이트 스트림 파일 참조’ 컨트롤은 ‘컨트롤 팔레트의 참조 번호 항목’에 있습니다.
② ‘바이트 스트림 파일 참조 번호’ 컨트롤의 라벨을 ‘File Resource’로 변경.
그림 7 Save 클래스의 Data 멤버
③ 프로젝트에서 Save 클래스 우 클릭 후 ‘새로 만들기 → 정적 디스패치 템플릿으로부터 VI’ 선택하여 Method VI 생성.
④ 생성된 VI를 파일명 Init으로 Save\Class\Save 폴더에 저장.
⑤ 그림 8과 같이 Init.vi 코드 작업.
그림 8 Save 클래스의 Init.vi 코드
⑥ 프로젝트에서 Save 클래스 우 클릭 후 ‘새로 만들기 → 다이나믹 디스패치 템플릿으로부터 VI’ 선택하여 Method VI 생성.
⑦ 생성된 VI를 파일명 Write으로 Save\Class\Save 폴더에 저장.
⑧ 프로젝트에서 Save 클래스 우 클릭 후 ‘새로 만들기 → 정적 디스패치 템플릿으로부터 VI’ 선택하여 Method VI 생성.
⑨ 생성된 VI를 파일명 Close으로 Save\Class\Save 폴더에 저장.
⑩ 그림 9과 같이 Close.vi 코드 작업.
그림 9 Save 클래스의 Close.vi 코드
① 프로젝트에서 Save 클래스 우 클릭 후 ‘새로 만들기 → 데이터 멤버 접근을 위한 VI…’ 설정에서 그림 10과 같이 데이터 멤버 접근 VI 생성.
*하위 클래스에서 Save의 Data 멤버에 접근할 수 있도록 하기 위함.
그림 10 데이터 멤버 접근을 위한 VI
② 생성된 VI 저장.
5. ASCII 클래스 코드 작업
① 프로젝트에서 ASCII 클래스 우 클릭 후 ‘새로 만들기 → 다이나믹 디스패치 템플릿으로부터 VI’ 선택하여 Method VI 생성.
② 생성된 VI를 파일명 Write으로 Save\Class\ASCII 폴더에 저장.
③ 그림 11과 같이 Write.vi 코드 작업.
*Read File Resource.vi는 Save 클래스의 ‘데이터 멤버 접근을 위한 VI…’로 생성한 VI입니다.
그림 11 ASCII 클래스의 Write.vi 코드
6. Binary 클래스 코드 작업
① 프로젝트에서 Binary 클래스 우 클릭 후 ‘새로 만들기 → 다이나믹 디스패치 템플릿으로부터 VI’ 선택하여 Method VI 생성.
② 생성된 VI를 파일명 Write으로 Save\Class\Binary 폴더에 저장.
③ 그림 12과 같이 Write.vi 코드 작업.
*Read File Resource.vi는 Save 클래스의 ‘데이터 멤버 접근을 위한 VI…’로 생성한 VI입니다.
그림 12 Binary 클래스의 Write.vi 코드
7. Main 프로그램 코드 작업
① 프로그램을 작업했던 폴더에서 Data Files 폴더를 생성.
② 프로젝트에서 내 컴퓨터 항목 우 클릭 후 새로 만들기 → VI 선택.
VI명을 Main으로 정하고 Save폴더에 저장.
①, ②의 작업이 끝나면 그림 13과 같아집니다.
그림 13 프로젝트 진행 상황
③ Main.vi 프런트 패널 작업.
열거형 컨트롤 하나와 에러 클러스터 인디케이터를 그림 14와 같이 생성.
열거형은 ASCII, Binary 메뉴 2개 생성.
그림 14 Main 프런트패널 및 열거형 메뉴
④ 그림 15과 같이 Main.vi 코드 작업.
*케이스 구조의 클래스 상수는 이전에 생성한 ASCII, Binary 클래스를 블록다이어그램으로 마우스 드래그& 드랍 하시면 됩니다.
그림 15 Main.vi 코드 및 상세 케이스 구조
8. 테스트
① Main 프로그램의 열거형 메뉴를 ASCII 선택한 후 실행.
Data Files 폴더에 생성된 파일 확인.
② Main 프로그램의 열거형 메뉴를 Binary 선택한 후 실행.
Data Files 폴더에 생성된 파일 확인.
③ 저장된 2개의 파일이 다른 형태인 것을 확인.
① 클래스 생성 및 Data 멤버, Method 코드 작업.
② 클래스 상속관계 설정.
③ 정적 디스패치 및 다이나믹 디스패치 Method 생성.
④ Data 멤버 접근을 위한 VI 생성.
⑤ 생성한 클래스를 활용하여 Main 프로그램 코드 작업.
을 배울 수 있었습니다.
여기서 문제 드립니다.
① Init, Close.vi는 왜 정적 디스패치로 생성하며 Write.vi는 다이나믹 디스패치로 생성했을까요?
② Main.vi에서 ASCII, Binary 클래스는 ‘Init, Close’ Method를 가지고 있지 않는 데 어떻게 에러 없이 실행이 가능했을까요?
③ Save 클래스의 ‘데이터 멤버 접근을 위한 VI…’가 굳이 필요했을까요? 필요했다면 그 이유는 무엇일까요?
④ Save 클래스의 ‘Write’ Method는 코드가 없어 아무 기능을 하지 않는 Method인데 왜 생성했을까요?
입니다.
꼭 한번 문제에 대해서 생각해보시길 바랍니다. 이번 예제는 OOP의 기본 기능을 설명하기 위한 예제입니다. Actor Framework는 이보다 훨씬 어렵답니다. 꼭 기본에 대한 이해를 하시고 가능하다면 ni.com에서 OOP에 대해 많은 자료를 찾아보시고 LabVIEW로 연습도 많이 하시길 바랍니다. OOP에 많이 익숙해져야 Actor Framework를 이해하실 수 있습니다.
ps. 약간은 취미로 강좌를 하는 데 생각보다 힘드네요.. 예제로 모두가 따라 할 수 있게 만드는 작업이.. ㅠㅜ