클래스와 객체

클래스와 객체 (Classes and Objects)

클래스와 객체 시스템은 필드·메서드·초기화를 한데 묶어 객체 지향 프로그래밍을 가능하게 해 주는 Racket의 핵심 기능이에요. racket/class 라이브러리가 이 시스템을 제공합니다.

출처: Racket Reference - Classes and Objects

본문

( require racket/class ) — 패키지: base

이 절에서 문서화한 바인딩은 racket/classracket 라이브러리가 제공하지만, racket/base는 제공하지 않아요.

*클래스(class)*는 다음을 명세합니다.

  • 필드(field)의 모음;
  • 메서드(method)의 모음;
  • 필드를 위한 초기값 표현식; 그리고
  • 초기화 인자에 바인딩되는 초기화 변수.

클래스 시스템의 맥락에서 *객체(object)*는 클래스 설명에 따라 인스턴스화되는 필드에 대한 바인딩의 모음이에요.

클래스 시스템은 프로그램이 상속(inheritance), 오버라이딩(overriding), 보강(augmenting)을 사용해 기존 클래스(슈퍼클래스, superclass)를 바탕으로 새 클래스(파생 클래스, derived class)를 정의할 수 있게 해 줍니다.

  • 상속: 파생 클래스의 객체는 파생 클래스의 슈퍼클래스가 선언한 메서드를 지원하고 필드를 인스턴스화하며, 파생 클래스 표현식에 선언된 메서드와 필드도 함께 지원·인스턴스화해요.
  • 오버라이딩: 슈퍼클래스에 선언된 일부 메서드는 파생 클래스에서 대체할 수 있어요. 슈퍼클래스 안의 오버라이드된 메서드에 대한 참조는 파생 클래스의 구현을 사용합니다.
  • 보강: 슈퍼클래스에 선언된 일부 메서드는 파생 클래스에서 단순히 확장만 할 수 있어요. 슈퍼클래스 메서드는 구체적으로 파생 클래스의 보강 메서드에 위임합니다.

*인터페이스(interface)*는 클래스가 구현해야 하는 메서드 이름들의 모음인데, 일부 메서드에는 기본 구현(default implementation)이 있을 수 있고 *파생 요구사항(derivation requirement)*이 결합되어 있어요. 클래스가 인터페이스를 *구현(implements)*한다는 것은 다음을 뜻합니다.

  • 인터페이스의 각 메서드에 대해 공개 메서드를 선언(또는 상속)하며(인터페이스 안에 구현이 없는 메서드의 경우),
  • 인터페이스가 요구하는 클래스에서 파생되었고(요구가 있다면),
  • 인터페이스를 구현하겠다는 의도를 명시적으로 선언합니다.

클래스는 얼마든지 많은 인터페이스를 구현할 수 있어요. 파생 클래스는 슈퍼클래스가 구현하는 어떤 인터페이스든 자동으로 구현합니다. 각 클래스는 또한 그 클래스와 연관된 암묵적으로 정의된 인터페이스도 구현해요. 그 암묵적 인터페이스는 클래스의 모든 공개 메서드 이름을 담고 있으며, 인터페이스의 다른 모든 구현이 그 클래스에서 파생되도록 요구합니다. 클래스가 인터페이스를 구현하는데 그 인터페이스에 기본 구현이 있는 메서드의 구현을 명시적으로 선언하지 않으면, 그 기본 구현이 클래스에 사용돼요.

새 인터페이스는 추가 메서드 이름으로 하나 이상의 인터페이스를 *확장(extend)*할 수 있어요. 확장된 인터페이스를 구현하는 각 클래스는 원래 인터페이스들도 구현합니다. 원래 인터페이스들의 파생 요구사항은 일관성이 있어야 하며, 확장된 인터페이스는 원래 인터페이스들에서 가장 구체적인 파생 요구사항을 상속합니다.

클래스, 객체, 인터페이스는 모두 값이에요. 하지만 클래스나 인터페이스는 객체가 아니죠(즉 "메타 클래스"나 "메타 인터페이스"는 없습니다).

이 절은 다음 하위 절들로 구성됩니다:

  • 6.1 인터페이스 만들기 (Creating Interfaces)
  • 6.2 클래스 만들기 (Creating Classes)
    • 6.2.1 초기화 변수 (Initialization Variables)
    • 6.2.2 필드 (Fields)
    • 6.2.3 메서드 (Methods)
      • 6.2.3.1 메서드 정의 (Method Definitions)
      • 6.2.3.2 상속된 메서드와 슈퍼클래스 메서드 (Inherited and Superclass Methods)
      • 6.2.3.3 내부·외부 이름 (Internal and External Names)
  • 6.3 객체 만들기 (Creating Objects)
  • 6.4 필드·메서드 접근 (Field and Method Access)
    • 6.4.1 메서드 (Methods)
    • 6.4.2 필드 (Fields)
    • 6.4.3 제네릭 (Generics)
  • 6.5 믹스인 (Mixins)
  • 6.6 트레잇 (Traits)
  • 6.7 객체·클래스 계약 (Object and Class Contracts)
  • 6.8 객체 동등성·해싱 (Object Equality and Hashing)
  • 6.9 객체 직렬화 (Object Serialization)
  • 6.10 객체 인쇄 (Object Printing)
  • 6.11 객체·클래스·인터페이스 유틸리티 (Object, Class, and Interface Utilities)
  • 6.12 서로게이트 (Surrogates)

더 알아보기