클래스 메서드

클래스 메서드 (Class methods)

클래스 메서드는 특정 인스턴스가 아니라 클래스나 모듈에 연결된 메서드예요. 예시로 바로 볼게요.

module CaesarCipher
  def self.encrypt(string : String)
    string.chars.map { |char| ((char.upcase.ord - 52) % 26 + 65).chr }.join
  end
end

CaesarCipher.encrypt("HELLO") # => "URYYB"

클래스 메서드는 메서드 이름 앞에 타입 이름과 마침표를 붙여서 정의해요.

def CaesarCipher.decrypt(string : String)
  encrypt(string)
end

클래스나 모듈 스코프 안에서 정의할 때는 클래스 이름 대신 self를 쓰는 게 더 편해요.

클래스 메서드는 Module을 extend해서 정의할 수도 있어요.

클래스 메서드는 정의한 이름 그대로 호출할 수 있어요(CaesarCipher.decrypt("HELLO")). 같은 클래스나 모듈 스코프 안에서 호출하면 수신자를 self로 쓸 수도 있고 생략할 수도 있어요(encrypt(string)처럼).

출처: Crystal 공식 문서

본문

클래스 메서드는 클래스의 인스턴스 안에서는 스코프에 없어요. 대신 클래스 스코프를 통해 접근해야 해요.

class Foo
  def self.shout(str : String)
    puts str.upcase
  end

  def baz
    self.class.shout("baz")
  end
end

Foo.new.baz # => BAZ

생성자

생성자는 클래스의 새 인스턴스를 만드는 평범한 클래스 메서드예요. 기본적으로 Crystal의 모든 클래스에는 new라는 생성자가 하나 이상 있는데, 이름이 다른 생성자를 추가로 정의할 수도 있어요.

더 알아보기

  • modules의 extend self: 클래스 메서드를 정의하는 또 다른 방법
  • new, initialize, allocate: 생성자와 인스턴스 생성