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

[Ruby] 루비의 함수 / 배열 / 해시

by 별준 2020. 7. 30.

- 함수 정의하기

루비는 자바나 C#과 달리, 함수를 정의하기 위해서 클래스를 따로 정의할 필요가 없습니다. 그냥 콘솔 위에서 함수를 정의할 수도 있습니다.

모든 함수는 어떤 값을 리턴합니다. 명시적인 리턴 값을 설정하지 않으면, 함수 안에 존재하는 마지막 표현이 나타내는 값이 자동적으로 리턴됩니다. 다른 것과 마찬가지로 함수 역시 루비에서는 하나의 객체입니다. 추후에 더 자세히 알아보도록 하겠습니다.

 

 

- 배열

배열은 루비에서 많은 역할을 담당합니다.

루비의 배열은 상당히 자유롭습니다. 정의되지 않은 배열 요소에 접근하면, 루비는 에러를 발생하는 것이 아니라 단순히 nil을 리턴합니다. C나 C++과는 다르게 인덱스로 음수를 사용할 수 있습니다. animals[-1]은 뒤에서 첫 번째 요소를 리턴하고, animals[-2]는 뒤에서 두 번째 요소를 리턴합니다. animals[0..1]은 0부터 1까지(양 끝을 포함)하는 배열 요소를 리턴합니다. 0..1은 위에서 볼 수 있듯이 Range라는 객체를 의미합니다.

 

이처럼 배열은 다른 자료형을 포함시킬 수도 있습니다.

 

루비를 초기화하고 main을 다시 실행해서 아래와 같이 입력하면 에러가 발생합니다.

배열이 선언되기 전에 사용했기 때문입니다. 이 에러 메세지는 루비가 배열과 해시를 다루는 방식에 대해 힌트를 제공합니다. [] 라는 포현은 사실 Array 객체에 정의된 메서드의 이름입니다.

위에서 보듯이 Array 객체는 [] 메서드를 포함하고 있습니다. 당연한 말이지만 배열을 사용하려면 먼저 빈 배열을 만들고 그 다음에 사용할 수 있습니다.

 

앞에서 말했듯이 배열의 요소는 같은 자료형일 필요가 없으며, 다차원 배열은 단순히 배열의 배열일 뿐입니다.

 

배열은 정말 많은 API를 가지고 있으며, 배열을 큐, 연결 리스트, 스택, 혹은 집합으로 사용할 수도 있습니다.

 

- 해시 Hash

해시에는 모든 객체가 특정한 레이블을 가지고 있습니다. 그 레이블이 키에 해당하고 객체는 값에 해당합니다. 해시는 수많은 키-값 짝으로 이루어집니다.(Key=>Value 형식으로 입력한다)

루비에서 해시는 복잡하지 않습니다. 해시는 많은 면에서 배열처럼 동작하지만, 정수 인덱스가 아닌 임의의 키를 사용합니다.  마지막 stuff이라는 해시는 처음보는 문법인 심볼Symbol을 포함하고 있습니다. 심볼은 :symbol처럼 콜론 뒤에 따라오는 식별자를 의미합니다. 

 

심볼은 어떤 사물이나 생각에 이름을 붙일 때 유용합니다. 동일한 값을 갖는 두 개의 문자열이 물리적으로 서로 다른 객체일 수 있지만, 식별자가 같은 심벌은 물리적으로 동일한 존재입니다. 아래처럼, 심벌의 고유 객체 식별자를 출력해보면 이해가 빠를 것 같습니다.

 

다시 해시로 돌아와서, 해시는 때로 익숙하지 않은 환경에서 나타나기도 합니다. 예를 들어서 루비는 named parameter(명명된 파라미터 : 아래에서 더 살펴보겠습니다)를 지원하지 않지만, 해시를 이용하면 이 기능을 어느 정도 흉내 낼 수 있습니다. 아래를 살펴봅시다.

이 메서드(함수 : tell_the_truth)는 하나의 선택적 매개변수를 취합니다. 아무것도 전달하지 않으면 options에는 빈 해시가 할당됩니다. :profession에 :lawyer를 전달하면 다른 값을 리턴하게 됩니다. 결과가 완벽하게 참이 되는 것은 아니지만, 시스템이 그 값을 true로 판단할 것이므로 최종적인 결과는 동일합니다. 매개변수에 들어가는 값(line 9)이 중괄호는 반드시 표시하지 않아도 됩니다. 어떤 함수의 마지막 매개변수에 대해서는 중괄호를 생략할 수 있습니다.

 

 

+) named parameter 명명된 매개변수

자세하게 알지 못하는 내용이어서 추가적으로 찾아보았습니다. 명명된 매개변수는 선택적(Optional) 매개변수와 비교해서 쓰이는 개념입니다.(C#에서 두 가지 매개변수를 모두 사용가능함; 아래 내용은 C# 기준입니다)

 

선택적 매개변수(Optional Parameter)는 C++에서 디폴트 매개변수와 같은 기능으로, 매개 변수를 필수 또는 선택 사항으로 지정할 수 있는 기능입니다. 함수를 호출할 때는 모든 매개 변수에 대한 인수를 제공해야 하지만, 선택적 매개변수에 대한 인수는 생략할 수 있습니다. 함수를 정의할 때, 선택적 매개변수에 대해서는 기본값을 반드시 제공해야하며, 필수 매개변수 다음으로 정의해야 합니다.

//Essential Parameter(normal)
void Person(string name, int age, string address); //모든 파라미터에 대해 필수적으로 인수를 제공해야함
//Optional Parameter
void Person(string name, int age = 0, string address = "None") //age와 address 매개변수는 선택적 매개변수로, 함수 호출시에 생략이 가능함
//Optional Parameter - wrong case
void Person(string name, int age = 0, string address) //선택적 매개변수는 반드시 필수 매개변수 뒤에 위치해야함

 

명명된 매개변수(Named Parameter)는 호출된 메서드의 각 인수에 대한 매개 변수를 배개 변수 이름으로 지정할 수 있습니다. 즉, 위에서 선언한 함수를 아래와 같이 호출할 수 있는 것이죠.

Person(name:"Junstar", age:29, address:"Sejong");

위와 같이 각 인수에 대한 매개변수를 매개변수 이름으로 지정하여 사용 가능합니다. 각 인수가 무엇을 나타내는지 식별할 수 있어 코드의 가독성을 향상시킬 수 있고, 임의의 순서로 인수를 보낼 수 있습니다.

또한, Person의 선택적 매개변수 중 address에만 인자를 보내고 싶을 경우에는 다음과 같은 처리도 가능합니다. 단, 매개변수의 순서는 반드시 동일해야합니다.(매개변수로 age먼저 입력 불가능)

 

자세한 내용은 아래 링크의 예제를 참조하시길 바랍니다.

https://docs.microsoft.com/ko-kr/dotnet/csharp/programming-guide/classes-and-structs/named-and-optional-arguments

댓글