프로그래밍/Scala

[Scala] 중첩함수, 매개변수 사용하기

Dibrary 2022. 9. 6. 09:50
반응형

안녕하세요 Dibrary입니다.

이번에는 Scala에서 중첩함수 및 매개변수를 여러 방법으로 사용해보겠습니다.

 

먼저, 중첩함수란 함수 내에 함수가 정의되어 있는 꼴입니다. 

예시 코드를 먼저 보겠습니다.

보시면 max 함수 안에 max가 또 들어있죠. 근데 사실 안에 있는 max와 밖에 있는 max는 다릅니다. 왜냐하면, 전달인자 갯수가 다르기 때문입니다.

밖에 있는 max는 전달인자 3개, 안에 있는 max는 전달인자 2개. 그렇죠?

그리고, 실질적으로 max(a, max(b, c)) 코드가 실행 코드인데, 이 코드는 전달인자가 2개인 max만을 사용합니다.
max(b, c)의 결과는 1개의 값으로 나오므로, 결국 max (a, 1개의 값) 꼴이기 때문입니다.

 


스칼라는 매개변수를 순서와 관계없이 지정할 수 있습니다.

위 코드처럼 쓰는 게 일반적입니다. MS는 첫 번째로 들어가고, DK는 두 번째로 들어가죠.

전달인자의 이름을 같이 써 주면 위치를 변경하면서도 쓸 수는 있습니다. 

다만, 위치를 이유 없이 변경해서 쓰면 코드를 해석할 때 에러로 이어질 수 있으므로 전달인자 이름을 써 줄 때도 순서를 가급적 지키는 것이 좋습니다.

 


파이썬은 함수 전달인자를 넣을 때 default 값을 설정할 수 있었는데 스칼라도 가능할까요? 가능합니다.

먼저 전달인자 중 앞에 있는 first에 default값으로 "" 을 설정했습니다. 말 그대로 아무 내용도 없는 것이죠.

그러고 전달인자에 1개의 값을 넣었더니 에러가 납니다. 왜 그럴까요? 어떤 전달인지 명시를 안 해 주었기 때문에 함수가 자동으로 첫 번째부터 넣었기 때문입니다.

두 번째 코드에서 name = "TT" 로 명시 해주니 정상적으로 출력되는 것을 볼 수 있습니다.

만일 default값이 있는 전달인자가 오른쪽 끝에 위치해 있다면 에러는 나지 않습니다.

왜냐하면, 함수가 자동으로 첫 번째 값으로 받았고, 두 번째 인자인 name에서 default값을 넣었기 때문이죠.

 


가변 형태의 매개변수도 받을 수 있습니다. 여기서 가변이란, 형태가 고정되어 있지 않은 모양을 의미합니다.

전달인자 items에서 자료형을 Int*로 별표를 붙였죠. 별표가 붙으면 가변꼴도 받을 수 있다는 의미입니다.

아래 실행에서 1,2,3으로 3개를 넣을 때나, 1,2,3,4,5로 5개를 넣을 때나 함수가 모두 동작합니다.

 


일반적으로 함수는 객체 안에 존재합니다.  즉, 객체 안에 함수는 클래스에 정의된 메서드 입니다.

여기서 s는 String 객체인데, String클래스의 인스턴스인 셈이죠.

위 코드에서 endsWith라는 함수는 정의한 적도 없는데 사용이 가능하죠? 이는 해당 객체가 가지고 있는 함수(메서드)를 사용했기 때문입니다.

 

스칼라는 독특한 방법으로도 객체의 메서드를 사용할 수 있습니다.

객체, 메서드, 전달인자를 띄어쓰기로 사용하면 점으로 연결해서 사용한 것 과 같은 효과를 보입니다.

s.endsWith("et") 코드를 s endsWith "et" 띄어쓰기로 구성해도 결과는 같게 나오네요.

d라는 double 객체를 정의하고, 해당 double 객체가 가진 compare 메서드를 사용해도 정상적으로 결과가 나오는것을 볼 수 있습니다. 

(compare는 비교 대상의 숫자가 본인(자신의)숫자보다 크면 -1, 작으면 1, 같으면 0을 내보냅니다.)

728x90
반응형