메서드
메서드
Scala에서는 클래스, 케이스 클래스, 트레이트, enum, 객체가 모두 메서드를 가질 수 있어요. 간단한 메서드의 문법은 이렇게 생겼습니다:
def methodName(param1: Type1, param2: Type2): ReturnType =
// the method body
// goes here
몇 가지 예를 볼게요:
def sum(a: Int, b: Int): Int = a + b
def concatenate(s1: String, s2: String): String = s1 + s2
메서드의 반환 타입을 꼭 선언할 필요는 없어서, 원하면 이렇게 써도 돼요.
def sum(a: Int, b: Int) = a + b
def concatenate(s1: String, s2: String) = s1 + s2
그 메서드들을 호출하는 방법은 이렇게요:
val x = sum(1, 2)
val y = concatenate("foo", "bar")
몇 줄에 걸친 메서드의 예시도 볼게요. Scala 2와 Scala 3에서 중괄호가 선택 사항인 걸 볼 수 있어요.
def getStackTraceAsString(t: Throwable): String = {
val sw = new StringWriter
t.printStackTrace(new PrintWriter(sw))
sw.toString
}
def getStackTraceAsString(t: Throwable): String =
val sw = new StringWriter
t.printStackTrace(new PrintWriter(sw))
sw.toString
출처: Scala 3 Book
본문
기본값 있는 파라미터
메서드 파라미터에는 기본값도 줄 수 있어요. 이 예제에서 timeout 파라미터는 기본값이 5000이에요:
def makeConnection(url: String, timeout: Int = 5000): Unit =
println(s"url=$url, timeout=$timeout")
메서드 선언에 기본 타임아웃 값이 제공됐기 때문에, 이 메서드는 두 가지 방식으로 호출할 수 있어요.
makeConnection("https://localhost") // url=https://localhost, timeout=5000
makeConnection("https://localhost", 2500) // url=https://localhost, timeout=2500
이름 붙인 파라미터
Scala는 메서드를 호출할 때 **이름 붙인 파라미터(named parameters)**도 지원해요. 그래서 원하면 이렇게도 호출할 수 있죠:
makeConnection(
url = "https://localhost",
timeout = 2500
)
이름 붙인 파라미터는 특히 메서드에 같은 타입의 파라미터가 여러 개 있을 때 유용해요. 이 메서드를 보면 어떤 파라미터가 true고 false인지 한눈에 헷갈릴 수 있거든요:
engage(true, true, true, false)
확장 메서드
extension 키워드는 괄호 안에 둔 파라미터에 대해 확장 메서드(extension method)를 하나 이상 정의하겠다고 선언하는 거예요. 이 예제에서처럼 String 타입의 파라미터 s는 확장 메서드 본문 안에서 그대로 사용할 수 있어요.
다음 예제는 String 클래스에 makeInt 메서드를 추가하는 방법을 보여줘요. 여기서 makeInt는 radix라는 파라미터를 받아요. 이 코드는 문자열을 정수로 바꿀 때 발생할 수 있는 변환 오류를 고려하지 않지만, 그 세부사항은 제쳐두고 예제가 어떻게 동작하는지 보여줄게요.
extension (s: String)
def makeInt(radix: Int): Int = Integer.parseInt(s, radix)
"1".makeInt(2) // Int = 1
"10".makeInt(2) // Int = 2
"100".makeInt(2) // Int = 4
See also
Scala 메서드는 훨씬 더 강력해질 수 있어요. 타입 파라미터와 컨텍스트 파라미터도 받을 수 있죠. 그것들은 Domain Modeling 섹션에서 자세히 다룹니다.
더 알아보기
- 메서드에 대한 더 자세한 내용은 "Methods" 및 "Domain Modeling" 섹션에서 다룹니다.