반응형

<출처: http://javaora.tistory.com/entry/Learning-the-JavaFX-Script-Programming-Language-Lesson-4-Data-Types >

목차
- String
- Number and Integer
- Boolean
- Duration
- Void
- Null

* String

String은 홑('') 또는 겹(쌍, "") 따옴표로 선언한다.

var s1 = 'Hello';
var s2 = "Hello";

홑/겹따옴표는 대칭적으로 홑따옴표 사이에 겹따옴표를 넣거나, 반대로 겹따옴표 안에 홑따옴표를 포함시킬 수 있다. 홑 따옴표와 겹따옴표 사이의 차이는 없다.

추가적으로 String 내부에 중괄호({})를 이용하여 expression 를 사용하는 것도 가능하다.

def name = 'Joe';
var s = "Hello {name}"; // s = 'Hello Joe'

내포된 expression 은 그 자신 안에 따옴표로 둘러싸인 String을 사용 할 수 있으며, 그 String 안에 또 다른 expression 을 포함 시킬 수도 있다.

def answer = true;
var s = "The answer is {if (answer) "Yes" else "No"}"; // s = 'The answer is Yes'

런타임(runtime) 시에, 컴파일러는 answer 의 값에 따라 적절히 Yes 와 No 를 선택하게 된다.

여러개의 String을 연결하는 작업은 따옴표 내에 중괄호들을 사용하여 연결한다.

def one = "This example ";
def two = "joins two strings.";
def three = "{one}{two}"; // join string one and string two
println(three); // 'This example joins two strings.'


* Number and Integer

Number 와 Integer 는  수적인(numerical) 데이터를 나타내며, 대부분의 경우 값을 할당하면 컴파일러에서 자동으로 추론하여 올바른 형(type)을 선택한다.

def numOne = 1.0; // compiler will infer Number
def numTwo = 1; // compiler will infer Integer

물론 정확한 변수의 타입을 지정 할 수도 있다.

def numOne : Number = 1.0;
def numTwo : Integer = 1;

Number 는 부동소수점 숫자를 나타내며, Integer 는 오직 정수를 표시한다. 따라서 Number는 정밀한 부동소수점 계산시 필수적인 것이고, 일반적인 경우 대부분 Integer를 사용하면 될 것이다.


* Boolean

Boolean 형은 true 와 false 라는 두가지 값(상태)를 나타낸다. 이 형식은 어떤 애플리케이션의 특정 내부적인 상태를 나타내기에 좋으며 주로 조건문의 값을 선택할때 많이 사용된다.

var isAsleep = true;
if (isAsleep) { wakeUp(); }

위 조건문의 괄호("()")안의 값이 true 이면 중괄호({}) 내부의 함수 호출 문장이 실행된다. 조건문과 관련한 좀 더 자세한 사항은 다음시간의 Expression 편에서 알아보도록 하겠다.


* Duration

Duration 형은 고정된 단위시간(밀리초, 초, 분, 시간 등) 을 나타낸다.

5ms; // 5 milliseconds
10s; // 10 seconds
30m; // 30 minutes
1h; // 1 hour

Duration 형은 시간단위(time literals) 와 함께 표시된다. - 예를들면, 5m에서 m은 분(minute) 을 나타낸다. 시간단위는 대부분 애니메이션을 사용할 때 필요로 한다.(애니메이션과 관련된 사항은 차후 레슨에서 배우게 될것이다.)


* Void

Void는 함수의 리턴 형이 없는 것을 나타낼때 사용된다.

function printMe() : Void {
     println("I don't return anything!");
}

위 코드는 명시적으로 함수의 리턴형을 생략하는 것과 동일하다.

function printMe() { 
     println("I don't return anything!"); 
}

JavaFX의 Void 키워드는 대문자 V로 시작된다. Java의 경우 소문자 void로 사용하는데 주의해야 한다.

* Null

Null은 특수한 값(value)으로 값이 없는 상태를 나타내는 값이다. Null은 0이나 빈 String 값("")과는 다르다. Null을 0이나 빈 String 값과 비교한 결과는 false 이다.(같지 않다.)

Null 키워드는 비교하는 것은 가능하며, 일반적으로 아래와 같은 형식으로 사용된다.

function checkArg(arg1: Address) {
     if(arg1 == null) {
          println("I received a null argument.");
     } else {
          println("The argument has a value.");
     }
}

위 함수는 하나의 인자를 받아 인자의 값이 null인지를 체크하고 결과를 프린트한다.
반응형
<출처 : http://javaora.tistory.com/entry/Learning-the-JavaFX-Script-Programming-Language-Lesson-3-Using-Objects >

