FOR 루프에 대해 알아보았으니, 다른 프로그래밍 언어를 배우는 과정에서 반복문에 관한 내용만 나왔다 하면 거의 습관적으로 찾게 되는 누적하는 프로그램을 FOR 루프로 작성해 봅시다.
지금까지 알아본 내용을 바탕으로 대충 프로그램을 작성해 보면, 위 그림과 같은 프로그램을 작성할 수 있을 텐데요. 문제는 더하기 연산자의 남은 입력 핀에 어떤 데이터를 연결할 것인지가 애매할 것입니다. 조금 더 정확히 표현하자면, 값을 누적하는 문제이니까 결과값 인디케이터와 관련된 데이터를 연결해야 하는 것은 알겠으나, 어떻게 연결할 것인지가 관건이겠지요.
첫 번째로 시도할 수 있는 방법은 로컬 변수를 사용하는 방법입니다. 처음 랩뷰를 소개하는 과정에서 랩뷰는 변수 사용 없이 프로그램을 작성한다는 뉘앙스로 말씀드린 것 같지만, 랩뷰도 변수를 사용할 수 있습니다. 더 정확히 표현하자면, 프런트 패널에 컨트롤이나 인디케이터 오브젝트를 추가함과 동시에, 오브젝트의 라벨을 이름으로 사용하는 로컬 변수가 만들어지는 것이구요. 위의 그림에서 보시는 것과 같이 로컬 변수 노드를 통해 참조할 수 있도록 프로그램을 작성할 수 있습니다.
위의 그림에서 보여드리는 방법으로 로컬 변수 노드를 만들 수 있고, 함수 팔레트에서 프로그래밍 → 구조 → 로컬 변수를 통해 로컬 변수 노드를 프로그램에 추가할 수 있습니다만, 별도로 로컬 변수 노드를 프로그램에 추가할 때는 어떤 오브젝트의 데이터와 링크시킬 것인지를 지정해 주는 과정이 더 필요하기 때문에 위의 그림에서 보여드리는 방법을 개인적으로는 선호합니다.
아무튼, 로컬 변수 노드를 통해 데이터를 참조하는 방식으로 원하는 결과를 도출하는 프로그램을 작성할 수 있지만, 여기에는 3가지 문제가 있습니다.
먼저, 위 그림에서 보시는 것과 같이 로컬 변수가 이전 실행 결과를 기억한다는 점입니다. 다시 말해, 언제 어떤 상황에서 프로그램을 실행하더라도, 목표값까지만 누적된 결과를 받아보기 위해서는 결과값을 초기화하는 루틴이 포함되어야 한다는 말인데요. 이것과 유사한 형태로 참조하는 모든 데이터에 초기화 루틴을 넣어주어야 한다는 것은 생각보다 많이 귀찮은 문제일 수 있습니다.
두 번째는 랩뷰가 가지고 있는 고유의 장점을 해칠 수 있다는 점입니다. 다른 프로그래밍 언어와 비교해서, 개발자에 막 입문한 사람들도 랩뷰에 대해서는 어렵지 않게 접근할 수 있는 것은 그래픽 기반의 프로그래밍 언어라는 점도 있겠지만, 데이터가 어떻게 흘러가는지를 직관적으로 이해할 수 있다는 점도 크게 한 몫 한다고 개인적으로는 생각합니다. 그런데, 이렇게 로컬 변수 노드를 여러 곳에서 남발하는 경우에는 데이터의 흐름 자체가 직관적으로 보이지 않을 수 있습니다.
끝으로, 메모리의 사용량이 늘어난다는 점입니다. 저렇게 로컬 변수 노드를 통해 데이터를 읽어올 때는 링크되어 있는 컨트롤 또는 인디케이터 오브젝트의 데이터를 기억하는 데이터 버퍼가 추가됩니다. 다시 말해, 로컬 변수 노드를 겁나게 많이 남발하거나, 참조해야 하는 데이터가 겁나 큰 경우에는 그 만큼의 버퍼용 메모리가 사용된다는 말이기 때문에, 프로그램의 실행 속도를 느리게 만들 수 있습니다.
그렇다고 해서, 로컬 변수 자체가 아주 유해하다는 의미는 아니구요. 케이스나 이벤트 구조에서 데이터를 전달할 때는 로컬 변수가 아주 유용하게 사용될 수 있습니다. 다만, 로컬 변수 노드에는 이런 특성이 있으니 남발해서 좋을 것이 없다는 의미이기도 하면서, 같은 값이라면 메모리도 덜 잡아먹고 랩뷰의 장점도 해치지 않는 방식으로 프로그램을 작성하는 것이 어떻겠냐는 의미로 이해하시면 됩니다.
다시 내용으로 돌아와서, 두 번째로 시도할 수 있는 방법은 피드백 노드를 사용하는 방법입니다. 위 그림이 피드백 노드를 사용해서 작성한 프로그램인데요. 더하기 연산자의 출력과 남아있는 입력을 와이어로 연결하면 자동으로 피드백 노드가 만들어집니다. 이렇게 피드백 노드를 적용하게 되면, 초기값을 정의할 수 있다는 장점도 가지면서 로컬 변수 노드를 적용했을 때보다 메모리 사용 및 처리 시간이 빨라지는데요. 무엇보다 와이어만 연결하면 되니까 간편하게 만들 수 있다는 점이 가장 큰 장점이라 말씀드릴 수 있습니다.
마지막으로 시도할 수 있는 방법은 쉬프트 레지스터를 이용하는 방법입니다. 개인적으로 가장 권장하는 방법이긴 한데, 두 번째 방법인 피드백 노드를 사용하는 것보다는 손이 조금 많이 가는 방법입니다.
쉬프트 레지스터를 적용하는 과정은 그림이나 텍스트로 설명하기 보다는 영상을 통해 확인하시는 것이 훨씬 빠를 것 같아서 간단한 시연 영상을 만들었습니다. 위 영상을 참고하시면 되구요. 요약하자면, 더하기 연산의 출력을 FOR 루프의 테두리에 연결했을 때 인덱싱 터널이 생성되구요. 이 인덱싱 터널을 마우스 우클릭해서 쉬프트 레지스터로 변경하면 된다는 내용입니다.
확실히 피드백 노드에 비해 몇 단계 손이 더 가는 방식이긴 합니다만, 개인적으로 가장 권장하는 이유는 이전 반복의 결과를 선택적으로 참조할 수 있기 때문입니다. 더 정확히 표현하자면, 피드백 노드의 경우에는 n - 1번째 반복에서의 데이터만을 참조할 수 있습니다만, 쉬프트 레지스터의 경우에는 필요에 따라 n - 2번째 데이터나, n - 3번째 데이터도 참조할 수 있다는 말입니다.
방법은 간단합니다. 위 그림에서 보여드리는 것처럼, 왼쪽의 레지스터를 마우스로 우클릭하면 그림과 같은 팝업 메뉴가 나타나는데요. 여기서 원소 추가를 선택하면 동일한 레지스터가 왼쪽의 레지스터 아래에 추가됩니다. 같은 메뉴를 반복해서 실행할 경우 반복한 횟수만큼 레지스터가 왼쪽에 추가되구요. 제일 위에서부터 순서대로, n - 1, n - 2... 반복의 데이터가 전달됩니다. 따라서, 어떤 레지스터의 출력을 와이어로 연결하느냐에 따라 이전 반복의 결과를 선택적으로 참조할 수 있다는 말이지요.
'Programming > LabVIEW' 카테고리의 다른 글
Sequence 구조 (0) | 2024.05.22 |
---|---|
While 루프 (0) | 2024.05.22 |
FOR 루프와 배열 (0) | 2024.05.21 |
For 루프에 대해 알아보자. (0) | 2024.05.21 |
CASE 구조에 대해 알아보자. (0) | 2024.05.19 |