객체는 _인스턴스 변수_를 설정해서 자신만의 상태를 가질 수 있어요. 이 변수들은 객체 안에 존재하고, 보통 내부 상태를 저장하는 데 사용해요.
인스턴스 변수는 항상 @로 시작해요.
@로 시작하는 변수를 설정해서 새로운 인스턴스 변수를 만들 수 있어요.
예를 들어볼게요:
class Repeater
def hear(something)
# Save what's been heard into a new instance variable called @heard
@heard = something
end
def repeat
# Return the value of the instance variable
@heard
end
end
repeater = Repeater.new
repeater.hear("Hello, friend!")
print repeater.repeat # Prints "Hello, friend!"
객체는 보통 initialize 메서드에서 초기 상태를 설정하는데, 이 메서드는 클래스에서 new를 호출할 때 자동으로 호출돼요.
class Airplane
def initialize
@wings = 2
end
def wings
@wings
end
end
plane = Airplane.new
plane.wings # returns 2
initialize 메서드는 인자를 받을 수도 있어서, 각 인스턴스가 원하는 상태로 시작할 수 있어요:
class Suitcase
def initialize(locked)
@locked = locked
end
end
인스턴스 변수는 외부에서 읽거나 쓰지 못하도록 private으로 취급하는 게 좋아요. 대신 값을 가져오고 설정하는 메서드를 정의해요. 예를 들어볼게요:
class Suitcase
def initialize
@locked = false
end
def locked? # Query methods should be named with a trailing `?`
@locked
end
def lock! # Methods which mutate state should have trailing `!`
@locked = true
end
end
suitcase = Suitcase.new
suitcase.locked? # false
suitcase.lock!
suitcase.locked? # true
Nil은 "아무것도 없음" 또는 "0"을 뜻하는 영어 단어예요.
Ruby에서 nil은 객체의 _부재_를 표현할 때 사용해요.
다른 프로그래밍 언어에서는 null이나 none 값이 비슷한 역할을 하기도 해요.
# I do not have a favorite color
favorite_color = nil
Ruby는 인스턴스 변수가 처음 등장했을 때, 다른 값이 주어지기 전까지는 기본값으로 nil을 줘요.
print @favourite_color # prints nil
@favourite_color = "blue"
print @favourite_color # prints "blue"
놀이공원에서 일하게 되면서, 입장객과 놀이기구를 관리하는 시스템을 설계하라는 명세를 받았어요. 여기서는 공원을 방문하는 사람인 관람객(Attendee)을 모델링하는 일을 맡았어요.
Attendee 클래스의 Attendee#initialize 메서드를 구현해요. 이 메서드는 키(센티미터 단위)를 인자로 받아 인스턴스 변수에 저장해야 해요.
Attendee.new(106)
# => #<Attendee:0x000055c33e6c7e18 @height=106>
Attendee 클래스의 Attendee#height getter 메서드를 구현해요. 이 메서드는 인스턴스의 키를 반환해야 해요.
Attendee.new(106).height
# => 106
모든 관람객이 이용권을 산 것은 아니지만, 이용권을 가지고 있는지 없는지는 알아야 해요. Attendee 클래스의 Attendee#pass_id getter 메서드를 구현해요. 이 메서드는 인스턴스의 pass_id를 반환하고, 관람객이 이용권을 가지고 있지 않다면 nil을 반환해야 해요.
Attendee.new(106).pass_id
# => nil
Attendee#issue_pass!를 구현해서 인스턴스의 상태를 바꾸고, pass id 인스턴스 변수를 인자로 설정해요. 이 메서드는 pass id를 반환해야 해요.
attendee = Attendee.new(106)
attendee.issue_pass!(42)
attendee.pass_id
# => 42
일부 손님은 안전하지 않은 행동으로 규칙을 어기기 때문에, 공원은 이용권을 회수할 수 있기를 원해요. Attendee#revoke_pass!를 구현해서 인스턴스의 상태를 바꾸고, pass id를 nil로 설정해요.
attendee = Attendee.new(106)
attendee.issue_pass!(42)
attendee.revoke_pass!
attendee.pass_id
# => nil
Exercism에 가입하고 Ruby 트랙을 개념 21개연습 문제 121개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.