스칼라의 함수 및 메서드 기초

Scala에 대해 더 알고 싶으신가요? DataCamp의 Introduction to Scala 코스를 들어보세요.

Scala는 함수형 프로그래밍 언어로, 일급 시민으로서의 함수와 메서드를 포함하고 있으며 유사점과 차이점이 있습니다. 함수와 메서드는 모두 재사용 가능한 코드 블록으로, 반복되는 코드를 한 곳에 저장하여 특정 작업을 수행하기 위해 함수 호출을 사용합니다. 또한 코드 디버깅 및 수정이 용이해집니다.

그러나 함수는 변수에 초기화된 객체인 반면, 메서드는 ‘def’ 키워드로 시작하며 그 뒤에 메서드 이름, 매개변수 목록, 메서드 본문과 반환 값이 옵니다.

메서드 선언 및 정의

Scala에서 메서드 선언 및 정의의 구문은 다음과 같습니다:

def 'method_name' ('parameters':'return_type_parameters') : ('return_type_of_method') = { 'method_body' return 'value' }

Scala의 메서드는 다음 부분으로 시작합니다:

  1. ‘def’: 메서드를 선언하는 데 사용되는 키워드.
  2. ‘method_name’: 메서드의 이름으로, lower camel case로 작성됩니다.
  3. ‘parameters’: 메서드 매개변수로, 매개변수가 없거나 하나만 있을 수 있지만 매개변수가 여러 개일 때는 쉼표로 구분됩니다.
  4. ‘return_type_of_parameters’: ‘parameters_list’의 데이터 타입에 맞춰야 하며 필수적입니다.
  5. ‘return_type_of_method’: 선택 사항입니다. 기본적으로 ‘Unit’이 반환되지만, ‘return’ 키워드로 값을 반환할 수 있습니다.
  6. 할당 기호(‘=’): 선택 사항입니다. 사용하면 반환 값을 할당하고, 사용하지 않으면 메서드가 아무것도 반환하지 않습니다.
  7. ‘method_body’: 중괄호 ‘{}’ 안에 있는 코드 블록으로 필요한 로직이나 특정 작업이나 연산을 구성합니다.
  8. return: 필요한 값을 반환하고 프로그램을 종료하는 데 사용되는 키워드지만, Scala에서는 거의 사용되지 않습니다.

메서드 호출

Scala에서의 메서드 호출 문법은 다음과 같습니다:

method_name(arguments)

메서드 호출은 ‘method_name’을 통해 빠르게 수행할 수 있으며, 호출하려는 메서드의 이름과 인자를 전달합니다.

명명된 인자로 호출되는 메서드

명명된 인자로 호출되는 메서드는 메서드 호출 시 각 인자를 메서드 매개 변수에 대응시켜서 전달할 수 있게 합니다. 아래에는 함수 선언과 정의를 통한 인자 전달 예제와 메서드 호출을 실제로 수행하는 것을 볼 수 있습니다:

