객체 생성
객체 생성 (Creating Objects)
make-object 프로시저는 위치 기반(positional) 초기화 인자로 새 객체를 만들고, new 형식은 이름 기반(by-name) 초기화 인자로, instantiate 형식은 위치/이름 초기화 인자를 모두 써서 새 객체를 만들어요.
본문
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를 참고하세요.