목차
- 객체란?
- 객체구(Object Literal) 선언
- 객체구 문법
- 인스턴스(Instance) 함수 호출

* 객체(Object)란?

객체란 무엇인가? 객체는 상태와 행동으로 구성된 개별의 소프트웨어 꾸러미이다. 간단히 말해 :

  • 객체의 상태는 자신의 변수를 나타낸다.
  • 객체의 행동은 자신의 함수를 나타낸다.
개념적으로 버튼, 체크박스, 레이블 같은 GUI 컴포넌트부터 보이지 않는 추상적 개념의 날씨 데이터, 재정 상태, 상품 등록 정보 등의 어떤것이든 객체로 만들어 낼 수 있다. 

Note : 좀 더 많은 정보를 알고 싶으면 자바 튜터리얼 의  "객체란 무엇인가" 를  보도록 하자.

* 객체구 선언(= 객체 생성, 인스턴스 생성)

JavaFX 스크립트 개발언어에서는 객체는 객체구(object literal) 로서 생성된다.(인스턴스를 생성한다. - 본 글에서 "객체를 생성한다"와 "인스턴스를 생성한다" 는 동일한 의미로 보면 된다.)


Address {
     street: "1 Main Street";
     city: "Santa Clara";
     state: "CA";
     zip: "95050";
}


위 예제는 가상의 주소록 애플리케이션에서 사용되는 Address 객체를 생성한다. 본 소스를 적당한 이름을 저장하고 컴파일 하면 다음과 같은 에러가 발생한다.
  

위 코드는 마치 자바 문법의 생성자와 비슷하며 다음과 같은 의미로 보면 된다.

new Address("1 Main Street", "Santa Clara", "CA", "95050");

그리고 위 에러는 참조해야할 Address 클래스가 존재하지 않아 발생한 문제이다.

위 Address.zip 을 다운받아 풀면 두개의 .class 파일과 하나의 AddressBook.fx 파일이 있다.(AddressBook.fx 는 위 코드와 동일한 내용이다.)

이제 다시 컴파일 해보자.


이젠 아무런 에러없이 컴파일이 될 것 이다.


* 객체구 문법 

객체구의 문법은 배우기 쉽고 직관적인 사용이 가능하다.

Address {
     street: "200 Pine Street",
     city: "San Francisco",
     state: "CA",
     zip: "94101",
}
Address {
     street: "200 Pine Street"
     city: "San Francisco"
     state: "CA"
     zip: "94101"
}
Address {
     street: "200 Pine Street",
     city: "San Francisco",
     state: "CA",
     zip: "94101",
}

위 코드에서 첫번째 단어 Address는 생성하려는 객체의 타입을 나타낸다. 중괄호 내부의 블럭은 객체의 내용을 정의하며, 변수들은 각각 객체의 멤버변수를 초기화 시킨다. 객체구를 선언할때는 인스턴스의 멤버변수를 콤마나 빈칸 또는 세미콜론으로 구분된다.

또한 아래와 같은 방식으로 생성된 객체를 변수에 할 당 할 수도 있다.

def addressOne = Address {
     street: "1 Main Street";
     city: "Santa Clara";
     state: "CA";
     zip: "95050";
}

def addressTwo = Address {
     street: "200 Pine Street";
     city: "San Francisco";
     state: "CA";
     zip: "94101";
}

또한 아래 코드와 같이 객체 내부에 다른 객체를 포함 시킬 수도 있다.

def customer = Customer {
     firstName: "John";
     lastName: "Doe";
     phoneNum: "(408) 555-1212";
     address: Address {
          street: "1 Main Street";
          city: "Santa Clara";
          state: "CA";
          zip: "95050";
     }
}

위 코드에서 Customer 객체는 원 address 라고 명명된 변수에 할당된 Address 객체를 포함한 몇가지 새로운 변수들을 가지고 있다. 내포된 객체(nested object) 구문은 일반적으로 많이 사용되는 형식이다.

아래 Customer.zip을 다운로드 받아 위에서 다운받은 Address.zip 과 같은 곳에 압축을 푼다. 그리고 위 코드를 적당한 이름으로 저장 후 컴파일 하면 제대로 컴파일 되는 것을 알 수 있다.


* 인스턴스(Instance) 함수 호출

JavaFX에는 함수(function)이 포함된  사용가능한 많은 클래스들이 있다. 일단 함수를 생성하는 방법은 다음 레슨에서 살펴볼 것이며, 이번엔 먼저 존재하는 함수를 어떻게 사용하는지에 대해 알아보자.

객체의 인스턴스 함수(instance function)는 객체명 다음에 마침표(.)를 붙이고 다음에 호출하기 원하는 함수명을 입력하여 호출한다.

