본문 바로가기
프로그래밍/Ruby

[Ruby] 루비의 프로그래밍 모델 / 결정(Decision) / 타이핑 모델

by 별준 2020. 7. 29.

- 프로그래밍 모델

루비는 순수한 객체지향 언어입니다.

아래는 숫자에 대한 간단한 객체를 보여주고 있습니다. 이것은 루비가 이 개념을 얼마나 철저하게 구현했는지 확인할 수 있습니다.

 

 

루비에서는 개별적인 숫자를 포함한 거의 모든 것이 객체입니다. 숫자는 Interger라는 클래스를 사용하는 객체인 것이죠. 그리고 methods라는 이름의 메서드를 호출하면 그 객체가 가지고 있는 메서드의 배열이 리턴됩니다(루비는 대괄호를 이용하여 배열을 표시함). 점만 찍으면 객체의 어떤 메서드라도 마음껏 호출할 수 있습니다.

 

아래는 문자열에 대한 객체 정보입니다.

 

- 결정(Decision) / boolean expression

프로그램은 어떤 결정을 내리기 위해 존재하며, 결정을 내리는 과정은 우리가 코딩하고 생각하는 방식에 결정적인 영향을 끼치는 핵심적인 부분입니다. 이런 면에서 루비는 대부분의 객체지향 언어나 또는 절차적 언어와 별반 다르지 않습니다.

 

루비는 true 또는 false라는 값으로 평가되는 표현을 가지고 있습니다. 여기에서 true와 false는 그 자체로 객체에 해당합니다. 이를 이용하면 어떤 코드를 조건에 따라서 실행할 수 있습니다. 이것은 C/C++이나 다른 프로그래밍과 동일합니다.

 

루비에서는 조건 분기를 간단하게 사용할 수 있습니다. if 혹은 unless를 사용할 때 원한다면 블록 형태를 사용할 수도 있고(if 조건문, 명령문, end), 한 줄짜리 형태를 사요할 수도 있다(명령문 if 조건문). 또한 C/C++과는 다르게 unless라는 문법을 사용합니다. not 혹은 !를 사용하여 표현할 수도 있지만, 같은 내용을 unless를 사용하여 더욱 잘 표현하고 있습니다.

 

while과 until도 비슷합니다.

다른 언어와 마찬가지로 true와 false 대신 값을 사용하는 것도 가능합니다.

위와 같이 nil과 false를 제외한 다른 모든 것은 true로 평가됩니다. C/C++과는 다르게 0 또한 true로 평가됩니다.

 

논리적 연산자는 소수의 예외를 제외하고는 C/C++/C#/Java와 동일합니다. and(혹은 &&)는 논리적 and, or(혹은 ||)는 논리적 or입니다. 이러한 연산자로 계산할 때, 인터프리터는 계산 결과가 명확하게 결정될 때까지만 계산을 수행합니다. 표현 전체를 계산하고 싶으면 & 혹은 | 연산자를 사용해야합니다. 아래의 실행 결과를 참조하자.

 

- 타이핑 모델

루비의 타이핑 모델을 알아보기 전에, 우리가 코딩할 때 자료형과 관련해서 실수를 저질렀을 때 루비가 어느 정도로 보호해줄 것인가에 대해서 살펴보겠습니다. 즉, 형 안전성에 대해서 알아보겠습니다. 강한 타이핑을 사용하는 언어는 특정한 연산이 일어날 때 해당 연산이 오류를 발생하기 전에 자료형을 검사합니다. 이러한 검사는 인터프리터에서, 컴파일러에서, 혹은 실행 시간에 일어날 수 있습니다. 아래를 살펴봅시다.

위의 예에서 존재하는 클래스를 실행 시간에 변경하고 있음을 볼 수 있습니다. 따라서, 사용자가 클래스가 정의된 내용을 수정하여 타이핑 시스템의 안전성을 해칠 수 있으므로, 루비는 엄격한 의미에서 강한 타이핑 시스템이 아닙니다. 하지만 대체적으로 보았을 때 루비는 강한 타이핑 시스템을 사용하는 언어처럼 동작합니다. 즉, 자료형이 서로 충돌을 일으키면 에러가 발생한다는 뜻입니다. 루비는 위와 같은 형 검사를 컴파일이 아닌 실행 시간에 수행합니다. 

함수를 미리 정의하는 방법을 통해서 확인해봅시다.

위와 같이 루비는 어떤 코드를 실제로 실행하기 전까지는 형 검사를 수행하지 않습니다. 이러한 개념을 동적 타이핑(자료형을 컴파일 시가 아닌 런타임에 결정하는 것)이라고 부릅니다. 동적타이핑에는 단점이 존재하는데, 정적 타이핑 시스템을 사용하면 컴파일러와 여러 가지 도구가 에러를 잡아낼 수 있는데, 동적 타이핑 시스템에서는 그런 도움을 받을 수가 없습니다. 

하지만 루비의 타이핑 시스템은 몇 가지 잠재적인 장점도 가지고 있습니다. 클래스가 서로 동일한 방식으로 행동하기 위해서 똑같은 부보로부터 상속할 필요가 없습니다.

이 코드가 바로 루비의 타이핑 모델을 설명해주고 있습니다. 바로 오리 타이핑(위키백과)입니다.

글 초반부에 배열은 대괄호로 나타낸다고 했는데, 여기서 배열의 첫 번째 요소는 String 객체이고 두 번째는 Float입니다. 동일한 코드가 두 요소를 to_i라는 메서드를 통해 정수로 바꾸어 줍니다. 이것처럼 오리 타이핑은 실제로 주어진 자료형이 무엇인지에 대해서 신경쓰지 않습니다. -> 만약 어떤 새가 오리처럼 걷고, 오리처럼 꽥꽥거리면, 그 새는 오리입니다.(여기서 꽥꽥에 해당하는 메서드가 to_i다)

 

오리 타이핑은 깔끔한 객체지향 설계를 할 때 매우 중요합니다. 객체지향의 설계 철학에서는 구체적인 표현이 아니라 인터페이스를 대상으로 코드를 작성하라는 말이 중요한 의미를 갖습니다. 오리 타이핑을 사용하면, 불필요한 코드를 사용하지 않아도 이와 같은 개념을 따르기가 매우 쉽습니다. 예를 들어, 어떤 객체가 push와 pop이라는 메서드를 가지고 있으면, 우리는 객체의 자료형과 관계없이 그것을 스택Stack으로 취급할 수 있습니다. 이 메서드가 없으면 스택이 아닌 것입니다.

 

 

 

- Reference

Programming Ruby : http://ruby-doc.com/docs/ProgrammingRuby/

댓글