Skip to content

Latest commit

 

History

History
159 lines (116 loc) · 3.92 KB

20151201-object.md

File metadata and controls

159 lines (116 loc) · 3.92 KB

Class 없이 OOP 하기

저자

@ahastudio - 우아한형제들에서 Ruby on Rails로 LINE WOW를 개발했고, 최근엔 Java와 Spring Boot로 배달의민족 신규시스템을 개발하고 있습니다.

시작하며

대림절 달력(Advent Calendar)을 한국 루비 커뮤니티에서도 시작하게 됐습니다. 첫 글을 쓰게 돼서 정말 기쁩니다. 대림절 달력에 대한 설명은 Seoul.pm 펄 크리스마스 달력을 참고하세요. 펄 커뮤니티, 정말 고마워요!

무슨 글을 쓸까 고민하다가 예전에 다뤘던 내용을 재탕하기로 했습니다. 처음 보는 분이 많을 거라는 기대(?)가 빗나가지 않길 바랍니다.

OOP라고 하면 Class와 Instance 개념을 떠올리는 경우가 많습니다. 객체끼리 서로 협력한다는 기본 원리만 가지고도 프로그래밍이 가능하다면 어떻게 될까요?

준비물

  • Ruby
  • 흥미
  • 용기
  • 사랑과 우정 (필수는 아님)

객체 만들기

간단한 객체를 만들어 봅시다. 일단 루비 인터프리터 환경을 실행하죠.

$ irb

객체가 뭘까요? 객체를 설명하는 방법은 너무나도 많은데, 추상화 단계를 너무 높이지 않고 손에 만져지는 걸로 살펴봅시다. “한 소년이 있었습니다” 정도면 어떨까요?

boy = Object.new

소년이 하나 만들어졌습니다. 제대로 잘 됐는지 한번 확인해 보죠.

boy

결과:

 => #<Object:0x00770077007700>

객체에 특성 부여하기

소년을 소년이라고 부르니 뭔가 밋밋한 것 같네요. 소년에게 이름을 붙여주면 어떨까요? 무난하게 “강동원”이라고 합시다. 이름을 붙이는 걸 개발자들은 정의한다고 표현합니다. define을 통째로 쓰면 손가락이 아프니 간단히 def라고 써보죠.

def boy.name
  'Kang Dong-won'
end

자, 이제 소년의 이름을 한번 확인해 볼까요?

boy.name

결과:

 => "Kang Dong-won"

또 다른 객체 만들기

소년은 혼자 있으니 슬펐습니다. 그러니 여자친구를 하나 만들어보죠.

girl = boy.clone

강동원과 똑같은 소녀 객체가 만들어졌습니다. 강동원과 똑같기 때문에 정말 완벽하지만 한가지 문제가 있습니다. 너무 똑같다는 거죠.

girl.name

결과:

 => "Kang Dong-won"

“그럴 땐 얘기를 나누자 거울 속의 나하고”가 아니라면 이 상황을 벗어나야겠죠? 여자친구에게 이름을 하나 지어줍시다.

def girl.name
  'Don Don'
end

이제 둘을 사랑스럽게 엮어줄 수 있겠네요.

"#{boy.name}#{girl.name}"

결과:

 => "Kang Dong-won ♥ Don Don"

액션!

Class 없이 객체를 만들고, 정의하고, 이걸 활용하는 게 얼마나 쉬운지 우리는 경험했습니다. 강동원에게 구마 의식을 수행하게 하는 것도 이제는 쉽겠죠?

def girl.bad?
  true
end

# 소녀의 상태 확인
girl.bad?

def boy.perform_exorcism(target)
  def target.bad?
    false
  end
end

# 구마
boy.perform_exorcism(girl)

# 소녀의 상태 다시 확인
girl.bad?

멤버 변수를 활용해도 됩니다.

# 멤버 변수 조작하기. 사실상 해킹이기 때문에 setter를 쓰는 걸 권합니다.
girl.instance_variable_set(:@bad, true)

def girl.bad=(bad)
  @bad = bad
end

def girl.bad?
  @bad
end

# 소녀의 상태 확인
girl.bad?

def boy.perform_exorcism(target)
  target.bad = false
end

# 구마
boy.perform_exorcism(girl)

# 소녀의 상태 다시 확인
girl.bad?

정리하며

명확한 타입을 갖는 건 장점이 많습니다. Ruby는 그 장점을 기본으로 취하고 있죠. 하지만 가끔은 일탈을 통해 다양한 실험을 해보면 어떨까요? Ruby라면 가능합니다!

EOT