def customer = Customer {
     firstName: "John";
     lastName: "Doe";
     phoneNum: "(408) 555-1212";
     address: Address {
          street: "1 Main Street";
          city: "Santa Clara";
          state: "CA";
          zip: "95050"; }
}
customer.printName();
customer.printPhoneNum();
customer.printAddress();

그 결과는 아래와 같다.

Name: John Doe
Phone: (408) 555-1212
Street: 1 Main Street
City: Santa Clara
State: CA
Zip: 95050

아마 위 코드를 보고 이런 의문을 갖게 될것이다.
"저 함수 이름은 어디서 온거지? 내가 객체속에든 인스턴스 변수나 함수명을 어떻게 한번에 알 수가 있겠어?"
만약 library나 클래스를 사용하고 싶다면, API 문서를 참고하면 된다. API 문서에는 객체들의 변수명과 함수명이 리스트업 되어 있다. API 문서를 참고하는 것만이 주어진 객체의 기능을 파악 할 수 있는 가장 확실한 방법이다.

반응형

목차

- 간단한 계산기 작성
- 스크립트 변수 선언
- 스크립트 함수 정의 및 호출
- 스크립트 함수에 인자 넘기기
- 스크립트 함수의 리턴 값
- Command-Line 인자 접근

* 간단한 계산기 작성

에디터를 열고 아래 코드를 입력한다.

def numOne = 100;
def numTwo = 2;
var result;

add();
subtract();
multiply();
divide();

function add() {
     result = numOne + numTwo;
     println("{numOne} + {numTwo} = {result}");
}

function subtract() {
     result = numOne - numTwo;
     println("{numOne} - {numTwo} = {result}");
}

function multiply() {
     result = numOne * numTwo;
     println("{numOne} * {numTwo} = {result}");
}

function divide() {
     result = numOne / numTwo;
     println("{numOne} / {numTwo} = {result}");
}



컴파일과 실행은 자바와 유사함을 알 수 있다.

* 스크립트 변수 선언

이제 calculator.fx 를 자세히 들여다 보자.(차후 이 예제를 확장 할 것이다.)

코드의 첫번째 부분은 변수의 선언으로 시작된다.

def numOne = 100;
def numTwo = 2;
var result;

스크립트의 변수 선언엔 var 와 def 키워드 두가지가 사용된다. var 는 스크립트 전체에 통해 계속적으로 새로운 값을 할당 할 때 사용하며(그야말로 진정한 변수이다.), def 는 변수 선언 처음에 값을 할당하여 상수로서 사용되어진다.

위 코드에서도 계속적으로 사용되어질 상수와 같은 값은 def 로 선언하고 초기값을 할당하였고, 매 계산시 마다 값을 저장할 result 는 var 로 선언하고 초기화하지 않음을 알 수 있다.

우리는 result 변수에 숫자만 들어간다는 타입설정을 하지 않았음에도 컴파일시 문제가 없다. 이는  컴파일러가 사용자가 작성한 코드상의 변수의 사용을 보고 그 의도를 파악하여 자동으로 타입을 계산(추측) 해낸다. 이를 형 추론(Type Inference)라 한다. 이 형 추론은 스크립트 프로그래머에게 데이터 타입 선언이라는 짐을 덜어주므로서 당신의 일을 좀 더 쉽게 해준다.

* 스크립트 함수 정의 및 호출

소스의 남은 부부은 두 숫자의 덧셈/뺄셈/곱셈/나눗셈 의 스크립트 함수를 정의한다.

function add() {
     result = numOne + numTwo;
     println("{numOne} + {numTwo} = {result}");
}
...

함수는  특정 업무를 수행하는 실행가능한 코드의 블럭이다. 이 예에서 각 함수는 4칙연산중 하나를 수행하고 그 결과를 프린트 한다. 함수로 코드를 구조화(블럭화) 하는 것은 일반적인 것으로서 이는 프로그램을 읽기 쉽고, 쓰기 쉽고, 디버그 하기 쉽게 만들어 준다. 함수의 몸체(body)부분은 중괄호(brace)를 이용해 시작과 끝을 나내 가독성을 높인다.

함수는 명시적으로 호출(invoke)되기 전까지 실행되지 않는다. 이는 스크립트상 어느 위치에서든 함수가 실행 가능하게 만든다. 함수를 호출하는 것은 함수를 선언하기 전이든 후든 큰 문제가 되지 않는다. 위 예제에서도 함수가 실제 소스코드상에 선언되기 전 호출되어지고 있다.

함수의 호출은 아래와 같다.

add();
subtract();
multiply();
divide();


* 스크립트 함수에 인자 넘기기

