메서드

메서드

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
)

이름 붙인 파라미터는 특히 메서드에 같은 타입의 파라미터가 여러 개 있을 때 유용해요. 이 메서드를 보면 어떤 파라미터가 truefalse인지 한눈에 헷갈릴 수 있거든요:

engage(true, true, true, false)

확장 메서드

extension 키워드는 괄호 안에 둔 파라미터에 대해 확장 메서드(extension method)를 하나 이상 정의하겠다고 선언하는 거예요. 이 예제에서처럼 String 타입의 파라미터 s는 확장 메서드 본문 안에서 그대로 사용할 수 있어요.

다음 예제는 String 클래스에 makeInt 메서드를 추가하는 방법을 보여줘요. 여기서 makeIntradix라는 파라미터를 받아요. 이 코드는 문자열을 정수로 바꿀 때 발생할 수 있는 변환 오류를 고려하지 않지만, 그 세부사항은 제쳐두고 예제가 어떻게 동작하는지 보여줄게요.

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" 섹션에서 다룹니다.