object calculateResult { def funSub(x:Int, y:Int) : Int = { var diff:Int = 0 diff = x - y // return value return diff } def main(args: Array[String]) { // Function call println("Difference of the value is: " + funSub(8,6)); println("Difference of the value is " + funSub(y=6,x=8)); } }

위 프로그램은 다음과 같은 출력을 줍니다:
값의 차이는: 2
값의 차이는: 2

위 프로그램은 ‘calculateResult’ 객체를 포함하고 있으며, 그 안에 ‘funSub’라는 이름의 메소드가 있으며 매개변수 x와 y 모두 ‘Int’ 반환 형식을 가지고 있으며, 메소드의 전체 반환 형식은 ‘Int’입니다. 그 뒤에는 반환 값의 대입 문이 따라옵니다. 중괄호는 메소드 본문의 시작을 나타냅니다. 여기서 ‘diff’ 변수는 0으로 초기화됩니다. 메인 메소드에서 수행되는 ‘funSub(8,6)’ 메소드 호출은 ‘x’에 8, ‘y’에 6을 대입하고 뺄셈 연산을 수행하며, ‘diff’의 값을 반환하고 마지막으로 출력됩니다. 마찬가지로 ‘funSub(x=8,y=6)’은 메소드 호출 시 매개변수의 순서는 중요하지 않으며 ‘y’에 6, ‘x’에 8을 대입하여 비슷한 연산을 수행하고 반환하고 결과를 출력합니다.

기본 매개변수 값

메소드 매개변수의 기본 값을 지정하고 인자를 전달하지 않으면 메소드 호출을 비워두고 할 수 있습니다.

object calculateResult { def funSub(x:Int=9, y:Int=6) : Int = { var diff:Int = 0 diff = x - y // return value return diff } def main(args: Array[String]) { // Function call print( "The final value is: " + funSub() ); } }

위 프로그램은 다음과 같은 출력을 줍니다:
최종 값은: 3

위 프로그램은 ‘calculateResult’라는 객체를 포함하고 있으며, 그 안에 ‘funSub’라는 메서드가 있습니다. 이 메서드는 x와 y라는 매개변수를 가지고 있으며 둘 다 ‘Int’ 타입으로 반환됩니다. 메서드 전체의 반환 타입도 ‘Int’입니다. 메서드 본문은 중괄호로 시작되며, ‘diff’ 변수는 처음에 0으로 초기화됩니다. 메서드 호출은 메인 메서드 내부에서 수행되며, ‘funSub()’가 호출되어 x는 9로, y는 6으로 초기화되고 연산이 수행되어 ‘diff’ 값이 반환되고 출력됩니다.

가변 길이 인수

가변 길이 인수는 사용자가 임의의 개수의 인수를 전달할 수 있는 인수입니다. 메서드의 마지막 매개변수는 ‘*’를 사용하여 선언되며 반복될 수 있습니다.

object variableArgument { def main(args: Array[String]) { printAll("Scala", "is", "great") } def printAll(strings: String*) { var i : Int = 0; for( value <- strings ){ println(value); i = i + 1; } } }

위 프로그램은 다음과 같은 출력을 제공합니다:
Scala
is
great

위 프로그램은 ‘variableArgument’ 객체와 ‘printAll’ 메서드를 포함하고 있으며, 끝에 가변 길이 인수 ‘String*’이 정의되어 있습니다. 메서드 호출 시 문자열 목록을 전달할 수 있으며, 전달된 문자열 목록은 루프를 통해 반복되어 주 함수 내에서 출력됩니다.

재귀 함수

재귀는 함수적 프로그래밍에서 사용하는 기술이며, 문제는 자신을 작게 분해하여 解决하는 것으로 해결되며, 이러한 작은 子 문제들은 원본 문제와 유사하게 구성되어 있다. 더 작은 문제들을 解决하고 그 해결策을 적용하여 원본 문제의 해결策을 얻는다. 따라서, 분할 및 정복이나 감소 및 정복 문제라고 불립니다. 이러한 기법은 코드가 清洁하고 精巧하게 되는 것을 促进了하고 있다. 재귀 함수를 쓰는 것을 위해서는 두 가지 중요한 사항을 꼭 고려해야 한다. 그 것은 다음과 같다.

