관리 메뉴

HAMA 블로그

스칼라 vs 코틀린 : 더 나아진 자바를 목표로 경쟁하는 2개의 언어. [번역] 본문

Scala

스칼라 vs 코틀린 : 더 나아진 자바를 목표로 경쟁하는 2개의 언어. [번역]

[하마] 이승현 (wowlsh93@gmail.com) 2017. 11. 10. 18:11


아주 비슷한 느낌을 주는 두 언어 스칼라와 코틀린에 대한 비교 글이 있어서 번역해 보았습니다
이런 글을 읽고 이 언어가 무엇인지 정확히 감을 잡는것은 불가능합니다. 가볍게 읽으세요. 또한 이 글은 superkotline.com 이라는 코틀린 싸이트의 글이므로 약간은 코틀린쪽으로 기운 느낌도 있습니다. 
저는 스칼라와 Python 을 좋아하기 때문에 먼저 다음과 같은 언급을 하고 시작해 봅니다. :-) 


"Twitter 인프라의 대부분은 Scala로 작성되어 있으며..."




Scala vs Kotlin : 네가 해결하기 원하는 문제(분야)가 뭐야? 


Scala와 Kotlin은 자바 왕좌( JVM 기반) 를 차지하기 위한 주요 두 경쟁자입니다.

그들은 같은 문제를 해결하는 것을 목표로합니다 : 더 나은 자바를 제공
하지만 그들은 매우 다른 방식으로 달려가는데요. 

  1. 스칼라는 아카데미에서 설계되었으며, Kotlin은 선도적인 소프트웨어 회사에서 출발 했습니다. 그들이 태어난 배경이 그 차이점을 잘 설명 해 주고 있는데요. Scala는 함수형 프로그래밍과 다른 패러다임 간의 하이브리드라는 멋진 아이디어를 실현하기 위해 탄생했습니다. Kotlin은 실용적인 문제를 해결하려고합니다. Kotlin 디자이너는 컴파일 시간과 훌륭한 도구 지원에 특히 신경을 썼구요..그것이 다른 언어 디자이너에게는 흥미 진진하지 않더라도 프로그래머에게는 그런 인프라가 매우 중요하기 때문이죠.
  2. 스칼라의 큰 장점은 JVM을 위한 또 하나의 주요 정적 언어를 만드는 것이 가능하다는 것이 입증되었다는 것입니다. JVM은 언어 디자이너가 융통성있게 사용할 수 있을만큼 유연했음을 분명히했습니다. Kotlin은 나중에 작업이 시작되었구요. 이제 사람들은 새로운 JVM 언어를 사용한다는 생각에 흥분하기 보다는 그것의 실용적인 측면에 관심을 갖기 시작했습니다.

이 기사에서는 Kotlin과 Scala를 기술적 모양(문법)이 아닌 용도로 주로 비교할 것입니다. (역주: 모양 비교는 이 글 끝에 추가하였습니다. ) 우리는 이 두 언어의 기능에 대해 개괄적으로 살펴보고자하며, 주로 설계된 것에 집중하고 있습니다.


자바는 뭐가 별론데?

Kotlin과 Scala 모두 JVM에서 실행되며 Java와 비교됩니다. 이것은 질문을 유도하게 되는데요.

Java에 무슨 문제가 있습니까?