다음으로 이전의 calculator.fx 의 함수를 인자(arguments)를 받도록 수정 해보자. 인자는 함수를 호출하면서 함수로 넘기는 특정 값(specific value)이다. 이 수정으로 위 사칙연산 함수는 하드코딩된 고정된 값이 아닌 어떤 임의의 두 숫자라도 계산을 할 수 있게 해준다.

var result;

add(100,10);
subtract(50,5);
multiply(25,4);
divide(500,2);

function add(argOne: Integer, argTwo: Integer) {
     result = argOne + argTwo;
     println("{argOne} + {argTwo} = {result}");
}

function subtract(argOne: Integer, argTwo: Integer) {
     result = argOne - argTwo;
     println("{argOne} - {argTwo} = {result}");
}

function multiply(argOne: Integer, argTwo: Integer) {
     result = argOne * argTwo;
     println("{argOne} * {argTwo} = {result}");
}

function divide(argOne: Integer, argTwo: Integer) {
     result = argOne / argTwo;
     println("{argOne} / {argTwo} = {result}");
}

컴파일 후 재실행 한 결과는 아래와 같다.


위 코드에는 제일 위에 정의된 numOne 과 numTwo 변수가 더 이상 필요가 없어 삭제되었다. 대신 함수에 정의된 인자를 통해 두 숫자를 넘겨 받도록 수정 되었다. 각 인자는 각각의 이름과 콜론(:) 로 구분된 타입으로 나타내진다. 하나 이상의 인자는 콤마(,)로 구분한다.

* 스크립트 함수의 리턴 값

함수는 선택적으로 값을 함수를 호출한 코드로 리턴할 수 있다. 예를 들면, add 함수의 결과 값이 리턴되도록 수정 되어질 수도 있다. - Bold 표시 참고

function add(argOne: Integer, argTwo: Integer) : Integer {
     result = argOne + argTwo;
     println("{argOne} + {argTwo} = {result}");
     return result;
}

이 add 함수는 아래와 같이 사용한다.

var total;
total = add(1,300) + add(23,52);

리턴되는 값이 없는 경우 함수는 default 로 Void 를 리턴한다.

* Command-Line 인자 접근

우리는 위 코드를 command-line 인자를 받아들이도록 수정 할 수도 있다. 이를 통해 런타임시 계산되는 숫자를 입력 할 수 있다.

var result;

function run(args : String[]) {

     // Strings 을 Integers 로 변환
     def numOne = java.lang.Integer.parseInt(args[0]);
     def numTwo = java.lang.Integer.parseInt(args[1]);

     // 함수 호출 
     add(numOne,numTwo);
     subtract(numOne,numTwo);
     multiply(numOne,numTwo);
     divide(numOne,numTwo);
}

function add(argOne: Integer, argTwo: Integer) {
     result = argOne + argTwo;
     println("{argOne} + {argTwo} = {result}");
}

function subtract(argOne: Integer, argTwo: Integer) {
     result = argOne - argTwo;
     println("{argOne} - {argTwo} = {result}");
}

function multiply(argOne: Integer, argTwo: Integer) {
     result = argOne * argTwo;
     println("{argOne} * {argTwo} = {result}");
}

function divide(argOne: Integer, argTwo: Integer) {
     result = argOne / argTwo;
     println("{argOne} / {argTwo} = {result}");
}

위 소스를 보면 눈에 띄는 점이 있는데 바로 run() 함수 블럭의 추가이다. 이 run() 함수는 일반적인 함수와는 다른 특별한 함수로 모든 스크립트의 시작점이 된다.(Java의 main() 함수와 같은 역할을 한다.) run() 함수는 모든 command-line 인자를 args 라는 String 형의 시퀀스(Sequence)에 저장해두고 있다.(Sequence는 순서가 있는 리스트로서 다른 언어의 배열과 비슷하다. 시퀀스는 세부적으로 Expressions 와 Operators로 나뉜다. - Lesson 6과 7 에서 상세히 설명함.)

이 스크립트를 실행하려면, 계산하려는 두 숫자를 런타임시 입력해야 한다. 실행 결과는 아래와 같다.


이번 소스에도 numOne과 numTwo 변수가 있다. 하지만 이번에 변수의 Scope는 run() 메소드 안으로 제한된다. 이 calculator 함수는 숫자를 인자로 받으므로 String 형식의 command-line 인자를 Integer로 컨버팅 한다. 이때 Java API의 도움을 받아 형변환을 수행한다.
run() 함수는 명시적으로 입력하지 않더라도 컴파일러가 컴파일시 자동으로 run() 함수를 생성한다. 마치 자바의 생성자 처럼 말이다. 따라서 컴파일된 bytecode 상에선 run() 함수를 명시한것과 명시하지 않을 것 사이의 큰 차이는 없다.

+ Recent posts