  • 기본 상황: 재귀를 사용하지 않고 무한 재귀로 이어질 수 있는 함수에서는 여러 가지 기본 상황이 있을 수 있습니다. 이러한 기본 상황은 재귀를 사용하지 않고도 해결할 수 있는 输出行위나 해결策이 필요하며, 이를 기반으로 해결할 수 있습니다.
  • 재귀 상황: 재귀 함수를 적용하는 상황을 의미하며, 재귀 호출이 이뤄지는 것입니다. 문제의 주요 내용은 각 재귀 호출에서 사이즈가 작아지는 것입니다. 즉, 문제를 작게 분해하여 子 문제로 나누어야 합니다. 이를 기반으로 기본 상황을 Reach하면, 결국 주요 문제를 해결하는 데 해결策을 조합하는 것입니다.

任意의 수의 阶乘은 n!로 표현되며, 수학적으로는 다음과 같이 나타낼 수 있습니다:

n! = n.(n-1).(n-2)…3.2.1

또한, 項(n-1).(n-2)…3.2.1를 (n-1)!로 표현할 수 있으며, 任意의 수의 阶乘은 항상 n.(n-1)!로 나타낼 수 있습니다.

이제 아래에 문제를 재귀적으로 해결하는 방법을 보실 수 있습니다.

object factorialDemo { def main(args: Array[String]) { for (i <- 1 to 5) println( "Factorial of " + i + ": = " + factorial(i) ) } def factorial(n: Int): Int = { if (n <= 1) return 1 else return n * factorial(n - 1) } }

위의 프로그램은 다음과 같은 출력을 제공합니다:
1의 팩토리얼: = 1
2의 팩토리얼: = 2
3의 팩토리얼: = 6
4의 팩토리얼: = 24
5의 팩토리얼: = 120

위에서 ‘factorialDemo’라는 객체가 있고 그 안에 루프가 다섯 번 반복되는 ‘main’ 함수가 있으며, 재귀 함수가 5번 호출되는 ‘factorial’ 함수 호출도 포함되어 있음을 알 수 있습니다. n이 1 이하가 되면 기본 조건에서 멈추고 결과가 반환되어 출력됩니다.

익명 함수

익명 함수는 이름이 없는 가벼운 함수 정의로, Scala에서는 함수 리터럴로 알려져 있습니다.

익명 함수의 구문과 예시는 다음과 같습니다:

  • 첫 번째 익명 함수의 구문과 예시는 다음과 같습니다:

구문:

('first_variable':'data_type', 'second_variable':'data_type') => "certain_expression"

예시:

(var1:String:var2:String) => var1 + var2

또는

  • 두 번째 익명 함수의 구문과 예시는 다음과 같습니다:

구문:

(_:'data_type')operator(_'data_type')

예시:

(_:String)+(_:String)

첫 번째 구문은 “=>” 다음의 표현식이 특정 값으로 평가되며, “=>” 이전의 변수 목록은 표현식을 평가하는 데 사용됩니다.

위의 두 번째 구문은 ‘와일드 카드’ 문자로서 값을 한 번만 받아들이는 자리 표시자처럼 작동하며, 연산자가 그들 사이에서 작동합니다.

아래에 익명 함수의 예를 볼 수 있습니다:

object anonymousDemo { def main(args: Array[String]) { var function1 = (var1:Int, var2:Int) => var1 + var2 var function2 = (_:Int) + (_:Int) // function call println(function1(5, 5)) println(function2(7, 3)) } }
Initializing Scala interpreter ... Spark Web UI available at http://DESKTOP-03TH7J0:4040 SparkContext available as 'sc' (version = 2.4.3, master = local[*], app id = local-1566986265958) SparkSession available as 'spark' <console>:10: error: unbound placeholder parameter var function2 = {_:Int} + {_:Int} ^ <console>:10: error: unbound placeholder parameter var function2 = {_:Int} + {_:Int} ^

위 프로그램은 다음과 같은 출력을 제공합니다:
10
10

위에서 ‘anonymousDemo’라는 객체가 ‘main’ 함수와 함께 두 개의 익명 함수를 포함하고 있음을 볼 수 있습니다. 이 함수들은 문법적으로 다르지만 동일한 결과를 생성할 수 있습니다. ‘function1’은 함수 호출에서 매개변수를 받아 평가되며, 5와 5를 전달하여 10이라는 결과를 출력합니다. 반면에 ‘function2’는 7과 3을 전달받아 값을 한 번 받아들이며, 이는 유효한 ‘Integer’를 수용합니다. 당신의 경우, 덧셈 연산을 수행하고 결과를 출력하십시오.

결론

축하합니다, 이 튜토리얼을 읽는 것을 완료했습니다.

Scala에는 고차 함수, 중첩 함수, 커링 함수 등 많은 고급 주제가 있습니다.

참고:
TOUR OF SCALA BASICS
Scala | Functions – Basics
Scala – Functions
Anonymous Functions in Scala

DataCamp의 Introduction to Scala 코스를 확인하십시오.

Source:
https://www.datacamp.com/tutorial/basic-functions-methods-scala