0Pricing
Scala for Backend Engineering & Functional Programming · 강의

형식 추론

컴파일러가 형식을 판단하도록 해 보세요.

형식 추론은(는) CoddyKit의 무료 Scala for Backend Engineering & Functional Programming 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Scala for Backend Engineering & Functional Programming 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.

타입 추론이란 무엇인가요?

Scala는 정적 타입 언어이지만 타입을 직접 작성해야 하는 경우는 드뭅니다. 컴파일러가 오른쪽 값에서 타입을 추론합니다.

덕분에 동적 언어의 간결함과 타입의 안전성을 함께 얻을 수 있습니다.

val n = 42        // inferred Int
val label = "hi" // inferred String

리터럴에서 추론하기

val x = 5라고 작성하면 컴파일러는 Int 리터럴을 확인하고 x의 타입을 Int로 지정합니다.

소수 리터럴은 Double이 되고, 따옴표로 묶은 텍스트는 String이 됩니다.

object Main extends App {
  val count = 5
  val ratio = 1.5
  println(count + ratio)
}

함수 반환값 추론

컴파일러는 본문을 바탕으로 메서드의 반환 타입도 추론할 수 있습니다.

여기서 square는 두 Int 값을 곱하는 본문을 가지므로 Int를 반환합니다. 이를 직접 작성할 필요는 없습니다.

object Main extends App {
  def square(x: Int) = x * x
  println(square(6))
}

매개변수에는 여전히 타입이 필요합니다

추론에는 한계가 있습니다. 메서드 매개변수에는 타입을 표시해야 합니다. 컴파일러가 매개변수에서 추론할 정보가 없기 때문입니다.

아래 코드는 x에 : Int를 지정하지 않으면 컴파일되지 않습니다.

def increment(x: Int) = x + 1 // type on x is required

추론된 공통 타입

값이 여러 타입 중 하나일 수 있을 때 Scala는 가장 구체적인 공통 타입을 추론합니다.

산술 연산에서 Int와 Double을 섞으면 결과 타입은 Double로 확장됩니다.

object Main extends App {
  val mixed = 3 + 2.0  // Double
  println(mixed)
}

컬렉션에서의 추론

컬렉션은 포함된 값에서 요소 타입을 추론합니다.

정수 목록은 자동으로 List[Int]가 되므로 타입 주석 없이도 완전한 타입 안전성을 유지할 수 있습니다.

object Main extends App {
  val nums = List(1, 2, 3) // List[Int]
  println(nums.sum)
}

추론이 예상과 다를 때

때로는 추론이 원하는 것보다 더 넓은 타입을 선택합니다. 여러 숫자가 섞인 목록은 List[Double] 또는 심지어 List[AnyVal]로 추론될 수 있습니다.

추론된 타입이 필요에 맞지 않다면 명시적인 타입 주석을 추가합니다.

val a = List(1, 2.0)        // List[Double]
val b = List(1, "two")     // List[Any]

타입 주석으로 재정의하기

언제든 명시적으로 작성할 수 있습니다. 타입을 주석으로 지정하면 의도가 문서화되고 너무 좁게 추론된 타입을 재정의할 수 있습니다.

여기서는 리터럴 7을 의도적으로 Long으로 확장합니다.

val seconds: Long = 7
val data: List[Int] = List(1, 2, 3)

공개 API는 명시적으로 작성하세요

일반적인 스타일 규칙은 지역 val에는 추론을 사용하되, 공개 메서드에는 명시적인 반환 타입을 작성하는 것입니다.

이렇게 하면 구현이 바뀌더라도 라이브러리의 계약을 안정적으로 유지할 수 있습니다.

def total(items: List[Int]): Int = items.sum

추론은 타입 안전성을 유지합니다

추론은 타입 시스템을 약화시키지 않습니다. 컴파일러는 여전히 잘못된 연산을 거부합니다.

아래에서 name은 String으로 추론되므로 숫자를 곱하려 하면 컴파일에 실패합니다. 이는 올바른 동작입니다.

val name = "Lia"
val bad = name * 3 // error: value * is not a member of String in this sense

추론된 val도 여전히 불변입니다

추론은 타입만 채워 줍니다. 바인딩이 가변인지 여부는 바꾸지 않습니다.

val n = 10은 여전히 불변이고 Int로 고정됩니다. 컴파일러가 : Int를 직접 입력할 수고를 덜어 준 것뿐입니다.

object Main extends App {
  val n = 10 // inferred Int, still a val
  println(n * n)
}

빠른 확인

Scala에서는 어떤 경우에 여전히 타입을 직접 작성해야 할까요?

복습

타입 추론을 사용하면 정적 안전성을 유지하면서도 Scala 코드를 간결하게 작성할 수 있습니다.

  • 지역 val과 반환 타입은 보통 자동으로 추론됩니다.
  • 메서드 매개변수에는 반드시 타입을 표시해야 합니다.
  • 추론은 가장 구체적인 공통 타입을 선택합니다.
  • 공개 API에서는 명시적으로 타입을 표시하거나, 예상과 다른 추론 결과를 재정의해야 할 때 타입을 작성하십시오.

자주 묻는 질문

“형식 추론” 강의는 무료인가요?

네 — “형식 추론” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Scala for Backend Engineering & Functional Programming 강의 전체를 잠금 해제할 수 있습니다. Scala for Backend Engineering & Functional Programming 강의에는 총 4개의 강의가 포함되어 있습니다.

“형식 추론”에서 뭘 배우나요?

컴파일러가 형식을 판단하도록 해 보세요. 브라우저에서 직접 실행하는 실습 코드로 Scala for Backend Engineering & Functional Programming을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Scala for Backend Engineering & Functional Programming을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Scala for Backend Engineering & Functional Programming은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“형식 추론” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Scala for Backend Engineering & Functional Programming 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Scala for Backend Engineering & Functional Programming 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. val과 var
  2. 기본 형식과 리터럴
  3. 형식 추론
  4. 문보다 식
← Scala for Backend Engineering & Functional Programming(으)로 돌아가기