반응형
<출처 : http://javaora.tistory.com/entry/Learning-the-JavaFX-Script-Programming-Language-Lesson-9-Writing-Your-Own-Classes >

목차
- Customer 예제
- 다른 클래스로부터의 상속

- Customer 예제
Lesson 2를 통해 객체(object)를 사용하는 방법에 대해 배웠었다. 그런데 먼저 .class 파일을 다운로드 받길 요청했고, 컴파일러를 가지고 Address와 Customer 객체를 생성하는 방법에 대해 알게 되었다. 아래 예제를 통해 빠뜨린 클래스의 정의 방법에 대해 알아보자.

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();

class Address {
     var street: String;
     var city: String;
     var state: String;
     var zip: String;
}

class Customer {
     var firstName: String;
     var lastName: String;
     var phoneNum: String;
     var address: Address;

    function printName() {
        println("Name: {firstName} {lastName}");
    }

    function printPhoneNum(){
        println("Phone: {phoneNum}");
    }

    function printAddress(){
        println("Street: {address.street}");
        println("City: {address.city}");
        println("State: {address.state}");
        println("Zip: {address.zip}");
    }
}

위 예제는 변수와 함수에 대해 배울때 봐왔던 코드와 비슷하다. Address 클래스에는 street, city, state, zip 등의 인스턴스 변수들이 모두 String 타입으로 선언되어 있고, Customer 클래스에는 몇개의 인스턴스 변수와 그 값을 출력하는 변수들이 더해져 있다. 이 변수와 함수들은 클래스 내부에 선언되어져 있기 때문에 이들이 생성되는 곳 어디에서든 그 사용이 가능하다.


- 다른 클래스로부터의 상속

또한 클래스는 다른 클래스로부터 변수와 함수등을 상속받아 사용할 수 있다. 예를 들면, 은행에서 계좌에 저축하고 금액 확인하는 것은 생각해보자. 각 계좌는 계좌번호와 저축된 금액이 있다. 이 계좌에서 남은 금액을 조회하거나, 추가 예금을 하거나, 돈을 찾을 수도 있다. 이것을 변수와 함수를 가진 Account라는 클래스로 만들어 보자.

abstract class Account {

     var accountNum: Integer;
     var balance: Number;

     function getBalance(): Number {
          return balance;
     }

     function deposit(amount: Number): Void {
          balance += amount;
     }

     function withdraw(amount: Number): Void {
          balance -= amount;
     }
}

abstract 라는 키워드를 주목하자. 이 키워드의 의미는 Account 객체를 직접적으로 생성 할 수 없다는 뜻이다.(이렇게 생성한 목적은 오직 계좌에 저축을 하거나 저축금액을 확인하기 위함이다.)

accountNum 과 balance 라는 변수는 각각 계좌번호와 저축금액을 저장하게 된다. 남은 함수들은 각각 계좌에 남은 금액을 조회하거나(getBalance()), 저축을 하거나(deposit()), 출금을 하는(withdraw()) 기능만을 제공한다.

SavingsAccount 라는 클래스를 정의하자. 이 클래스는 extends 라는 키워드를 통해 변수와 함수를 상속 받는다.

class SavingsAccount extends Account {

     var minBalance = 100.00;
     var penalty = 5.00;

     function checkMinBalance() : Void {
          if(balance < minBalance){
               balance -= penalty;
          }
     }
}

SavingAccount 클래스는 Account의 서브 클래스로서 자동적으로 Account의 인스턴스 변수와 함수의 내용이 포함되며 사용 할 수 있다. 위 예에서 보듯 상속받는 클래스는 상속받는 변수와 함수외에 추가적으로 자신의 변수와 함수를 생성 할 수 있다.

Account 클래스를 상속받는 또 다른 클래스 CheckingAccount 라는 클래스를 정의해보자

class CheckingAccount extends Account {

     var hasOverDraftProtection: Boolean;

     override function withdraw(amount: Number) : Void {
          if(balance-amount<0 and hasOverDraftProtection){

               // code to borrow money from an overdraft account would go here

          } else {
               balance -= amount; // may result in negative account balance!
          }
     }
}

위 예제는 출금시 현재 저축액보다 더 많은 금액을 출금 할 수 없도록 막아 놓았다. 특이한 점은 withdraw라는 함수는 Account에 존재하는 함수로서 이를 재정의(override) 했다. 이렇게 재정의 되는 함수는 앞에 override라는 키워드를 사용하게 된다.

+ Recent posts