음, 확실히 Java는 많은 일을 올바르게 처리했습니다. 그것은 혁명적인 언어라기보다 진화적인 언어였습니다. (역주: 진화가 c#에 비해 비교적 더디었다는것은 사실이며, 진화가 빨라야 좋냐? 라면 그것은 케바케겠죠) 자바는 개발자들에 의해 편하게 사용 가능하고, (가비지컬렉팅등) 쉽게 이해 가능하도록 만들어 졌을 뿐 만 아니라, (C++의 ㅣ군더더기 제거및 OOP 를 잘 사용하게 유도)  매우 많은 것을 제공 (모든것이 있는 라이브러리 군단들) 했습니다. 또한 Write once, run anywhere 는 매력적이었습니다.

사실 Java는 아마도 세계에서 가장 많이 사용되는 프로그래밍 언어 일 것입니다. Java는 또한 엔터프라이즈 세계에서 가장 많이 사용되는 언어이며 컴퓨터 과학 과정에서 가장 널리 사용되는 언어입니다.


그래 자바는 위대하지. C처럼. 하지만 C 처럼 자바도 늙었다네..


Java가 C보다 발전했으며 운 좋게도 C++보다 체계적인 방식으로 개발되었지만 , 현재는 다른 많은 새로운 언어에 비해 뒤떨어져 있습니다. 그래도  아직까진 많은 개발자들이 Java에 만족합니다. 그러나 많은 사람들이 비슷한 목적을 가진 언어인 C #과 비교해 보았습니다. 또는 다른 거의 모든 현대 언어.

많은 개발자와 회사가 더 생산적인 것을 원한다는 것은 비밀이 아닙니다. Java 자체에 대한 많은 기술적 비판과 더 사용하기 쉽게 하기 위한 방식을 제한하는 많은 걸림돌이 있습니다. 이것은 성공의 저주지요. 많은 사람들이 이미 그것을 사용하고 있기 때문에 설계자는 자신이 뭔가 잘못되었다는 것을 알았더라도 근본을 바꿀 수 없습니다.(역주: 하스켈언어는 스스로 성공하지 않기를 바라고 있습니다. Avoid success at all costs

왜 Scala 와 Kotlin?






수년 동안 개발자들은 JVM에 새로운 언어를 구축해 왔으며 이러한 언어 중 상당수는 Java와 비교하여 나름 개선된 기능과 Java 이상의 기능을 제공합니다. 많은 사람들이 개발자의 생산성과 경험을 향상 시키려고 노력했으며, Java로 할 수있는 것과 동일한 일을 수행하거나 Lisp과 비슷한 동적 언어 같은 다른 것을 만들려고했습니다.

Scala는 사용자의 요구에 따라 확장 가능한 언어인 Scalable Language의 약자이며 Kotlin은 Java와 마찬가지로 섬 (러시아)의 이름입니다.

우리는 Kotlin과 Scala를 선택했는데 그 이유는 정적타입 언어이며 두 가지 접근법의 훌륭한 대표자이기 때문입니다. Kotlin은 의도적으로 Java보다 개선된 언어를 지향하며, Scala는 철학이 다른 언어입니다. Kotlin은 "필요한" 모든 것을 제공하며, Scala는 "원하는" 모든 것을 제공합니다.

스칼라에는 훌륭한 기능들이 있지만 가장 명백한 결함은 컴파일 속도가 매우 느리다는 것입니다.

Scala에서 Kotlin으로 옮기기로 결정한 사람들의 기사를 이미 찾을 수 있습니다. 어떤 면에서 Kotlin의 창작자도 그렇게 한거죠.  Kotlin 을 창안하기로 결정한 이유 중 하나를 설명한 Kotlin 개발자와의 인터뷰 에서 알수 있습니다.

물론 Kotlin이 Scala보다 낫다는 것은 아닙니다. 반대로 Kotlin 디자이너는 스칼라가 훌륭한 언어라고 생각합니다. 하지만 자바와 마찬가지로 스칼라도 자신들의 필요에 맞게 설계되지 않았기 때문에 코틀린을 만든 것이죠.

몇 가지 기능 비교

우리가 소개에서 말했듯이, 우리는 모든 기술적 인 특징을 열거하고 있지도 않고 문법을 보고 있지도 않습니다. 너무 많은 그런 세부 정보는 문맥없이 바라볼때  혼동이 될 수 있다고 생각합니다. 그럼에도 불구하고 몇가지 중요한 특징과 언어가 선택하는 접근 방식을 살펴 볼 필요는 있는거 같습니다.

객체 지향

Java는 객체 지향 프로그래밍을 위해 설계된 언어이지만 모든 것이 객체는 아닙니다. 숫자와 같은 기본 유형은 primitive 타입으로 표시됩니다.반면에 스칼라와 코틀린에서 모든 것은 객체이며 그 자체로 접근 할 수 있습니다. primitive  타입 대신에 참조 타입을 사용하는 것에 약간의 불이익이 있기 때문에 이것이 아픈 선택이긴 하지만, JVM에서는 값 타입을 정의 할 수 없다는 사실 때문입니다. 따라서 더 똑똑한 타입 시스템의 장점을 얻으려면 참조 유형으로만 구현하면됩니다.

Scala와 Kotlin은 다른 프로그래밍 패러다임도 지원합니다. Kotlin은 주로 객체 지향 언어로 무게추가 남아 있지만 일반적인 프로그래밍에서 유리하게 작동 할 수 있는 모든 프로그래밍 패러다임의 기본 요소를 포함합니다.

함수형 프로그래밍

Kotlin은 람다 (lambdas) 및 고차원 함수와 같은 기본적인 기능을 지원하지만 함수형 프로그래밍 패러다임을 완전히 지원하지는 않습니다. 언제나 그렇듯이, 컴퓨터 과학에서 박사 학위를 요구하지 않고도 평균 프로그래머에게 유용 할 수있는 실용적인 해법만 제공합니다. 예) 

  • 독립적 (최상위) 함수가 좋으며, 별도의 함수를 포함하기 위해 유틸리티 클래스를 만들 필요가 없습니다.
  • Kotlin은 문장이 아닌 표현식을 정의하므로 if 의 결과 같은 것을 변수에 할당 할 수 있습니다.
  • val 을 이용하여 불변의 데이터를 쉽게 정의 할 수 있습니다 final 같은 수정자가 필요 없음

Scala는 함수 및 객체 지향 프로그래밍 패러다임을 동일하게 지원합니다 . 이 목표를 염두에 두고 설계되었으며, 하스켈에서 찾을 수 있는 대부분의 기능을 갖추고 있습니다. Kotlin이나 Java에서는 currying, memoization, partial application, type classes등의 기능이 없지만 스칼라는 모두 가지고 있습니다.

작은 것들

모든 언어가 다를 수 있습니다. Kotlin과 Scala는 생산성을 높히는 많은 기능들을 가지고 있습니다. Java가 만들어 질 때  없었던 타입 추론과 싱글톤 또는 데이터 클래스를 만드는 빠른 방법과 같은 것들 말이죠.

코틀린

Kotlin은 null-safety 와 smart casts 와 같은 흥미로운 것들에 대한 지원을 제공하고 있습니다. smart casts 란 새로운 유형으로 자동 캐스팅되는 변수의 타입을 확인한 경우 해당 변수가 실제로 해당 타입의 변수인지 여부를 확인하는 것을 의미합니다. 일반적으로 Kotlin은 더 많은 기능을 추가하는 대신 기능 집합을 매우 잘 사용합니다. 예를 들어, 연산자를 오버로드 할 수 있지만 이미 언어에 있는 기본 연산자만 가능하며 새 연산자를 정의 할 수는 없습니다.

Kotlin은 내부 DSL (역주: 미니언어 ) 이나 유창한 인터페이스를 쉽게 만들 수 있습니다. 그것은 람다와 구문 도우미(syntactic sugar) 의 도움으로 그렇게 합니다. 사실 함수의 마지막 인자가 람다라면 괄호 밖에서도 사용할 수 있습니다. 이것은 복잡한 문자열 보간의 필요성을 줄이는데 유용합니다. 예를 들어,이 예제는 HTML을 생성하기 위해 라이브러리를 사용합니다.

createHTML().table {
    for (language in languages) {
       tr {
           td { +language.name }
           td { +language.popularity }
       }
    }
}

스칼라

스칼라는 함수형으로나 객체 지향적으로 원하는 모든 기능을 제공합니다. 그것에는 약간의 약점도 있지만 (예를들어 null-safety의 managament는 Kotlin보다 덜 효율적이며 자연스럽지 않습니다.) 스칼라는 매크로를 포함하고 복잡한 연산자를 생성 할 수 있기 때문에 복잡한 내부 DSL을 만드는 데에 탁월합니다. 스칼라를 사용하면 큰 자유와 수많은 기회를 가질 수 있습니다. 하지만 그 자유 때문에 몇몇 개발자는 코드 자체에서 목적이 명확하지 않은 이상한 사용자 지정 연산자를 과용하는 것에 힘들어 할 수도 있습니다.


Java와의 상호 운용성

함께 일하는 사람들

Kotlin은 Java와 함께 작동하도록 설계되었습니다.

Kotlin은 Java와의 호환성을 유지하기 위해 만든 언어입니다. 심지어 Java에서 Kotlin 관용 코드를 쉽게 호출 할 수 있도록 Java와의 상호 운용성을 용이하게하는 기능도 있습니다. 따라서 기존 소프트웨어를 Java로 계속 개발할 수 있고,  Kotlin으로 새로운 소프트웨어를 만들 수 있습니다.

 Kotlin이 Android에서 매우 인기가 있는 큰 이유 중 하나는 주로 Android 6의 Java 버전인 Java 6과의 호환성 때문입니다. 따라서 Kotlin은 이미 Java 8에있는 기능을 제공하지만 Android 개발자에게는 제공되지 않습니다.

Java와의 상호 운용성은 우연이 아니며 단순히 JVM에서 실행되는 언어를 사용하여 얻을 수 있습니다. JetBrains는 Kotlin이 현재 Java 생태계와 상황을 인식하도록 설계했습니다. 그들은 사용하기 쉬운 방식으로 최대한의 가치를 이끌어 내려고 노력했습니다. 이 호환성은 바이트 코드 자체의 구조에 적용됩니다. 코다 (Corda)가 스칼라 (Scala)보다 코틀린 (Kotlin)을 선택하게 된 이유 중 하나는 바로 그 때문입니다 .

스칼라는 자바와 작업 가능 하다.

Scala는 보다 쉽게 ​​배포 할 수 있도록 JVM 플랫폼에서 실행되도록 만들었지만 호환성이 실제로 주요 목표는 아닙니다. 예를 들어 최근 버전의 스칼라에는 Java 8이 필요합니다. 

언어의 특징과 강하게 결합되었다는것의 의미는 스칼라로 자바를 사용하여 개발하기를 원한다면 기존 Java 코드베이스로 작업 할 수 있지만 잘 살펴봐야합니다. Scala를 옆에 끼고 Java 소프트웨어를 개발하고 있다구요? 별로 좋은 생각이 아닙니다.

스칼라가 객체 지향 프로그래밍뿐 아니라 함수형 프로그래밍을 지원한다는 사실 때문에 호환성이 쉽지만은 않습니다. 고급 기능을 사용하는 경우 자바에서 그다지 많은 기능을 수행 할 수 없습니다. 가능한 경우에도 Java 프로그래머는 이를 사용하는 방법을 모를 수도 있습니다.

(역주: 스칼라를 선택한 이유중 한가지로 광활한 자바 라이브러리의 사용을 꼽을 수 있다. 스칼라에서 그런 자바 라이브러리를 가져다 사용하는것은 그닥 문제가 되지 않는다.) 

다른 철학

많은 성공적인 언어는 정확한 목표와 프로그래밍이 무엇인지에 대한 구체적인 철학을 가지고 있습니다. Kotlin과 Scala도 마찬가지입니다. 스칼라는 자바보다 훨씬 더 많은 것을 계획하고 있지만 (역주: JVM 을 탈피하여 컴파일 언어가 되는 작업도 진행중) 코틀린은 더 나은 자바가 되고 싶어 합니다.

Kotlin은 더 나은 자바인가?

Kotlin은 원래 목표를 달성했다고 주장 할 수 있습니다. Java가 아닌 Android 개발을 위해 공식적으로 지원되는 첫 번째 언어가 되었습니다. 이는 자바 공동체가 Kotlin을 좋아하고 Java 개발자에게 Kotlin을 소개하는 것이 쉽다는 것을 입증하는 위대한 업적입니다.

Kotlin은 생산성을 향상시키고 Java 개발자에게 배우기 쉽도록 만들어진 실용적인 언어입니다. 주로 Java와 비슷하게 디자인 되었지만 Java 모델 위에서 C# 및 Scala 의 좋은 모습 또한 포함되어 있습니다. 람다 및 기본 기능과 같은 자바 프로그래머가 원하는 기능을 추가하고 스마트 캐스팅 및 null이 허용되지 않는 타입과 같은 것을 통해 개발자 생활을 단순화 시킵니다. 많은 경우에 코틀린 에디션은 보통 Syntactic sugar 라고 불리는 그것입니다 개발자가 사용하는 일반적인 패턴을 표현하는보다 간결한 방법을 제공한다는 것이죠.

Kotlin은 함수형 프로그래밍에 대한 일부의 지원을 제공하지만 보다 쉬운 절차 또는 명령적 프로그래밍을 수행하기 위해 위한 것입니다. 예를 들어, 개별 함수가 이제는 언어의 first class 시민이 될 수 있습니다. 코틀린은 formal 하기 보다는 단순한 것을 선호합니다.

스칼라는 Java보다 강력합니다.

스칼라는 그 일( 더 나은 자바) 를 시도하기 보다는 Java보다 강력하도록 설계되었습니다.  일반적으로 자바보다 더 나은 언어입니다. Scala는 Java가 할 수없는 일을 하도록 설계되었습니다.

스칼라는 고급 함수 프로그래밍을 훌륭하게 지원합니다. 사실 함수 프로그래밍은 객체 지향 프로그래밍과 마찬가지로 first-class citizen 입니다. 하지만 이로 인해 복잡성이 증가하고 배우고 사용하기 좀 어렵기로 유명한 언어로 만듭니다. 패러다임을 혼합 할 수 있으므로 유기적으로 혼합한다거나 하기 위해서는 모든 것을 알아야합니다.

이는 어떤 사람들에게 유리하게 작용할 수 있으며, 어떤 사람들에게는 단점이 될 수 있습니다. 스칼라 에는 여러 가지 스타일의 프로그래밍이있어 혼란을 가져 올 여지가 있으며 모든 필요에 따라 최상의 스타일을 사용할 수 있습니다. 어쨌든 이것은 더 높은 개발 비용과 높은 스칼라 개발자를 위한 임금 인상으로 이어집니다. 당신이 누구인지에 따라 좋거나 나쁜 것일 수 있습니다.

(역주: 스칼라도 함수형 파라다임을 그냥 도우미 정도로만 생각한다면 더 나은 객체지향 자바로써 사용 할 수도 있습니다.) 

언어의 세계

일광과 하프에서 지구의 절반을 표현한 것

커뮤니티

 Kotlin이 아마도 이미 우위를 차지하고있는 Android 개발에 대해 이야기하지 않는 한 스칼라는 더 커다란 공동체를 가지고 있습니다..만  Kotlin이 받은 열정 을 보려면 2017 Google I / O를 살펴보십시오 .

네이티브 라이브러리의 상대적 부족은 우수한 Java 호환성으로 인해 다소 완화됩니다. 그러나 idiomatic 한 Kotlin 코드가 있는 강력한 라이브러리는 Kotlin에서 항상 사용할 수있는 것은 아니며 Scala와 Java용 라이브러리 같이 깊이 개발되지는 않았습니다.

문서화 및 학습의 용이함

두 언어 모두 좋은 문서를 가지고 있습니다만 스칼라에서 개발자를 훈련시키고  그것의 개발 스타일로  훈련시키는것이 쉽지만은 않습니다

코틀린은 다릅니다.  Corda는

우수한 문서와 작은 표준 라이브러리는 매우 빠른 언어 학습을 가능하게합니다. 우리는 Kotlin의 경험이 필요하다고 명시적으로 광고하지 않으며, 모르는 사람을 고용하여도 새로운 팀원이 코틀린으로 괜찮은 코드를 생성하기까지 1-3 일의 범위 내 였습니다.

Kotlin은 배우기 쉽고 사용하기 쉽고 예제 가 있는 훌륭한 온라인 테스트 환경을 갖추고 있으며 Java 코드로도 변환 할 수 있습니다. 따라서 Java에서 수행하는 것과 동일한 작업을 수행하는 방법을 즉시 확인 할 수 있습니다.

툴링(Tooling)

스칼라와 코틀린은 모두 정적 형식의 언어이므로 컴파일러 검사 및 정적 분석 도구 전체를 허용합니다. 그래서 잠재력은 비슷합니다. 하지만 프로그래밍 툴의 유명한 소프트웨어인 JetBrains가 만든 Kotlin의 툴링이 좀 더 좋은것은 당연한 것이 겠지요. 문서에 관해서는, Scala가 나쁜 경우는 아니지만 Kotlin은 더욱 더 굉장합니다.
 IntelliJ IDEA 의 스칼라 지원도 빠방합니다만 
 Kotlin은 이미 IntelliJ IDEA와 Android Studio에 통합되어 있습니다. 또한 이클립스용 플러그인도 있구요. 또한 IntelliJ IDEA는 온라인에서 사용 가능한 동일한 변환 도구와 예제를 제공하므로 대화식 예제를 사용하여 Java 클래스를 쉽게 변환하고 언어를 배울 수 있습니다. 

개요

Kotlin 디자인은 전체론적(holistic) 접근 방식을 취하는 것처럼 보입니다. 작성자는 각 디자인 결정이 전체 개발 경험에 어떻게 영향을 주는지 고려했습니다. 그 기능이 정말로 필요 했습니까, 아니면 대안이 있습니까? 그 선택은 컴파일러의 속도를 느리게합니까? 훌륭한 도구 지원을 제공하기가 더 어려워 집니까?

스칼라 디자이너들은 실용주의자들에 의해 괴롭힘을 당하지 않은 것처럼 보입니다. 이것은 마치 C ++을 생각 나게합니다. (역주: 현재 제가 그런 생각을 좀 하고 있습니다. 10여년 전에 Modern C++ design 책을 보며 자괴감이 들었던것처럼 현재 FPIS 를 읽으며 비슷한 느낌이 드는... 그러고 보니 둘다 빨간책이군요 ㅎㅎ) 물론, 그들은 자신의 하위 집합을 채택하여 조직에서 사용되는 언어의 복잡성을 줄일 수 있다고 말합니다. 그것은 회사에서는 작동 할 수 있지만, 모든 사람들을 위한 아이디어는 아닌 거 같습니다.

많은 사람들이 자바 보다 더 나은 언어에 대한 희망으로 스칼라로 옮겼습니다. 첫 번째 동기 부여가 있는 대부분의 사람들은 Scala에 만족합니다. Java에 단순히 만족하지 못하는 많은 사람들은 Scala의 복잡성에 조금 당황합니다. 네!!! 그것은 그들에게 맞는 언어가 아닙니다. 그것은 단순한 오래된 Java와는 다른 무언가입니다.

Kotlin은 아마 그들에게 더 좋은 언어 일 것입니다. 모든 자바 개발자는 스칼라가 아닌 Kotlin을 쉽게 선택할 수 있습니다 .

Java 자체보다 생산성이 높은 자바와 같은 언어가 필요한 경우 Kotlin과 함께해야합니다. Haskell과 Java가 필요하다면 Scala로 가야하지만요..


이 실용적인 비교가 유용했기를 바랍니다. 기술적인 비교와 두 언어의 문법을보고 싶다면  아래 링크를 참고하세요.






번역: https://superkotlin.com/kotlin-vs-scala/

Comments