삽질인가 고찰인가

변수, 타입 추론 VS 명시적 타입 지정. 그동안 명시적 타입을 선호했는데... '타입 추론'을 지향해야 한다고?

우당탕 오리의 개발모험 2025. 1. 31. 00:10

 

🥸 의문이 생겼다.

읽고 있던 책에 이런 문구가 나왔다.

주석과 마찬가지로 명시적인 변수 타입 지정이 필요 없는 코드를 작성하도록 노력해야 한다.
[책. 자바에서 코틀린으로 p258]

 

그리고 의문이 생겼다.

'왜 타입추론으로 코딩하도록 노력해야 하지? 명시적 변수타입을 지정하는 스타일이 더 가독성 좋지 않나?'

 

 

의문을 풀어보자.

이번에도 나의 친구 GPT에게 물어봤더니 아래처럼 말한다

**"타입이 명확할 때는 추론을 맡기고, 명확하지 않을 때만 타입을 명시적으로 지정"**하는 게 더 함수형적이고, 코드를 더 깔끔하고 간결하게 유지할 수 있는 방법이지. 😊

 

대화 내용을 좀 더 정리해 보겠다.

 

타입 추론을 선호하는 이유

타입 추론은 컴파일러가 자동으로 타입을 추론한다.

이런 방식은 함수형 프로그래밍에서 선호되는 스타일이다.

선호되는 이유는 "가독성이 좋다", "유지보수성이 높다", "간결한 코드를 추구한다"의 이유가 있다.

  • 가독성: 이미 타입이 명확한 코드에서는 굳이 명시하지 않는 게 더 깔끔하다.
  • 유지보수성 향상: 추후 코드 수정할 때 타입을 일일이 변경하지 않아도 됨.
  • 주석과 비슷: 코드가 길어지고 의도파악하는데 힘들어 질 수 있다.
// kotlin 예시
val name = "Hello"  // <- 코드량 더 적고 가독성도 좋다.
val name: String = "hello" // <- "hello"를 보자마자 String인걸 아는데 굳이 명시할 필요 없어 보인다.

// java 예시
var name = "hello";
String name = "hello"; // java 예시는 별 차이가 없다?

 

 

😤 하지만, 타입 명시가 유용할 때도 있다!

GPT와 책에서도 언급되었긴 하다. '타입 명시가 코드 이해에 더 도움이 될 때'이다.

 

내 생각을 더 추가하자면, '별도 함수/메서드를 호출하고 그 결과를 변수로 받을 때'이다.

리턴값 결과는 받았는데 타입이 명시되지 않아서 굳이 그 메서드를 찾아가야 하기 때문이다.

 

특히 개발자들이 비지니스로직 때문에 만든 메서드인 경우 메서드의 결과를 '개발자'가 추론하긴 쉽지 않다.
(물론 컴파일러는 잘 추론하겠지만...)

즉, 해당 메서드를 굳이 찾아봐야 하는 경우가 많을 것이라 생각한다.

val result = someFunction()  // 함수가 어떤 타입을 반환하는지 추론하기 어려울 수 있음

val result: List<Pair<String, Int>> = getPairs()  // 반환 타입을 명시적으로 지정

 

 

📍결론

전적으로 '가독성' 위주로 판단한다.

 

가능하면 타입 추론으로 개발해서 깔끔한 코드를 유지하되

개발자가 추론하기 어려운 경우(메서드 반환값 받을 때)에는 타입을 명시한다.