클래스는 객체 지향 프로그래밍의 핵심 개념이에요. Crystal에서는 모든 것이 객체이고, 모든 객체에는 타입이 있으며, 몇 가지 메서드에 응답할 수 있어요. 클래스는 객체를 만들기 위한 청사진으로, 변수 같은 상태의 초기값과 메서드 같은 동작의 구현을 제공해요. 객체는 모든 인스턴스 변수와 상태를 담고 있는 클래스의 인스턴스예요.
클래스는 class 키워드를 사용해 정의하고, 그 뒤에 UpperCamelCase로 작성한 클래스 이름을 붙여요.
class Account
end
클래스의 인스턴스를 만들려면 new 메서드를 사용해 클래스 이름을 호출해요.
class Account
end
account = Account.new
위 예시에서 account 변수는 Account 클래스의 인스턴스예요.
인스턴스를 만들 때 initialize라는 특별한 메서드가 생성자 역할을 해요.
이 메서드는 인스턴스가 만들어질 때 호출돼요.
생성자를 사용하면 인스턴스의 초기 상태를 설정할 수 있어요.
initialize 메서드는 인자를 받을 수 있고, 이 인자는 인스턴스를 만들 때 전달돼요.
class Account
def initialize(number)
5 + number # => 9
end
end
Account.new(4)
initialize 메서드는 값을 직접 반환할 수 없어요. 대신 new가 새로 만들어진 인스턴스를 반환해요.
class Account
def initialize(number)
5 + number
end
end
Account.new(4)
# => #<Account:0x7f5dc33dcea0>
인스턴스 메서드는 클래스의 인스턴스에서 사용할 수 있고, 그 인스턴스에서 호출할 수 있는 메서드예요.
인스턴스 메서드는 def 키워드를 사용해 정의하고, 그 뒤에 메서드 이름을 붙여요.
클래스 정의 안에서 정의해요.
class Account
def balance
100
end
end
account = Account.new
account.balance # => 100
인스턴스 변수는 인스턴스의 모든 메서드에서 사용할 수 있는 변수예요.
인스턴스 변수에 접근하려면 인스턴스 메서드를 정의해야 해요.
인스턴스 변수는 initialize 메서드에서 초기화할 수 있어요.
@ 접두사를 사용해 정의해요.
class Account
def initialize
@balance = 100
end
def balance
@balance
end
end
account = Account.new
account.balance
# => 100
인스턴스 변수는 클래스 정의 안에서 정의할 수도 있어요.
class Account
@age = 0
end
인스턴스 변수는 initialize 메서드에 전달된 인자로 초기화할 수 있어요.
Crystal은 초기화할 때 사용한 인자의 타입을 추론할 수 없기 때문에, 타입을 지정해야 해요.
이에 대해 더 알고 싶다면 타입 추론 문서를 읽어보면 좋아요.
변수의 타입을 지정하려면 : 기호를 사용하고, 그 뒤에 타입을 써요.
예를 들어 Int32 타입의 balance라는 인스턴스 변수를 만들고 싶다면 @balance : Int32처럼 쓰면 돼요.
또는 Bool 타입의 raining이라는 인스턴스 변수를 만들고 싶다면 @raining : Bool처럼 쓰면 돼요.
이를 구현하는 방법은 몇 가지가 있어요. 다음 예시처럼 initialize 메서드에서 인자를 타입과 함께 선언한 다음, 인스턴스 변수에 그 인자를 할당하는 방법이 있어요.
class Account
def initialize(balance : Int32)
@balance = balance
end
def balance
@balance
end
end
account = Account.new(1)
account_2 = Account.new(5)
account.balance
# => 1
account_2.balance
# => 5
또 다른 방법은 다음 예시처럼 클래스 정의에서 @<variable> : <Type> 형태로 인스턴스 변수의 타입을 선언하는 거예요.
class Weather
@raining : Bool
def initialize(raining)
@raining = raining
end
def raining
@raining
end
end
weather = Weather.new(true)
weather.raining
# => true
메서드는 인스턴스 변수를 수정할 수 있어요. 이런 메서드는 클래스의 인스턴스에서 호출할 수 있어요. 메서드가 인스턴스 변수를 수정하면, 그 변경은 호출한 클래스 인스턴스에만 적용돼요.
class Account
def initialize(balance : Int32)
@balance = balance
end
def withdraw(amount)
@balance -= amount
end
def balance
@balance
end
end
account = Account.new(10)
account_2 = Account.new(10)
account.balance
# => 10
account_2.balance
# => 10
account.withdraw(5)
account.balance
# => 5
account_2.balance
# => 10
클래스 메서드는 클래스에 정의되지만 그 인스턴스에는 정의되지 않는 메서드예요.
인스턴스의 상태에 의존하지 않는 메서드를 만들 수 있게 해줘요.
클래스 메서드는 def 키워드를 사용하고 그 뒤에 self.<method name>을 붙여 정의해요.
self는 self를 호출한 네임스페이스에 대한 참조예요.
여기서는 Account 클래스를 가리켜요.
Account.라고 쓴 것과 같지만, self.가 더 권장되는 방식이에요.
class Account
def self.balance
100
end
end
Account.balance
# => 100
친구 요하네스는 DIY(직접 만들기) 하드웨어를 정말 좋아해요. 요하네스는 방금 주스 메이커를 만들었고, 무척 신나 있어요. 요하네스의 목표는 매일 아침 신선한 주스를 만드는 거예요.
요하네스 주스 메이커에는 근사한 기능이 많아요. 예를 들어, 컵에 주스가 얼마나 들어 있는지 알려 주는 내장 측정 시스템이 있어요. 기계가 얼마나 오래 작동했는지 알려 주는 타이머도 있어요.
요하네스는 프로그래밍을 잘하지는 못하지만, 기계를 제어할 프로그램을 만들고 싶어 해요. 그래서 여러분에게 도움을 청했어요.
기계에는 디버그 표시등이 있는데, 간단한 장치예요. 기계에 전원이 들어오면 디버그 표시등이 켜져요. 프로그램은 디버그 표시등이 켜져 있을 때만 실행돼요.
이 메서드는 JuiceMaker라는 클래스의 클래스 메서드여야 해요.
true를 반환하는 클래스 메서드 JuiceMaker.debug_light_on?을 정의해요.
JuiceMaker.debug_light_on?
#=> true
기계에 전원이 들어오면 JuiceMaker라는 클래스의 인스턴스를 만들어야 해요.
기계에는 초기화된 상태가 있어야 해요.
초기화된 상태는 다음 정보를 담고 있어야 해요:
false여야 해요.컵에 들어 있는 주스의 양을 매개변수로 받는 초기화된 상태를 정의하고, 초기화된 상태를 만들어요.
초기화된 상태에는 false로 설정되는 인스턴스 변수 @running과, 클래스가 초기화될 때 주어진 인자에 따라 값이 정해지는 인스턴스 변수 @fluid가 있어야 해요.
JuiceMaker.new(5)
#=> #<JuiceMaker:0x10f0b8 @running=false, @fluid=5>
기계는 켜고 끌 수 있어요.
기계를 켜는 메서드를 정의해야 해요.
기계를 켜면 작동 상태가 true로 설정돼야 해요.
기계를 켜는 JuiceMaker#start 메서드를 정의해요.
juice_maker = JuiceMaker.new(5)
juice_maker.start
juice_maker
#=> #<JuiceMaker:0x10f0b8 @running=true, @fluid=5>
기계는 자신의 상태를 알려 줄 수 있어야 해요.
기계가 작동 중이면 true를, 작동 중이 아니면 false를 반환해야 해요.
기계의 상태를 반환하는 JuiceMaker#running? 메서드를 정의해요.
juice_maker = JuiceMaker.new(5)
juice_maker.start
juice_maker.running?
#=> true
기계는 컵에 주스를 더할 수 있어요. 기계는 컵에 주스가 얼마나 더해졌는지 알 수 있어요. 기계는 주스가 더해진 뒤 컵에 주스가 얼마나 들어 있는지 알기 위해 도움이 필요해요.
더해진 주스의 양을 매개변수로 받아 컵에 들어 있는 주스의 양을 갱신하는 JuiceMaker#add_fluid 메서드를 정의해요.
juice_maker = JuiceMaker.new(5)
juice_maker.add_fluid(5)
juice_maker
#=> #<JuiceMaker:0x10f0b8 @running=false, @fluid=10>
기계는 켜고 끌 수 있어요.
기계를 끄는 메서드를 정의해야 해요.
이 메서드는 기계가 작동 중일 때만 호출돼요.
기계를 끄면 작동 상태가 false로 설정돼야 해요.
기계는 전원이 꺼진 뒤 컵에 주스가 얼마나 들어 있는지 알아내는 데도 도움이 필요해요.
기계는 1분에 주스 다섯 단위를 사용해요.
기계가 작동한 분 수를 매개변수로 받아 기계가 꺼진 뒤 컵에 들어 있는 주스의 양을 반환하는 JuiceMaker#stop 메서드를 정의해요.
juice_maker = JuiceMaker.new(5)
juice_maker.start
juice_maker
#=> <JuiceMaker:0x10f0b8 @running=true, @fluid=5>
juice_maker.stop(1)
#=> #<JuiceMaker:0x10f0b8 @running=false, @fluid=0>
Exercism에 가입하고 Crystal 트랙을 개념 26개연습 문제 142개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.