클래스 메서드
클래스 메서드 (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: 생성자와 인스턴스 생성