스칼라 함수(Function)와 메소드(Method) - 기본 개념과 사용법
View: 173
0
0
작성자: 달빛제이크
카테고리: Scala Language
발행: 2024-06-06
수정
2024-07-07
안녕하세요. 달빛제이크입니다.
스칼라 함수형 프로그래밍에 대해서 알아보고 있는데요. 오늘은 가장 기본이 되는 Function과 Method에 대해서 알아 보겠습니다.
1. 함수와 메소드
함수 (Function)와 메소드 (Method)를 먼저 구분해 볼게요.
함수(Function)는 Parameter를 통해서 Argument를 전달 받아서 주어진 Process를 거쳐 Return 값을 만들어 반환하는 기능을 가진 코드 블록을 의미합니다. Scala에서는 def로 시작하는 모든 코드 블록이 프로그래밍 언어에서 일반적으로 의미하는 함수라고 보시면 되는데, 이 함수들 중에서 클래스 내에서 사용하는 함수를 메소드(Method)라고 부릅니다. 클래스의 구성요소로서의 의미를 가집니다.
2. 스크립트에서의 함수
그렇다면, Script에서 Class 없이 작성한 함수도 메소드일까요?
스칼라에서는 기본 구조가 모두 객체로 되어 있습니다. 따라서 Script에서 Class를 작성하지 않고 코딩을 하더라도 실제로 Compiler에서 Script를 처리할 때에는 작성된 코드를 모드 Class로 변환한 후 컴파일합니다. 그렇기 때문에 Script에서 Class 없이 작성한 코드도 결국 Class의 필드와 메소드로 전환되게 됩니다. 다만, 중요한 것은 코드를 작성하는 사람이 의도를 가지고 Class를 설계해서 그 안에 메소드로서의 함수를 정의했느냐, 아니면 Class 없이 메소드를 구현했느냐 하는 부분입니다. 컴파일러의 내부 처리가 어떻게 되었든, 개발자의 의도에 맞게 정의하는 것이 바람직해 보입니다.
3. 간단한 메소드 예제
아래 예제는 Programming in Scala 책에서 method를 설명할 때 사용한 예제입니다.
object Padding:
def padLines(text: String, minWidth: Int): String =
val paddedLines =
for line <- text.linesIterator yield
padLine(line, minWidth)
paddedLines.mkString("\n")
private def padLine(line: String, minWidth: Int): String =
if line.length >= minWidth then line
else line + " " * (minWidth - line.length)
예제에서 'padLines'와 'private'으로 선언된 'padLine', 두 개의 method로 구성된 'Padding'이라는 이름의 Singleton Object가 선언되어 있습니다.
먼저 'padLine' method를 보면 인자로 String과 Int를 받아서 'minWidth'보다 String의 길이가 같거나 크면 String을 반환하고, 'minWidth'보다 작으면 String의 뒤에 공백문자를 'minWidth'에 부족한 글자 수 만큼 추가해서 반환합니다. 'padLine'이 private으로 선언되어 있기 때문에 외부에서는 접근이 되지 않습니다.
'padLines' method는 'padLine'과 마찬가지로 String과 'minWidth'를 인수로 받지만 'padLine'의 String이 한 줄의 String이라면 'padLines'의 String은 개행문자가 포함된 여러 줄의 String입니다. 특이한 점은 for-yield 부분을 변수에 할당한 점입니다. 스칼라에서 어떤 값을 계산하고 그 결과 값을 반환하는 코드 조각을 Expression(표현식)이라고 부르는데, Expression은 반환 값이 존재하기 때문에 변수에 할당이 가능합니다. 여기서 for-yield 부분은 Expression(표현식)이기 때문에 'paddedLines'라는 변수에 할당되었습니다. 'paddedLines'에 할당된 for-yield 표현식의 역할은, text 변수로 받은 String을 줄 단위로 나누어 'padLine'으로 보낸 후 가공한 String을 받아서 Iterator[String]형식의 반환 값을 만듭니다. 이 반환 값은 'paddedLines' 변수에 저장됩니다. 이 후 'paddedLines.mkString("\n")'에서 다시 개행문자를 붙혀서 String을 구성합니다.
4. 스칼라에서의 함수
위에서 언급한 함수와 메소드는 일반적인 개념으로 특별해보이지 않습니다. 스칼라에서는 함수를 값과 동일하게 인수로 넘기거나 반환값으로도 사용할 수 있는데 클래스 내부에 있는 함수가 메소드이고 이것이 전부라면 first class function으로서의 위치를 갖을 수 없을 것입니다. 그래서 스칼라에서는 함수 값(function value)이라는 이름의 객체를 사용합니다. 함수 값은 function1,function2, function3, ... 트레이트를 상속받아 apply 메소드를 정의한, 런타임에서 전환되는 인스턴스 객체를 의미합니다. 이 함수 값은 함수 리터럴을 작성하거나 메소드를 부분적용함수로 만들어 사용할 수 있습니다. 스칼라에서 first class function은 이러한 의미로서의 함수를 의미합니다.
지금까지 함수와 메소드에 대해서 알아 보았습니다.
일반적인 의미로서의 함수와 메소드는 다르지 않지만 클래스의 구성요소로서의 함수를 구분해서 메소드라고 부릅니다. 스칼라에서는 특별히 function1,2,3... 트레이트를 상속받아 apply 메소드를 구현한 object를 함수라고 정의합니다. 이는 First class function으로서 중요한 역할을 만들어냅니다.
다음 글에서는 Local functions에 대해 알아 보겠습니다.
감사합니다.
