Skip to content

타입 정보 추론하기

druwahf edited this page Aug 8, 2016 · 2 revisions

정적 타입 언어는 때로 번잡할 수 있다.

Java 7 이전

import java.util.HashMap;
...
HashMap<Integer, String> intToStringMap = new HashMap<Integer, String>();

Java 7

HashMap<Integer, String> intToStringMap = new HashMap<>();

Scala

val intToStringMap: HashMap[Integer, String] = new HashMap

// HashMap[Integer, String] 을 등호의 우변으로 옮길수 있다
val intToStringMap2 = new HashMap[Integer, String]

하스켈과 같은 일부 함수형 언어는 전역 타입추론을 사용하므로 가의 모든 타입을 추론할수 있지만 스칼라는 서브타입 다형성, 즉 상속을 지원해야 한다는 이유로 전역 타입 추론을 사용하지 않는다

언제 명시적으로 타입을 표기해야 하는가?

  • 변경 가능한 varsk 변경 불가능한 val 선엔에서 값을 대입하지 않는 경우
  • 모든 메서드 매개변수
  • 다음과 같은 메서드 반환타입의 경우 -> 메서드 안에서 return 을 명시적으로 호출하는 경우 -> 메서드가 재귀적인 경우 -> 오버로딩한 둘 이상의 메서드가 있고, 그중 한 메서드가 다른 메서드를 호출하는 경우, 호출하는 메서드에는 반환 타입을 표기해야 함 -> 컴파일러가 추론한 타입이 개발자의 의도보다 더 일반적인 경우

첫번째 예시(오버로딩한 둘이상의 메서드가 있고 그중 하나가 다른 메서드 호출)

// src/main/scala/progscala2/typelessdomore/method-overloaded-return-v1.scX
// 'StringUtil'의 첫 번째 버전 (컴파일 오류 발생)
// 에러: 컴파일 할 수 없음. 두번째 'joiner'에 String 반환 타입이 필요.

object StringUtilV1 {
	def joiner(strings: String*): String = strings.mkString("-")
	def joiner(strings: List[String]) = joiner(strins : _*) // compile error
}

println( StringUtilV1.joiner(List("Programming", "Scala")) )

실행 결과

...
<console>:10: error: overloaded method joiner needs result type
	def joiner(strings: List[String]) = joiner(strings : _*) // compile error
	                                    ^
...

수정된 코드

	def joiner(strins: List[String]): String = joiner(strings :_*)

두번째 예시(컴파일러가 추론한 타입이 개발자의 의도보다 더 일반적인 경우)

// src/main/scala/progscala2/typelessdomore/method-broad-inference-return.scX
// 오류: 컴파일 할 수 없음. 메서드는 실제로 List[Any]를 반환하는데, 이는 너무 '광범위'함

def makeList(strings: String*) = {
	if(strings.length == 0)
}
Clone this wiki locally