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

Volc·2023년 4월 11일
0

Scala

목록 보기
6/9

언제 타입을 표기해야할까?

  • 변경 가능한 var나 변경 불가능한 val 선언에서 값을 대입하지 않는 경우
    • ex) val book: String 과 같이 클래스 안에서 추상값을 선언하는 경우
  • 모든 메서드 매개변수
    • ex) def deposit(amount: Money) = {...}
  • 다음과 같은 메서드 반환 타입의 경우
    • 메서드 안에서 return을 명시적으로 호출하는 경우
      (메서드의 맨 마지막에서 호출한다고 해도 반환 타입을 명시해야 함)
    • 메서드가 재귀적인 경우
    • 오버로딩한 둘 이상의 메서드가 있고, 그중 한 메서드가 다른 메서드를 호출하는 경우,
      호출하는 메서드에는 반환 타입을 표기해야 함.
      • ex)

        object StringUtilV1 {
           def joiner(strings: String*): String = strings.mkString("-")
           def joiner(strings: List[String]) = joiner(strings :_*) // 컴파일 오류
           
           // def joiner(strings: List[String]): String = joiner(strings :_*) //이렇게 고쳐야 함
        }
        
        println( StringUtilV1.joiner(List("Programming", "Scala")) )
        • 두 번째 joiner가 첫번째 joiner를 호출하므로 타입 String을 명시해줘야 한다.
        • '*'는 0 또는 그 이상의 가변 인자가 들어올 수 있다는 것을 뜻한다.
        • 가변 인자는 오직 하나만 허용된다.
        • 두 번째 메서드는 문자열 리스트를 받는 함수이다.
        • 'strings :_*' 은 strings라는 리스트를 가변 인자 목록으로 다루되, 타입은 알 수 없지만 추론한 타입을 사용하라는 뜻이다.
    • 컴파일러가 추론한 타입이 의도보다 더 일반적인 경우(예를 들면 Any)
profile
미래를 생각하는 개발자

0개의 댓글