[Chapter 5] 스크립트
본문
5. 스크립트
5.1 소개 및 특징
eRun SCADA에서는 강력한 스크립트 기능을 제공합니다. 입력에 대한 빠른 반응속도와 처리를 할 수 있으며
프로젝트 개발에서 꼭 필요한 사용자 요구 사항에 유연하게 대응하기 위하여 스크립트 언어를 제공합니다.
스크립트 문법은 간결한 C언어의 문법 형식을 따르며 반드시 필요한 최소한의 문법과 키워드를 사용하기 때문에
약간의 코딩학습만으로도 강력한 스크립트 코드를 작성할 수 있습니다. 사용자의 다양한 요구를 현장에서
바로바로 구현이 가능하기 때문에 확장성이 매우 좋습니다. 자체적으로 개발된 스크립트 엔진은 10여년 이상의
현장 적용을 통해 안정적이고 창의적이고 강력한 SCADA 시스템 구축도구가 될 것입니다.
■ 기능별 독립적인 함수의 형태로 종류별 프로그램 가능
■ 작고 명료하며 제작이 간단함
■ 정수형 데이터, 실수형 데이터, 문자열 데이터, 배열 타입지원
■ 250여개의 내장함수 지원
■ 여러가지 형태의 논리연산 가능
■ 사칙연산 및 데이터형 변환 가능
■ 반복처리, 조건제어문
■ 함수에서 다른 사용자 함수 호출 가능
■ 태그데이터 조작 용이
■ 사용자 UI 오브젝트 제어
■ 상용 데이터 베이스 SQL 질의 처리
■ 애니메이션 아이콘에 대한 제어처리
■ 경보사운드 파일 재생
■ 외부 실행파일 호출 가능
■ 레지스트리 데이터 제어 가능
■ 그래프, 그리드, 리스트, 콤보, 경보내용 등 윈도우 오브젝트 제어 가능
5.2 스크립트 프로세스 및 활용
1. 스크립트 파일 생성
2. 스크립트 함수 코딩
3. 스크립트 컴파일 및 오류 검증
4. 스크립트 함수 오브젝트 연결
■ 스크립트 함수 적용 예시
스크립트 관리 화면에서 파일 하나를 생성하고 스크립트 파일 편집 화면에서 코딩 합니다.
코딩된 함수를 오브젝트에서 호출하도록 설정합니다.
■ 실행함수 오브젝트에 의한 함수호출
실행함수 속성의 표현식 부분의 결과가 TRUE이면 사용자 정의함수 MainTimer()를 1초 주기로 실행합니다.
1. 스크립트 화면에 함수 코딩
void MainTimer(){}
2. 뷰페이지 실행함수 오브젝트 추가
3. 실행함수 오브젝트 속성-호출함수 입력
■ 이미지 오브젝트 클릭시 함수호출
뷰페이지에 그려진 이미지를 선택하고 속성창에 들어가서 순서대로 체크합니다.
프로젝트 실행 시 뷰페이지의 이미지를 클릭하면 사용자가 정의한 함수 JPT_ORG_X()를 실행합니다.
5.3 스크립트 생성 및 편집
프로젝트에 새로운 스크립트 파일을 생성하고 사용자 함수를 생성 및 편집합니다.
1개의 스크립트 파일에는 무제한의 사용자 스크립트 함수를 만들 수 있습니다.
그러나 가능한 동일한 목적으로 사용되는 함수들을 모아서 스크립트 파일을 구성하는 것이 편리합니다.
프로젝트 관리자 화면에서 스크립트 매니저 항목에 마우스 우클릭을 하면 스크립트 팝업 메뉴가 나타납니다.
[새 스크립트] 클릭하면 아래 그림과 같은 다이얼로그가 표시됩니다.
입력 화면에 파일이름을 입력하고 확인 버튼을 누르면 스크립트 편집파일 이름이 추가됩니다.
※ 스크립트 파일 이름에는 특수문자를 사용할 수 없습니다.
5.4 스크립트 파일삭제
프로젝트 관리에서 현재 선택한 스크립트 파일을 삭제합니다.
프로젝트 관리에서 해당 스크립트에서 마우스 우클릭 하여 팝업 메뉴를 띄웁니다.
스크립트 삭제 메뉴를 클릭하면 아래와 같은 메시지 화면이 표시됩니다.
"예" 선택하면 스크립트 파일 'Common'을 삭제하고 파일 내에 있는 사용자 정의 스크립트 함수
모두가 삭제됩니다. "아니오" 클릭하면 스크립트 파일 삭제 작업을 취소합니다.
5.5 스크립트 파일명 변경
스크립트 파일의 이름을 변경하고자 할 때 이름변경 메뉴를 클릭하면 아래 그림과 같은
이름변경 다이얼로그가 표시됩니다. 변경이름 입력 화면에 변경하고자 하는 이름을 입력하고
확인버튼을 클릭하면 됩니다.
※ 스크립트 파일 이름에는 특수문자를 사용할 수 없습니다.
5.6 스크립트 빌드
프로젝트의 모든 스크립트를 컴파일 해서 바이너리코드를 생성합니다. 그리고 스크립트 문법에 구문 오류가 있는지
검사하고, 사용된 태그나 오브젝트가 유효한지 검증합니다.
스크립트 빌드는 도구바에서 버튼 클릭 또는 스크립트에서 마우스 우클릭하여 '스크립트 빌드' 메뉴를 선택하면 됩니다.
스크립트 컴파일이 성공적으로 끝났을 경우 표시되는 메시지 입니다.
아래의 그림은 구문에 오류가 있는 경우를 나타내며 해당 오류 메시지를 마우스 더블 클릭하면
해당 오류가 있는 위치로 이동하게 됩니다.
성공적으로 스크립트 컴파일이 되면 아래 그림과 같이 프로젝트 관리의 스크립트 편집 항목에
각각의 스크립트 파일에 정의 되어 있는 사용자 함수 리스트가 추가됩니다.
사용자가 정의한 스크립트 함수 리스트와 위치해 있는 라인 번호가 보여집니다.
해당 함수의 위치로 바로 가려면 마우스를 선택하고 왼쪽 버튼을 더블 클릭하면 이동합니다.
5.7 스크립트 편집메뉴 구성
스크립트 편집화면에 들어가면 아래와 같은 도구가 보여집니다.
컴파일, 사용자 정의 함수, 문자열 찾기, 문자열 변경, 태그리스트 보기 등을 할 수 있습니다.
[스크립트 편집 도구바]
스크립트 화면에서 마우스 우클릭하면 다음과 같이 팝업메뉴가 표시됩니다.
항목 |
설명 |
스크립트 빌드 |
현재 열려 있는 스크립트를 포함한 프로젝트에 있는 모든 스크립트를 스크립트 빌드하고 구문오류를 찾아냅니다. |
내부함수 매뉴얼 |
eRun에서 제공하는 내장 함수리스트 매뉴얼입니다. |
사용자 함수리스트 |
현재 프로젝트에 정의되어 있는 모든 사용자 스크립트 함수 리스트를 보여줍니다.
|
텍스트 바꾸기 |
특정한 문자열을 변경하고자 할 경우 사용합니다. 선택 영역에 한해서 문자열 변경을 할 수도 있고 대소문자 구별, 일치하는 문자열만 변경 할 수 있습니다.
|
태그 리스트보기 |
태그리스트 화면을 불러서 n개의 태그를 선택해서 스크립트에 삽입합니다. 태그이름 연산을 사용할 경우에는 태그명 앞에 @문자를 반드시 붙여야 합니다.
|
함수 선언위치로 이동 |
선택한 함수가 정의되어 있는 위치로 이동합니다. 사용자가 작성한 함수에 대해서 적용됩니다. |
HSMS 함수리스트 |
SECS/GEM 통신 프로젝트 개발 시 사용합니다. HSMS 라이브러리에서 제공하는 함수를 스크립트 화면에 삽입할 때 사용합니다.
왼쪽의 함수를 선택하면 우측화면에 설명이 나타납니다. 함수를 선택하면 _HSMSMethod("Start", 삽입되고 코드를 완성하면 됩니다. |
문자열 찾기 |
Ctrl + F 키를 누르면 다음과 같이 문자열 찾기 화면이 나타납니다. 프로젝트 : 문자열을 찾으려고 하는 프로젝트를 선택합니다. 찾을 문자열 : 함수이름 또는 태그명 대소문자 구별 : 대문자, 소문자 구분으로 찾을 경우 체크합니다.
찾기 버튼을 누르면 아래와 같이 해당 태그명(함수)가 입력된 위치가 나타납니다. 마우스 두번클릭하면 해당 오브젝트로 이동합니다.
|
5.8 함수의 구성
eRun SCADA 스크립트는 기능별 특정한 작업을 수행하도록 설계된 독립적인 프로그램을 처리하는 함수 단위로 구성합니다.
함수를 사용하는 목적은 프로그램에서 여러 번 사용되는 부분들을 독립된 함수로 작성하고
여러 부분에서 함수를 호출하여 사용함으로써 불필요한 중복을 없애고, 프로젝트 개발을 용이하게 하고 프로그램을 읽기 쉽게 하는데 있습니다.
5.8.1 함수형 정의
함수의 구성형태는 아래와 같습니다.
함수형 함수명(매개변수) { ... } |
함수형은 함수가 호출되고 값을 돌려주는 데이터의 형태를 의미하며, 여기에 가능한 함수형은
void, char, short, int, float, double, string 입니다.
함수명은 뷰페이지 오브젝트에서 호출하거나 스크립트 내에서 호출할 때 사용합니다. 당연히 프로젝트에서 함수명은 유일해야 합니다.
함수명의 구성은 알파벳(대소문자 혼용가능)문자열로 시작하며 32자 이내로 지정합니다.
매개변수는 함수를 호출하는 쪽에서 넘겨주는 데이터이며 0개 이상의 데이터를 지정할 수 있습니다.
함수를 호출하는 쪽과 호출 받는 쪽(처리하는 함수)의 형태는 같아야 하고 지정 방식은 약간 다릅니다.
예를 들어 호출하는 쪽의 함수는 함수형은 빠지고 함수명과 매개변수만 지정합니다. 그리고 끝 부분에 ;(세미콜론) 문자를 붙여야 합니다.
호출 받는 함수의 정의 형태는 아래와 같이 여러 형태로 사용 가능 합니다.
함수 선언 |
함수 호출 |
// 돌려주는 데이터 없음, 받는 데이터 없음. void main () { } |
main( ); |
// 돌려주는 데이터 정수형, 받는 데이터 정수형 데이터 변수 int main2 (int num) { return 100; } |
main(100); |
// 돌려주는 데이터 실수형, 받는 데이터 실수형, 문자열형, 정수형 데이터 변수 double main3 (double a, string name, int b) { return (a * b); } |
main(-99.5, "대한민국", 20000); |
// 돌려주는 데이터 문자열형, 받는 데이터 정수형 데이터 변수 string main (int tel) { return "Technology"; } |
main(1); |
5.8.2 변수의 정의
연산처리를 위하여 여러가지 형태의 변수를 선언하고 사용하는데, 변수를 선언 할 경우는 함수의 정의 부분에서
제일 위쪽에 선언하여야 하고, 데이터형은 정수형, 실수형, 문자열형 3종류의 형태가 있으며 각각의 데이터형을 따르는
배열형태의 정의도 가능합니다. 배열형이라고 하면 동일한 데이터형을 동일한 변수이름으로 n개를 가지고 있는 것을 말합니다.
정수형 : char(1바이트), short(2바이트), int(4바이트) 3종류가 지원됩니다.
실수형 : float(4바이트), double(8바이트) 2종류가 지원됩니다.
문자열 : string(4096바이트)를 사용합니다.
변수사용 형식은 아래와 같습니다.
// 변수 a, b, c 가 모두 int형 정수형 변수로 선업합니다.
int a, b, c;
// 변수 d 를 실수형 변수로 선업합니다.
double d;
// 변수 name을 문자열형 변수로 선업합니다.
string name;
// 배열 변수를 선언합니다. 79 바이트의 문자열 버퍼를 확보합니다.
char name[80];
5.8.3 변수의 크기
변수의 종류 별 표한 가능한 범위는 아래와 같습니다.
데이터 형 |
범위 |
크기 |
char |
-128 ~ +127 |
1 바이트 |
short |
-32,768 ~ +32,767 |
2 바이트 |
int |
-2,147,483,648 ~ +2,147,483,647 |
4 바이트 |
float |
3.4e-38 ~ 3.4e+38 |
4 바이트 |
double |
1.7e-308 ~ 1.7e+308 |
8 바이트 |
string |
모든 ASCII 코드 |
4,096 바이트 |
void |
변수로는 사용할 수 없고, 함수형으로 사용 |
|
5.8.4 연산자 종류
산술 계산을 위한 기본 연산자를 제공합니다.
■ 치환 연산자(=)
대입 연산자 라고도 하며, 이 연산자는 값을 치환하는 역할을 하는 연산자입니다. 예를 들어 다음 문장은
value라는 변수에 0 이라는 값을 치환합니다.
value = 0;
다시 말해서 왼쪽에는 "변수 이름"이 오게 되며 오른쪽에는 "값"이 오게 됩니다.
치환 연산자의 수행은 오른쪽에서 왼쪽으로 이루어집니다. 예를 들어
value = value + 1;
와 같은 문장은 오른쪽에 있는 value라는 변수의 값에 1을 더해서 결과값을 왼쪽의 value 변수에 대입하라는
의미가 되며 결과적으로 value의 값을 1만큼 증가시키는 결과가 됩니다.
■ 덧셈 연산자(+)
이 연산자는 좌, 우 양쪽의 값을 더하는 역할을 합니다. 예를 들어
value = 300 + 100;
와 같은 문장은 오른쪽에 있는 정수 상수 값 300과 100을 합산해서 왼쪽의 변수 value에 대입합니다.
좌, 우에 사용할 수 있는 값은 정수, 실수, 문자열등 모두 사용 가능합니다.
문자열을 사용하는 경우에는 좌측의 문자열에 우측의 문자열을 붙여서 문자열형(string)변수에 대입합니다. 예를 들어
str = "People" + "Technology";
위와 같이 하게 되면 "People" 문자열에 "Technology"문자열을 더해서 "People Technology"문자열을 변수 str에 대입합니다.
이때 str은 문자열형(string) 변수 형태로 선언되어야 합니다.
■ 뺄셈 연산자(-)
이 연산자는 왼쪽의 값에서 오른쪽의 값을 빼는 역할을 합니다. 따라서
X = Y - Z;
의 문장은 변수 Y에서 변수 Z값을 빼어 그 결과 값을 변수 X에 치환합니다. 뺄셈 연산자에서는 문자열 연산을 할 수 없습니다.
■ 곱셈 연산자(*)
곱셈연산자는 *로 나타냅니다. 따라서,
cm = 2.54 * in;
와 같은 문장은 변수 in에 실수 상수 값 2.54를 곱하고 결과 값을 변수 cm에 대입합니다.
eRun Script에서는 제곱연산자가 없음으로 제곱연산을 하기 위해서는 아래와 같이 하시면 됩니다.
value = max * max; (제곱연산)
■ 나눗셈 연산자(/)
나눗셈 연산자는 /(Slash)로 나타냅니다. 기호 왼쪽의 값을 기호 오른쪽의 값으로 나누어 줍니다.
div = 100.5 / num;
■ 연산자 우선순위
여러 수식을 가지고 연산을 하기 위해서는 연산자의 처리 순서를 정할 필요가 있습니다.
이에 따라서 eRun Script에서는 아래와 같은 순서로 산술 연산 및 논리 연산을 합니다.
( ) 부호 * / + -의 순서로 연산이 됩니다. 예를 들어
result = -(2 + 5) * 6 + (4 + 3 * (2 + 3));
result의 값은 -23이 됩니다.
■ 나머지 연산자(%)
이 연산자(modulus operator)는 정수의 연산에만 사용됩니다. 기호 왼쪽에 있는 정수 변수 또는 상수값을
기호 오른쪽의 정수 값으로 나눗셈 한 후 그 나머지를 대입합니다. 예를 들어
value = 13 % 5;
위의 문장이 실행되면 13을 5로 나눗셈 한 후 남은 숫자 3을 value에 대입합니다.
■ 증가(++), 감소(--) 연산자
증가 / 감소 연산자는 피연산자를 1씩 증가 혹은 1씩 감소 시킵니다.
가령 i++;과 같은 형태일 경우, i는 피연선자, ++은 연산자라고 합니다.
이해를 위해 아래의 표를 참고하시기 바랍니다.
연산자 |
설명 |
10 * i++ |
먼저 i와 10을 곱한 후, i의 값을 증가 시킵니다. 10 * i; i = i + 1; |
10 * i-- |
먼저 i와 10을 곱한 후, i의 값을 감소 시킵니다. 10 * i; i = i - 1; |
10 * ++i |
먼저 i의 값을 1증가 시킨 후 10을 곱합니다. i = i + 1; 10 * i; |
10 * --i |
먼저 i의 값을 1감소 시킨 후 10을 곱합니다. i = i - 1; 10 * i; |
■ 논리연산자 (AND, OR, NOT)
이 연산자는 조건문 등에서의 조건질의를 하는데 있어서 여러 조건을 동시에 질의하기 위하여 사용되며
왼쪽 오른쪽의 연산항에 대하여 논리연산을 수행합니다.
&&(AND), ||(OR), !(NOT)같이 3가지 형태의 논리적 연산을 지원합니다.
예) if( X > 0 && X < 100 ) {
// todo...
}
위의 경우 X가 0보다 크고(AND) 100보다 작을 경우 블록 문에 있는 구문을 처리하게 됩니다.
이것은 두가지 조건의 결과가 모두 참(TRUE)인 경우만 블록 구문을 처리합니다.
다음의 경우 X의 값이 0보다 작거나(OR) 100보다 큰 경우 블록 구문을 처리합니다.
이것은 두가지 조건 중 어떤 한 개의 조건이라도 만족하면 블록 구문을 처리합니다.
예) if (X < 0 || X > 100) {
// todo...
}
다음의 경우에는 X값이 50이 아니면(NOT) 블록 구문을 처리합니다.
예) if ( X != 50 ) {
// todo...
}
이러한 논리연산자는 괄호 연산자를 사용하여 여러겹으로 동시에 사용이 가능합니다.
예) if ( ( X>0 && X<100 ) || (Y>0 && Y<100) || (Z != 50)) {
// todo...
}
위의 경우에는 괄호 안에 있는 논리연산 조건을 먼저 수행하고 왼쪽부터 차례로 연산을 합니다.
■ 비트별 논리연산자 (&, |, ^)
정수형 데이터를 가지고 비트별 논리현산을 할 수 있으며, 10진수 16진수 모두 사용이 가능합니다.
이것은 정수데이터에서 특정 비트의 값을 취할 때 유용하게 사용할 수 있습니다.
value = 0X0000;
value2 = value & 0XFFFF;
value3 = value | 65535;
value4 = 0XFF00 ^ 0x00FF;
위와 같은 경우 변수 value의 값과 16진 상수값 FFFF를 비트 연산합니다. 결과를 변수 value2에 대입하며
값은 0이 됩니다. 그리고 변수 value의 값과 65535(0xFFFF) 10진수 상수값과 OR(|)연산을 수햏하고 결과를
변수 value3에 대입합니다. 결과는 65535(0XFFFF)가 됩니다.
마지막의 연산에서는 왼쪽의 16진 상수값 0XFF00과 오른쪽의 16진 상수값 0X00FF값을 서로 ^(XOR)한 후
결과를 변수 value4에 대입합니다. 결과는 0XFFFF(65535)가 됩니다.
■ 시프트 연산자 ( << , >> )
정수형 데이터에 대하여 왼쪽 또는 오른쪽으로 지정된 비트 수 만큼 이동시킨 결과를 되돌려 줍니다.
// 1에 대한 정수값을 왼쪽으로 1비트만큼 이동시킨 결과를 value에 저장합니다.
value = 0X0001 << 1; => value에는 0ㅌ0002가 저장됩니다.
// 0x8000에 대한 정수값을 오른쪽으로 1비트만큼 이동시킨 결과를 value에 저장합니다.
value = 0x8000 >> 1; => value에는 0ㅌ4000이 저장된다.
5.8.5 예약어 및 기본문법
■ 흐름제어문(if문, else문)
어떠한 조건에 따라서 스크립트 실행의 방향을 바꾸기 위한 것으로 여러 관계연산자와 논리연산자 그리고
산술연산자의 조합으로 저건절을 이끌어 내며 그에따른 수행상태가 변하게 됩니다.
여기에 주로 사용되는 예약어로는 if문 else문으로 둘을 조합해서 사용할 수도 안 할수도 있습니다.
if문의 구조
if ( 조건수식 ) {
문장
}
일반적으로 if의 조건수식에는 비교수식이 들어갑니다. (예를 들면, x>y 또는 c==6 등). 만약 수식의 값이 참이면
(즉, x가 y보다 크다, c의 값이 6이다) 수식의 값이 1이 되고 그 밑의 문장이 수행됩니다. 참이 아니면, 그 밑의 문장은
무시되고 그 다음으로 수행이 옮겨집니다. 앞에서 모든 수식은 값을 가진다고 하였습니다. 이 때에도 if에 연결된 수식이
참이면 1의 값을 갖고, 거짓이면 0을 갖습니다.
조건수식이 참을 수행하는 문장은 하나 이상일 수도 있습니다. 그 때는 물론, 다음과 같이 괄호 { }로 묶어주고
복합명령문이라고 합니다.
if( score > big ) // 단순 명령문
result = 1;
if ( value > 100 ) { // 복합 명령문
num++;
result = 100;
}
if와 else의 구조문.
if( 조건수식 )
수행할 문장.
else
수행할 문장.
if만 쓰일 때는 수식이 거짓일 경우 아무것도 하지 않았습니다. 하지만, if-else문의 경우는 수식이 거짓이면
else밑의 문장을 수행합니다. 다시 말해서 수식이 참이냐, 거짓이냐에 따라서 두가지 문장중의 하나를 선택할 수 있다는 것입니다.
■ 다중선택의 if와 else문의 구조문
if( 조건수식 )
수행할 문장 A.
else if( 조건수식 )
수행할 문장B.
else
수행할 문장C.
첫줄에서 if문의 수식이 참일 경우 수행할 문장 A를 수행하고, 그렇지 않고 else if문의 수식이 참이면 수행할 문장
B를 수행하며, 첫번째 두번째 수식이 모두 거짓일 경우 마지막 문장 C가 수행됩니다.
■ 관계연산자와 수식
관계연산자는 주로 두개의 수식값을 비교하기 위해서 사용합니다. 이 비교수식에서 사용되는 변수의 데이터형은
정수형, 실수형, 문자열 비교등이 사용되며, 가능하면 두개의 데이터형을 동일하게 사용하는 것이 안정성 있게
사용할 수 있습니다. 예를 들어서 정수형의 데이터와 실수형의 데이터를 비교하게 되면 계산시의 오차로 인하여
==, !=, >=, <= 등의 연산을 알아보기 어렵게 되는 경우가 발생 할 수 있습니다. 특히 주의하여 주시기 바랍니다.
관계 연산자(비교연산자)로 사용되는 기호로는 아래와 같습니다.
연산자 |
설명 |
A < B | A가 B보다 작으면 |
A <= B | A가 B보다 작거나 같으면 |
A == B | A와 B가 같으면 |
A >= B | A가 B보다 크거나 같으면 |
A > B | A가 B보다 크면 |
A != B | A가 B와 같지 않으면 |
관계수식에서 비교연산의 결과가 참인 경우만 해당 if 또는 else if의 수행문장을 수행하게 되는데, 참이라는 의미는
어떤 연산 결과값이 0이면 거짓이고 그렇지 않고 0이 아닌 경우 참이 되는것입니다.
위의 연산자에 A와 B에는 정수값, 실수값, 문자열값 등이 올 수 있습니다.
예)
if ( a == 100) // a값이 100이면
//구문수행
else if ( name == "SBP")
// 구문수행
else if ( val >= 123.5 )
//구문수행
그러나 문자열을 비교할 경우에는 ==(같음), !=(다름) 관계연산자만 사용 가능합니다.
■ 논리연산자와 관계연산자
논리연산자는 위에서 설명하였듯이 &&(AND), ||(OR), !(NOT)연산자를 말하며,
관계연산자와 혼용해서 사용할 수 있습니다.
복합적인 조건에 대하여 제어를 하고자 할 경우 사용합니다.
■ 반복문(while)
반복문 while의 사용문법은 아래와 같습니다.
while( 조건 수식 )
수행문장.
위와 같이 반복 예약어인 while문은 조건수식이 참인 경우 계속적으로 루프(LOOP)를 돌면서 수행문장을 실행합니다.
조건수식이 거짓일 경우에만 루프에서 빠져나오게 되므로 주의하지 않으면 무한루프를 돌게 되면서 실행이 중단될 수도 있습니다.
사용에 있어서 각별히 주의를 하시기 바랍니다.
while문도 여러개의 반복문으로 중첩이 될 수 있으며 수행해야 할 부분이 많은 경우 괄호 { }를 사용하여 수행 블록을 코딩할 수 있습니다.
while문은 조건수식이 참인 경우는 정상적으로 괄호 안에 있는 문장이 수행되지만, 반대로 거짓일경우는 한번도 수행하지 않을 수 있습니다.
조건수식에는 if-else구문에서와 마찬가지로 관계연산자를 사용할 수 있으며 또한 논리연산자도 사용가능합니다.
int a;
string str;
a = 0;
while( a < 100 ) {
str = _NumToStr(a);
_MsgBox(str, "결과", 0, 0);
a++;
}
위의 구문은 정수형 변수 a를 선언하고, 문자열 변수 str을 선언합니다. 그리고 변수 a에 초기값을 0으로 대입하고
루프로 들어가서 a가 100보다 작으면 괄호 { }안의 문장을 수행합니다.
수행하는 첫번째 문장은 정수값 a의 현재값을 문자열로 변환해서 변수 str에 대입합니다. 그리고 결과를 화면에 메시지박스를 띄워서 보여집니다.
그리고 변수 a의 값을 1만큼 증가시킵니다.
다시 while문으로 들어가서 while문으로 들어가서 조건수식을 검사하는데, 다시 a의 값이 100보다 작은지를 판단하면서 이 조건이 거짓
(a가 100보다 큰 경우)이 되면 루프를 빠져나오게 됩니다.
int a;
string str;
a = 0;
while ( 1 ) {
if( a >= 100 ) break;
str = _NumToStr(a);
_MsgBox(str, "결과", 0, 0);
a++;
}
위의 문장은 문장에 if 조건문과 루프를 빠져 나오게 하는 break문을 추가해서 수정하였습니다.
결과는 이전코드와 동인한 수행결과가 나옵니다.
■ 루프의 탈출
무한루프(while)을 돌다가 적당한 조건이 맞았을 경우 루프를 빠져 나오기 위해서 break를 사용합니다.
이 break예약어는 반드시 괄호 { }블록으로 묶여있고 루프구조에서만 사용할 수 있습니다.
■ 누적치환 연산자(+=, -=, *=, /=)
기본적으로 치환 연산자는 = 으로서 이것은 오른쪽의 값을 왼쪽의 변수에 대입하기 위해서 사용하는 연산자입니다.
이와 유사하게 변수의 값이 일정한 차이 또는 일정한 비율로 변화할 때 사용할 수 있는 간단한 연산자를 제공합니다.
아래에 여러가지 사용 예가 있습니다.
value +=20은 value = value + 20과 같은 의미입니다.
value -=20은 value = value - 20과 같은 의미입니다.
value *=20은 value = value * 20과 같은 의미입니다.
value /=3.5는 value = value / 3.5와 같은 의미입니다.
이상의 누적치환 연산자는 증가, 감소연산자와 유사하지만, 증가,감소 연산자는 변수의 값을 1만큼씩만 변화시킨다는 점이 다릅니다.
댓글목록 0