LabVIEW 클래스 개발하기
- 업데이트 날짜:2025-08-27
- 9분 (읽기 시간)
LabVIEW 객체 지향 프로그래밍이 다른 객체 지향 프로그래밍과 개념상 유사하지만, LabVIEW가 데이터 흐름 프로그래밍 환경이기 때문에 LabVIEW가 LabVIEW 클래스 데이터를 다루고 상호작용하는 법 및 사용자가 클래스 코드를 디버깅하는 법에서 어느 정도 차이가 있습니다.
LabVIEW의 객체는 참조가 아닌 값으로 인식됩니다. LabVIEW는 클러스터와 배열에 전통적으로 적용되는 동일한 규칙을 따르는 객체 복사본을 생성합니다.
컨스트럭터와 디스트럭터
LabVIEW 객체 지향 프로그래밍의 컨스트럭터와 디스트럭터는 함축적입니다. LabVIEW 클래스 데이터를 초기화하기 위해 컨스트럭터를 호출할 필요는 없습니다. LabVIEW는 클래스를 초기화해야 할 필요가 있을 때마다 언제든지 기본 컨스트럭터를 호출합니다. 클래스 초기화는 보통 프런트패널 컨트롤이나 블록다이어그램 상수에서 진행됩니다. LabVIEW는 사용자가 프라이빗 데이터 컨트롤에 설정한 기본값으로 클래스 값을 초기화합니다. LabVIEW가 더 이상 LabVIEW 클래스 정보를 필요로 하지 않을 때 LabVIEW는 클러스터 및 배열의 경우와 같은 방법으로 메모리 할당 해제 작업을 합니다. 클래스 데이터에 다른 값을 설정하고 싶다면, 새 값을 설정하는 멤버 VI를 생성해야 합니다. 한 예로, Vehicle 클래스를 생성할 때 Vehicle 클래스의 기어 개수 기본값을 3으로 설정한 후 Truck 클래스가 상속하는 기어 개수에 다른 값을 지정하고 싶은 경우에, 사용자는 Vehicle 클래스의 값을 변경하는 멤버 VI를 생성해야 합니다. 새 값을 설정하는 한 방법으로, 입력은 없지만 기어 개수 값을 지정하고자 하는 클래스를 출력하는 멤버 VI를 생성하여, 클래스 데이터 타입의 블록다이어그램 상수를 생성하는 것이 있습니다.
데이터 패턴화 및 패턴화 해제하기
LabVIEW는 데이터를 패턴화된 데이터로 저장합니다. [패턴화된 문자열로]와 [문자열로부터 패턴화 해제] 함수는 모든 클래스 데이터 타입을 처리할 수 있습니다. LabVIEW는 자동으로 데이터를 패턴화 및 패턴화 해제 합니다. 모든 타입 설명자가 LabVIEW에서 패턴화된 데이터 타입의 데이터 타입을 갖고 있지만, LabVIEW 클래스의 패턴화된 데이터는 자체적으로 이 정보와 클래스 버전 정보를 갖고 있습니다. 패턴화 해제된 LabVIEW 클래스 관련 정보를 LabVIEW 클래스가 보유하고 있기 때문에, 사용자가 클래스를 이동시키거나 삭제해서 LabVIEW 클래스를 찾을 수 없는 경우에는 LabVIEW가 데이터를 패턴화 해제할 수 없으며 에러 메시지가 나타납니다. 찾을 수 없는 SubVI가 있을 때 LabVIEW가 보여주는 동작과 유사하게, 멤버 VI를 열어보면 LabVIEW 클래스 데이터를 찾지 못하는 컨트롤을 LabVIEW가 비활성화시킨 것을 확인할 수 있습니다. 깨진 컨트롤과 대응하는 LabVIEW 클래스를 로드할 경우, 데이터는 패턴화 해제되며 컨트롤은 더 이상 깨져있지 않습니다.
데이터 변경하기
메모리에 LabVIEW 클래스가 가지고 있는 버전보다 더 최근의 LabVIEW 클래스 버전으로 컨트롤 데이터가 쓰여진 경우, LabVIEW 클래스 컨트롤은 경고 리포트를 합니다. LabVIEW는 사용자가 프라이빗 데이터 컨트롤 또는 클래스 상속을 바꿀 때마다 LabVIEW 클래스의 버전 번호를 증가시킵니다. 클래스 프로퍼티 대화 상자에서 LabVIEW 클래스 버전 번호를 확인할 수 있습니다. LabVIEW가 자동으로 클래스 버전 번호를 증가시키는 경우는 다음과 같습니다:
- LabVIEW 클래스 상속이 변경될 경우.
- LabVIEW 클래스의 프라이빗 데이터 컨트롤이 변경될 경우. 컨트롤 추가, 대체, 순서 재설정, 삭제: 컨트롤형 변경: 수정된 타입 정의 업데이트 등이 있습니다.
- 새 LabVIEW 버전에 LabVIEW 클래스가 로드하는 경우.
- 클래스 프로퍼티 대화 상자에서 사용자가 수동으로 버전 번호를 증가시킵니다. 새 클래스 개정을 나타내기 위해 사용자가 이러한 작업을 할 수 있습니다.
클래스의 이름을 바꿀 경우, LabVIEW는 이를 새로운 클래스로 인식하여 클래스의 변경 히스토리를 삭제하고 버전 번호를 1.0.0.0.으로 재설정합니다. LabVIEW가 클래스 이름을 변경하는 경우는 사용자가 다음과 같은 작업을 할 때입니다 :
- 풀다운 메뉴에서 파일≫다른 이름으로 저장을 선택하여 클래스 이름을 바꾸는 경우.
- 클래스를 소유 라이브러리로 이동시키는 경우.
- 클래스를 소유 라이브러리에서 이동시키는 경우.
- 디스크의 .lvclass파일 이름을 바꾸는 경우.
|
노트 다른 변경사항 없이 원래의 클래스 이름으로 되돌리는 경우, 변경 히스토리가 더 이상 존재하지 않기 때문에 이 클래스는 원래 클래스와 동일하지 않습니다. 예를 들어, Vehicle 클래스를 Vehicle #1으로 이름을 바꾼 후 다시 Vehicle로 변경할 경우, Vehicle 클래스는 원래의 클래스와 동일하지 않습니다. |
LabVIEW 클래스의 버전 번호를 추적하는 것은 LabVIEW 클래스를 통해 어플리케이션을 개발하는 LabVIEW 클래스 사용자에게 유용합니다. 예를 들어, 클래스의 프라이빗 데이터 컨트롤에서 부호없는 32비트 정수를 사용하는 어플리케이션 상에 사용자가 LabVIEW 클래스를 갖는 경우가 있습니다. LabVIEW 클래스 개발자는 프라이빗 데이터 컨트롤의 숫자형 컨트롤을 배정도 부동수로 변경시키는 LabVIEW 클래스 버전을 사용자에게 보낼 수 있습니다. LabVIEW가 버전 변경사항을 추적하며 모든 LabVIEW 클래스에서 어떻게 데이터를 패턴화 및 패턴화 해제하는지 알고 있기 때문에, 사용자는 이전 버전의 LabVIEW 클래스를 새로운 버전으로 대체하고 어떠한 변경도 없이 프로그램을 실행할 수 있습니다.
|
노트 사용자가 이후 LabVIEW 클래스 버전으로부터의 데이터 패턴화 해제를 시도하는 경우, LabVIEW는 에러를 반환합니다. 예를 들어, 버전 번호가 1.0.0.3인 데이터를 갖고 있지만 메모리 상의 LabVIEW 클래스 버전은 1.0.0.2일 경우, 이러한 에러가 발생할 수 있습니다. |
LabVIEW에서 이전 버전의 LabVIEW 클래스가 발견되는 경우, LabVIEW는 다음 중 하나의 방법으로 데이터 변경을 처리합니다:
- LabVIEW 클래스 계층구조에서 클래스를 제거하면, LabVIEW는 사용자가 제거한 클래스의 패턴화된 데이터를 삭제합니다. 예를 들어, 클래스 C는 클래스 B로부터, B는 A로부터 상속을 하는 경우가 있습니다. 이때 클래스 A로부터 직접 상속하도록 클래스 C의 상속을 변경하면, LabVIEW는 인스턴스에 있는 클래스 B의 패턴화된 데이터를 제거합니다.
- LabVIEW 클래스 계층구조에서 계층을 추가하는 경우, LabVIEW는 사용자가 삽입한 클래스의 클래스 기본 데이터를 추가합니다. 예를 들어, 클래스 C는 클래스 A로부터 상속을 하는 경우가 있습니다. 이때 사용자가 클래스 C의 상속을 변경하여, 클래스 A로부터 상속받는 클래스 B로부터 상속하도록 만들면, LabVIEW는 클래스 B의 클래스 기본 데이터를 삽입합니다.
- 탭 순서 마지막에 있는 클래스의 프라이빗 데이터 클러스터에 원소를 추가하는 경우, LabVIEW 이전 데이터를 패턴화 해제하고 클래스 기본 데이터를 추가합니다.
- 클래스의 프라이빗 데이터 클러스터로부터 원소를 삭제하고 새 원소를 추가하지 않는 경우, LabVIEW는 이전 데이터를 패턴화 해제하고 원소에 관한 정보를 삭제합니다.
- 클래스 프라이빗 데이터 클러스터의 탭 순서를 변경하는 경우, LabVIEW는 이에 따라서 패턴화 해제된 데이터의 순서를 재설정합니다.
- 같은 편집 내에서 클래스의 프라이빗 데이터 클러스터를 추가, 삭제, 대체, 또는 순서 재설정하는 경우, LabVIEW는 상기의 단계를 조합하여 적절히 이전 데이터를 변경하는 과정을 생성 및 실행합니다.
LabVIEW는, 예를 들면 1.0.0.2에서부터 1.0.0.6로 방식으로, 항상 순차적으로 여러 버전에 변경을 적용합니다.
|
노트 일단 클래스 버전이 증가하면 LabVIEW 클래스를 되돌릴 수 없습니다. LabVIEW는 LabVIEW 클래스 컨트롤과 인디케이터 내의 데이터 변경을 실행 취소할 수 있는 충분한 정보가 없습니다. 현재의 변경사항을 되돌리고 싶으면, 어떤 변경사항도 저장하지 않습니다. 클래스와 클래스를 참조하는 모든 VI를 언로드한 후, 디스크에서 다시 로드합니다. |
사용자가 LabVIEW 클래스를 편집할 때 LabVIEW가 데이터를 변경하는 방법에 대한 추가적인 정보는 ni.com의 관련 문서를 참조합니다.
LabVIEW 클래스 캐스팅하기
[보다 일반적인 클래스로] 함수를 사용하여 클래스를 업캐스트할 수 있고, [보다 구체적인 클래스로] 함수를 사용하여 클래스를 다운캐스트할 수 있습니다. VI 서버 컨트롤 참조 번호와 같이 상속 계층구조가 있는 참조 번호 데이터 타입에 이와 같은 함수를 사용할 수 있으며, 그 기능은 동일합니다. [보다 일반적인 클래스로] 함수를 사용한다고 데이터가 바뀌지는 않지만 데이터를 전달하는 와이어 타입은 바꿀 수 있습니다. 하지만 VI가 실행 상태일 때에는 이 함수가 어떠한 영향도 미치지 않습니다. [보다 일반적인 클래스로] 함수의 주요 용도는 이러한 데이터 변환에 대해 엄격한 코드 형식을 사용하는 프로그래머를 위해 강제 변환점을 제거하는 데에 있습니다.
[보다 구체적인 클래스로]함수를 사용하면 에러가 발생하지 않는 한 데이터가 변경되지 않습니다. 실행 중인 와이어의 데이터가 보다 구체적인 클래스의 데이터가 아닐 경우, 함수는 에러를 반환하며 출력 데이터는 와이어 타입의 기본값입니다. [보다 구체적인 클래스로] 함수의 일차적인 용도는 직상위 클래스의 값에 대해 타입 테스트하는 데에 있습니다. 종종 프로그래머들은 동일한 직상위 클래스 와이어를 여러 [보다 구체적인 클래스로]함수 호출에 연결시켜 각각 각기 다른 [보다 구체적인 클래스]로 이동하게 만들고, 이후 어떤 [보다 구체적인 클래스로]함수가 에러를 반환하지 않는지에 따라 다른 코드를 실행시킵니다. 이는 매우 비효율적입니다. 사용자가 이러한 테스트 메소드를 사용할 생각이 있고 직상위 클래스를 수정할 수 있는 권한이 있다면, 직상위 클래스에 다이나믹 멤버 VI 쓰기를 하고 각각의 직하위 클래스가 각자에게 적합한 기능으로 덮어쓰도록 할 수 있습니다.
런타임에서 LabVIEW가 사용자가 직상위 클래스 객체를 받는 SubVI에 직하위 클래스 객체를 와이어로 연결하는 것을 감지하는 경우, LabVIEW는 해당 SubVI의 출력을 자동으로 직하위 클래스 객체로 다운캐스트할 수 있습니다. 자동 다운캐스트는 [보다 구체적인 클래스] 함수를 필요로 하지 않습니다. 하지만 SubVI에 연결하는 클래스 객체가 해당 SubVI가 받는 입력과 호환가능한 경우에만 LabVIEW에서 자동 다운캐스팅이 발생합니다. 예를 들어, 변수에 한 클래스 객체를 저장하고 그 변수 데이터를 SubVI에 와이어로 연결하는 경우에 LabVIEW는 그 SubVI가 변수에서 원래 저장한 데이터와 같은 클래스에 속하는 데이터를 포함하고 있는지 보장할 수 없습니다. [런타임 클래스 유지] 함수를 사용하면, LabVIEW에서 SubVI에 연결하는 클래스 객체가 해당 SubVI가 받는 클래스 객체와 호환가능한지 점검할 수 있습니다. 두 객체가 호환되지 않는 경우, 이 함수는 에러를 반환하고 출력 데이터의 클래스를 SubVI가 받는 직상위 클래스로 설정합니다. 또한, 데이터 값 참조와 함께 이 함수를 사용할 수 있습니다. [데이터 값 참조 원소 읽기 / 쓰기] 경계 노드는 런타임 타입을 유지해야 합니다. [런타임 클래스 유지] 함수를 사용하여, [데이터 값 참조 원소 쓰기] 노드에 사용자가 와이어로 연결하는 클래스 객체가 [데이터 값 참조 원소 읽기] 경계 노드에 연결하는 클래스 객체와 호환가능한지 점검할 수 있습니다.
|
노트 LabVIEW에서는 재귀 SubVI를 자동으로 다운캐스팅할 수 없습니다. 자동 다운캐스팅을 하게 되면, 다이나믹 디스패치 VI의 블록다이어그램이나 데이터 값 참조에 대한 In Place 원소 구조 내부에서 SubVI를 호출할 경우 호출자 VI가 깨어집니다. 해당 재귀 SubVI의 블록다이어그램에서 [런타임 클래스 유지] 함수를 사용하여, SubVI에 연결하는 클래스 객체가 SubVI가 받는 클래스 객체와 호환되는지 확인할 수 있습니다. 클래스 객체가 호환되는 경우, 재귀 사이클 외부에 있는 호출자 VI는 깨지지 않습니다. |
LabVIEW 클래스 잠그기와 잠금해제하기
LabVIEW 클래스 잠그기를 설정하여 LabVIEW 클래스 사용자가 어플리케이션 내부 구현의 일부분인 멤버 VI를 보는 것을 금지할 수 있습니다. LabVIEW 클래스를 잠그면 프라이빗 멤버 VI에 대한 접근을 막음으로써 어플리케이션에 발생할 수 있는 에러를 방지합니다. 프로젝트 라이브러리와 관련해서, LabVIEW 클래스에 암호 보호를 추가한다고 멤버 VI에 암호 보호가 추가되는 것은 아닙니다. 멤버 VI는 개별적으로 암호 보호를 해야 합니다.
LabVIEW 클래스 잠그기를 하면, 클래스 와이어 위로 커서를 이동할 때 오직 데이터 타입만이 기본 도움말 윈도우에 나타납니다. 잠금해제 상태의 LabVIEW 클래스의 와이어 위로 커서를 이동하면, 기본 도움말 윈도우는 해당 클래스의 프라이빗 데이터와 모든 잠금해제 상태인 직상위 클래스의 프라이빗 데이터를 보여줍니다. LabVIEW가 일반 프로브에 디스플레이하는 정보에도 이와 유사한 규칙이 적용됩니다. LabVIEW 클래스에서 프로브 사용하기에서 LabVIEW 클래스와 일반 프로브 사용에 관한 정보를 참조합니다.
|
노트 LabVIEW 클래스 와이어와 LabVIEW 클래스 컨트롤에 대해서 기본 도움말 윈도우가 다른 정보를 디스플레이함을 확인하십시오. LabVIEW 클래스 컨트롤은 최종 사용자를 위해 클래스 설명 정보를 디스플레이하는 반면, LabVIEW 클래스 와이어는 LabVIEW 클래스 사용자를 위해 데이터 타입에 대한 정보를 추가적으로 디스플레이합니다. |
LabVIEW 클래스 사용자는 오직 허용되는 클래스 정보만을 볼 수 있기 때문에, 개발하고 있는 LabVIEW 클래스를 적절하게 문서화하도록 주의하십시오. 클래스 프로퍼티 대화 상자에서 클래스 설명 추가를 할 수 있으며 VI 프로퍼티 대화 상자에서 멤버 VI 설명 추가를 할 수 있습니다.
LabVIEW 클래스에서 프로브 사용하기
일반 프로브와 사용자 프로브를 사용하여 LabVIEW 클래스를 디버그할 수 있습니다.
LabVIEW 클래스 와이어에 일반 프로브를 사용할 수 있습니다. LabVIEW 클래스 와이어의 일반 프로브는 실행 중인 클래스 이름, 프라이빗 클래스 데이터, 그리고 모든 직상위 클래스의 프라이빗 클래스 데이터를 보여줍니다. 잠금 상태의 LabVIEW 클래스에서 일반 프로브를 사용하면, 오직 실행 중인 클래스의 이름과 클래스 계층구조 내에서 잠금해제 상태의 모든 프라이빗 데이터를 프로브에서 볼 수 있습니다. 다음의 이미지에서, 왼편의 Vehicle 클래스는 잠금 상태이고 LabVIEW는 클래스의 프라이빗 데이터를 디스플레이하지 않습니다: 기어 개수, 차문 개수, 색, 차종, 모델 등이 이에 해당합니다. 트럭 클래스는 잠금 상태가 아니며 LabVIEW는 이 경우에는 프라이빗 데이터를 디스플레이합니다. Vehicle 클래스가 잠금 상태이기 때문에 LabVIEW가 Truck 클래스의 일반 프로브에 Vehicle 클래스에서 상속한 프라이빗 데이터를 디스플레이하지 않는다는 것을 확인할 수 있습니다.
LabVIEW 클래스에서 사용자 정의 기본 프로브 생성하기는 유용합니다. 와이어 타입과 동일한 클래스 타입이거나 또는 상위 와이어 타입을 가지는 LabVIEW 클래스 와이어에 대해서만 사용자 프로브를 사용할 수 있습니다. LabVIEW 클래스 개발자는 클래스의 멤버고 클래스의 프라이빗 데이터를 직접 디스플레이할 수 있는 사용자 프로브를 생성할 수 있습니다. LabVIEW 클래스 사용자는 사용자 기본 프로브를 생성하여 클래스의 퍼블릭 메소드를 통해 사용 가능한 모든 정보를 디스플레이할 수 있습니다.
클래스 개발자는 LabVIEW 클래스 사용자를 위해 사용자 프로브를 기본 프로브로 설정할 수 있습니다. 잠금 상태인 LabVIEW 클래스의 일반 프로브는 데이터가 프라이빗이기 때문에 LabVIEW 클래스 사용자가 데이터 값에 대한 어떤 정보에도 접근할 수 없도록 합니다. 사용자 프로브를 생성하고 이를 LabVIEW 클래스의 기본 프로브로 설정함으로써, 클래스 개발자는 개발자가 클래스를 잠금 상태로 만든 후에 적절한 데이터를 디스플레이하는 기본 프로브를 LabVIEW 클래스 사용자에게 제공할 수 있습니다. 사용자 프로브가 LabVIEW 클래스의 멤버여야 LabVIEW 개발자가 이를 기본 프로브로 설정할 수 있습니다.
다른 개발자와 사용자에게 LabVIEW 클래스 배포하기
개발한 LabVIEW 클래스를 다른 LabVIEW 클래스 개발자와 LabVIEW 클래스 사용자에게 배포할 수 있습니다. 클래스를 배포하는 방법에는 여러가지가 있으므로 가장 적합한 방법을 선택하도록 합니다. 어플리케이션 빌더를 사용하여 압축(Zip) 파일을 생성함으로써 하나 혹은 그 이상의 클래스를 배포할 수 있습니다. 또한 배포하기 이전에 LabVIEW 클래스 잠그기를 하여 프라이빗 데이터와 멤버 VI에 대한 LabVIEW 클래스 사용자의 접근을 제한할 수도 있습니다. 클래스를 잠그면 어플리케이션에 에러가 발생하는 것을 방지할 수 있습니다.
|
팁 .NET Framework 어셈블리를 통해 LabVIEW 클래스들에 접근할 수 있습니다. LabVIEW 는 사용자가 지정한 LabVIEW 클래스를 위해 .NET 클래스를 생성할 수 있습니다. 이 .NET 클래스들은 .NET 어셈블리를 통해서 접근하실 수 있습니다. |