객체 생성

객체 생성 (Creating Objects)

make-object 프로시저는 위치 기반(positional) 초기화 인자로 새 객체를 만들고, new 형식은 이름 기반(by-name) 초기화 인자로, instantiate 형식은 위치/이름 초기화 인자를 모두 써서 새 객체를 만들어요.

출처: Racket Reference - Creating Objects

본문

make-object 프로시저는 위치 기반 초기화 인자로 새 객체를 만들고, new 형식은 이름 기반 초기화 인자로, instantiate 형식은 위치 기반과 이름 기반 초기화 인자를 모두 써서 새 객체를 만들어요.

새로 만든 객체의 모든 필드는 처음에 특별한 #<undefined> 값(Void 참조)에 바인딩됩니다. 기본값 표현식을 가진 초기화 변수(값이 제공되지 않은 것)도 #<undefined>로 초기화돼요. 인자 값을 초기화 변수에 할당한 뒤, field 절, 인자가 제공되지 않은 init-field 절, 인자가 제공되지 않은 init 절, private 필드 정의, 그리고 그 밖의 표현식에 있는 식들이 평가됩니다. 그 표현식들은 클래스 표현식에 나타난 순서대로 왼쪽에서 오른쪽으로 평가되죠.

표현식 평가 도중 어느 시점에, 슈퍼클래스가 선언한 초기화는 super-make-object 프로시저, super-new 형식, 또는 super-instantiate 형식을 사용해 한 번은 반드시 평가되어야 해요.

클래스에 대한 이름 기반 초기화 인자 중 일치하는 초기화 변수가 없는 것은, 명시적 인자 뒤에 암묵적으로 super-make-object, super-new, 또는 super-instantiate 호출의 이름 기반 인자로 추가됩니다. 같은 이름에 여러 초기화 인자가 제공되면 첫 번째(있는 경우)가 사용되고, 사용되지 않은 인자는 슈퍼클래스로 전파돼요. (변환된 위치 기반 인자는 항상 명시적 이름 기반 인자 앞에 놓인다는 점을 기억하세요.) object% 클래스의 초기화 프로시저는 초기화 인자를 0개 받아들여요. 만약 이름 기반 초기화 인자를 하나라도 받으면 exn:fail:object 예외가 발생합니다.

상속 계층의 어떤 클래스에서도 슈퍼클래스의 초기화를 호출하지 않고 초기화의 끝에 도달하면 exn:fail:object 예외가 발생해요. 또한 슈퍼클래스 초기화를 두 번 이상 호출해도 exn:fail:object 예외가 발생합니다.

슈퍼클래스에서 상속받은 필드는 슈퍼클래스의 초기화 프로시저를 호출하기 전까지 초기화되지 않아요. 반대로 모든 메서드는 객체가 만들어지자마자 사용할 수 있습니다. 메서드의 오버라이딩은 초기화의 영향을 받지 않죠(C++의 객체와는 다릅니다).

프로시저

(make-object class init-v ...)object?

class : class?, init-v : any/c

class의 인스턴스를 만들어요. init-v들은 초기화 인자로 전달되어, Initialization Variables에 설명된 대로 새로 만든 객체의 class 초기화 변수에 바인딩됩니다. class가 클래스가 아니면 exn:fail:contract 예외가 발생해요.

문법

(new class-expr (id by-name-expr) ...)

class-expr의 값(클래스여야 함)의 인스턴스를 만들고, 각 by-name-expr의 값을 해당 id에 대한 이름 기반 인자로 제공해요.

문법

(instantiate class-expr (by-pos-expr ...) (id by-name-expr) ...)

class-expr의 값(클래스여야 함)의 인스턴스를 만들고, by-pos-expr들의 값을 위치 기반 초기화 인자로 제공해요. 게다가 각 by-name-expr의 값을 해당 id에 대한 이름 기반 인자로 제공합니다.

프로시저

(dynamic-instantiate cls pos-vs named-vs)object?

cls : class?, pos-vs : list?, named-vs : (listof (cons/c symbol? any/c))

(apply make-object cls pos-vs)와 같지만, pos-vs가 제공하는 위치 기반 인자에 더해 named-vs가 이름 기반 인자를 제공해요.

예시:

(define point% (class object% (super-new) (init-field x y)))

(define p (dynamic-instantiate point% '(1) '([y . 2])))

(get-field x p)1

(get-field y p)2

버전 8.8.0.1 (패키지 base)에서 추가됨.

문법

super-make-object

위치 기반 인자를 받아 슈퍼클래스 초기화를 호출하는 프로시저를 만들어 내요. 자세한 내용은 Creating Objects를 참고하세요.

super-instantiate

지정된 위치 기반과 이름 기반 인자로 슈퍼클래스 초기화를 호출해요. 자세한 내용은 Creating Objects를 참고하세요.

문법

(super-new (id by-name-expr ...) ...)

지정된 이름 기반 인자로 슈퍼클래스 초기화를 호출해요. 자세한 내용은 Creating Objects를 참고하세요.

더 알아보기