프로그래밍/Ruby

Ruby 프로그래밍 - 6. 메소드(함수)

seungdols 2015. 2. 19. 20:32

메소드(함수)


먼저 메소드에 대한 설명을 해야 할 듯 싶다. 메소드란 무엇인가? 기능이란 뜻을 가졌다. 함수 또한 기능이란 의미가 있다.

그런데 보통 함수라는 명칭은 C언어쪽에서 많이 쓰이고, 그 외에는 보통 메소드라는 말을 많이 사용한다. 

즉, 어떠한 동작을 한다는 것이다. 그 동작이란 ? 보통 프로그래머가 정한 일련의 행동을 말한다.

프로그래밍에서 규칙 하나로 비슷한 코드는 하나의 메소드형태로 취합하는 것이 원칙이다. 


구구단을 출력하는 코드가 10번 필요하다. 그럼 매번 코드를 추가 할 것인가? 

아니다. 

효율적으로 할 수 해결 하는 방법이 바로 메소드이다.


루비 언어에서의 메소드의 형식이 있다. 


프로그래밍언어에서의 형식은 중요하다. 바로 문법 그 자체이기 때문이다.

def 메소드명 [ ( [인자 [=기본값]]...[, * 인자 [ , &expr]] ) ]

<수행 문장>

end


메소드 정의란?


-내가 정할 행동을 하나의 이름을 붙이는 작업이다. 그리고 코드를 메소드 형식에 감싸면 된다.


irb(main):001:0> def number
irb(main):002:1> i=0
irb(main):003:1> while i < 10
irb(main):004:2> puts i
irb(main):005:2> i += 1
irb(main):006:2> end
irb(main):007:1> end

메소드 호출


-메소드 명() 으로 호출 할 수 있지만, 루비의 경우 괄호의 생략이 가능하다.


irb(main):008:0> number()
0
1
2
3
4
5
6
7
8
9
=> nil
irb(main):009:0> number
0
1
2
3
4
5
6
7
8
9
=> nil


자! 이제 메소드에 대한 개요는 머릿속에 그려질 것이다.

이제 반환을 해보자! 

반환은 비교에서 1==1 이 문장에서는 1과 1이 같냐? 당연히 같으므로 True를 출력합니다.

이 True가 바로 비교에 대한 반환 값이 되는 거죠!


메소드 또한 반환이 가능합니다. 


메소드의 반환(Return)


-def 안에서 end 전에 특정 값을 반환하는 문장으로 return <변수>로 쓰면 됩니다.


물론 루비의 경우 return을 써주지 않아도 마지막 문장을 return 값으로 인식합니다.


그리고 추가적으로 다중 리턴도 가능합니다. ',' 콤마로 분리하여서 말이죠? ^^(이 경우 배열을 리턴하는 것입니다.지금은 모른체 해주세요.)


irb(main):010:0> def get_member
irb(main):011:1> return "member"
irb(main):012:1> end
=> :get_member
irb(main):013:0> get_member
=> "member"
irb(main):014:0> def get_no_member
irb(main):015:1> i = '100'
irb(main):016:1> j = '200'
irb(main):017:1> k = '300'
irb(main):018:1> end
=> :get_no_member
irb(main):019:0> puts get_no_member
300
=> nil
irb(main):020:0> def get_multi_return
irb(main):021:1> i = 20
irb(main):022:1> j = 30
irb(main):023:1> k = 50
irb(main):024:1> return i,j,k
irb(main):025:1> end
=> :get_multi_return
irb(main):026:0> puts get_multi_return
20
30
50
=> nil


메소드의 인자


-인자라는 것은 파라미터 값, 인자값, 여러 명칭으로 쓰입니다. 하지만 하나의 의미를 가집니다. 바로 메소드에 안에 외부의 특정 값을 전달한다는 뜻이죠.

왜 인자를 주느냐? 그건 당장 설명 시키긴 어렵지만. 단적으로 설명하자면, 

메소드 안의 코드메소드 바깥의 코드분리되어 있다고 생각 합시다. 그럼 그 두 코드간 연결고리가 없죠?

메소드 안에서 외부에서 쓰이는 특정 변수 값이 필요로 한데 가져 올 수 없으니 말이죠??? ㅎ 

그 해결로 인자라는 개념이 탄생했습니다.


irb(main):027:0> def get_param(arg)
irb(main):028:1> return arg
irb(main):029:1> end
=> :get_param
irb(main):030:0> puts get_param 1
1
=> nil
irb(main):031:0> puts get_param 3
3
=> nil
irb(main):032:0> def get_mul_param(arg1, arg2)
irb(main):033:1> return arg1 + arg2
irb(main):034:1> end
=> :get_mul_param
irb(main):035:0> puts get_mul_param 10, 20
30
=> nil

위의 코드에서는 인자값을 더 하여 리턴하므로 10, 20의 덧셈 값으로 30이 반환되는 것을 볼 수 있죠?

인자의 기본값


기본값이란?

-인자로 들어 오는 값이 아무것도 없다면, 특정한 값을 기준으로 그 메소드를 동작시키겠다.

 이거죠. 어떤 시기에는 외부 변수의 특정 값이 필요하고 어떤 시기에는 그냥 항상 같은 값이 필요할 때 쓰이게 됩니다.

irb(main):036:0> def get_default_param(arg = 100)
irb(main):037:1> return arg
irb(main):038:1> end
=> :get_default_param
irb(main):039:0> puts get_default_param 10
10
=> nil
irb(main):040:0> puts get_default_param
100
=> nil
irb(main):041:0>

코드를 보시면 됩니다. 10을 입력할 때는 10이 나오고 아무것도 입력하지 않고 호출할 땐 100이 즉, 메소드의 기본값이 출력 됩니다.

반응형