Java를 통해 Scala를 사용하는 이유


16

나는 언어로서 스칼라에 완전히 빠져 있지만 왜 어떤 회사가 Java에서 스칼라로 전환해야하는지 고민하고 있습니다. Scala가 JVM 위에 단지 신택 틱 설탕입니까, 아니면 실제 응용 프로그램을 향상시키는 Java보다 Scala의 근본적인 개선이 있습니까?


4
있어 중복 곳을 가지고.

2
무슨 - 당신이 (스칼라) 그것을 (물론, 더 나보다) 많이 사용했던 것 같은데 당신이 당신의 개인적인 경험에서 발견?
FrustratedWithFormsDesigner

Java 개발자가 Scala에 대해 어떻게 생각하는지, Java 개발자로 다음에해야 할 작업, Java에서 Scala로 마이그레이션을 시작하는 방법은 무엇입니까? Scala를 실제 개발을위한 프로그래밍 언어로 사용하는 추진 이유에 초점을 맞춘 답변.
Dakotah North

1
@delnan, 적어도 SO : stackoverflow.com/questions/6073517/… . @DakotahNorth, SE 사이트 사이의 게시물을 교차하지 마십시오-귀하의 질문에 가장 적합한 포럼을 선택하고 거기에만 게시하십시오. 다른 사이트에서는 게시물이 SO에서와 마찬가지로 어쨌든 게시가 종료됩니다.
Péter Török

1
SO에 대한 또 하나의 거의 정확한 사본이 있습니다. stackoverflow.com/questions/2683914/…
Péter Török

답변:


19

면책 조항 : 나는 스칼라 전문가가 아닙니다.

스칼라는 Java (현재)가하지 않는 두 가지 일을 매우 잘 수행합니다.

기능적 문제 해결

  • 가장 기본적인 수준에서 Scala는 컬렉션 지원을 통해 완전히 폐쇄되었습니다. 이것은 더 이상 (DZone 게시물을 뻔뻔스럽게 찢어 버리는) 보일러 플레이트 코드를 작성할 필요가 없음을 의미합니다.

    public List<Item> bought(User user)
    {
        List<Item> result = new ArrayList();
        for (Item item : currentItems)
        {
            if (user.bought(item))
            {
                result.add(item);
            }
        }
        return result;
    }

그러나 대신 다음과 같이 작성하십시오.

def bought(user: User) = items.filter(user bought _)
  • 더 많은 기능적 사랑이 있지만 현재 기능 프로그래밍에 여전히 빠져 있기 때문에 그것에 대해 이야기 할 자격이 없습니다. :)

보다 안전한 방식으로 동시성 해결

  • 스칼라는 액터 모델 (+ 다른 장점)을 가지고 있으며 Java의 변경 가능한 데이터 + 스레드 모델의 잠금보다 안전합니다.

솔직히 스칼라가 Java보다 머리와 어깨를 돋 우게하는 다른 많은 것을 솔직히 생각할 수는 없습니다. 많은 작은 이득과 개선 사항이 있습니다. YMMV

조금 HTH


3
스칼라와 자바 모두에서 akka (actor model)를 사용할 수 있다고 지적하고 싶습니다. 참조 akka.io
조르지오

5
나는 Scala를 좋아하고 Java에서 마이그레이션하고 있습니다. Java와 Scala를 비교하고 Scala 개발자가 가능한 한 상세하고 여러 줄의 Java 코드를 작성하려고 시도하고 그것을 Scala one liner로 대체하기가 매우 어려워도 여전히 나를 화나게합니다. Java 코드보다 가독성이
matt

2
"많은 작은 이득과 개선은 물론, 더 많은 밧줄을 가지고 있습니다." +1
Rob

@lucek 특히 조각이 자바의 대신 C의 중괄호 규칙을 사용 가입일 : P
안드레스 F.

@robjb : "많은 작은 이득과 개선은 물론, 더 많은 밧줄을 가지고 다닐 수 있습니다." 스칼라가 당신에게 매달릴 줄을 더 줄 것을 동의하지 않습니다. 적어도 대답 에이 진술에 대한 설명이 없으며 직접 볼 수 없습니다. 또한 Scala는 OO 언어 (예 : C # 및 Java 8) 위에 몇 가지 기능적 관용구를 도입 할뿐만 아니라 OOP와 FP를 하나의 패러다임에 통합하려고합니다. IMHO 이것은 "작은 개선"이 아니라 패러다임 전환입니다.
Giorgio

9

그것은 "단순한 구문 설탕"의 정의에 달려 있습니다. 예를 들어, 자바는 머신 코드를 넘어서서 단순히 구문상의 설탕 이상의 방법은 무엇입니까?

모든 언어는 기계 코드보다 작을 수 있지만 더 많은 언어를 할 수는 없습니다.

높은 수준의 언어가 테이블에 가져 오는 것은 코드를보다 쉽게 ​​읽고 이해하고 작성하고 더 많은 오류를 포착하는 것입니다. 그리고 제 생각에 가장 정확한 차이는 바로 "구문 설탕"입니다.

그러나 다른 두 가지만을 고려하면 Java보다 Scala의 장점이 여전히 있습니다.

요점을 설명하지는 않지만 클로저를 사용하면 클로저를 사용하지 않는 것보다 코드를 더 작게 구성 할 수 있습니다. 그리고 Java 7은 클로저 (closure) 라고 불리는 것을 추가 할 것이지만, 익명 함수일뿐입니다.

더 많은 오류를 포착하는 데있어 Scala의 우수한 분산 처리는 충분히 증명됩니다. 또한 불변성에 중점을 두어 모든 종류의 오류를 방지 할 수 있습니다. Java가 불변성을 수행 할 수있는 것은 아니라 라이브러리와 함께 제공되지 않습니다.


4
실제로 Java의 '클로저'는 Java 8
Martijn Verburg가

1
@Martijn 수정 해 주셔서 감사합니다. 이 시점에서 나는 더 이상 실제로 신경 쓰지 않습니다.
Daniel C. Sobral

1
구문 설탕은 기존 의미론의 대안 적 구문이라고 말할 수 있습니다. 기계 코드의 의미는 등 개체, 클래스를 포함하지 않기 때문에, 나는 자바가 아니라고 생각 기계 코드를 통해 문법 설탕. 의미론과 프로그래밍 패러다임이 다릅니다.
조르지오

@Martijn Verburg : Java에는 이미 익명의 내부 클래스 형식으로 폐쇄 형식이 있습니다. 부족한 것은 익명 함수입니다 (정확히 하나의 메소드와 특수 구문을 가진 특수 익명 클래스로 생각할 수 있습니다).
조르지오

@Giorgio - 사실,하지만 곧 내부 클래스는 가난하게 다가오는 invokedynamic 기반 구현에 비해 수행하고 그것은 :-) IMO 잘 소스 코드 추한됩니다
마티 Verburg을

2

의 위에 마티의 대답 나는 스칼라 더 많은 것을 추가하고 싶은 표현 자바에 비해 및 장점은 (1)는 당신이 더 생산하게된다 (2) 당신이 버그를 줄일 수있는 동일한 문제 수단을 해결하기 위해 적은 코드를 작성하여 코드 (IMHO 버그가없는 코드는 신화입니다).


0

나는 약 3 개월 동안 스칼라를 사용했지만 여전히 Java로 할 수없는 것을 찾을 수 없습니다. 나를 위해 문자 그대로 스칼라에 관한 모든 문헌은 같은 것을 상용구 로 언급하는 것 같습니다 . 당신이 찾고있는 것이 상용구 를 줄이는 것이라면 Scala는 당신을위한 것이지만 IMHO, 예를 들어 위에서 주어진 필터 예제는 아파치 컬렉션을 사용하여 해결할 수도 있습니다.

<T> CollectionUtils.filter(Predicate<T>...)

또는 폐쇄를 사용하십시오

<T> CollectionUtils.forAllDo(..., Closure<T>)

그러나 물론 더 장황하다. 나는 타입 유추를 좋아한다. 스칼라를 배우면 이것이 아마도 어쨌든 진행되고 있다는 것을 깨닫게 될 것입니다. 제 생각에는 각 언어에는 + ve와 -ve가 있습니다.


-3

이해를위한 목록 이해력.

예를 들어 자바에서는 다음과 같이 작성합니다.

int myVar;
if (condition) {
  myVar = //some value
}
else {
 myVar = //some other value
}

스칼라에서 동일한 코드는 다음과 같이 훨씬 더 우아하게 작성됩니다 (파이썬처럼).

int myVar = (//some value) if (condition) else // other value;

그리고 완료.

스칼라가 제공하지 않는 것이 너무 많아서 Java는 그렇지 않습니다. 전혀 비교가 없습니다. 유일한 문제는 사람들이 Java (CS 클래스에서 가르치는 b / c)에 익숙하고 아직 스칼라 패러다임에 익숙하지 않다는 것입니다.

스칼라는 꼬리 재귀를 가지고 있으며 튜플을 반환 할 수 있습니다 (Java 8에서 올 수 있음).

비교가되지 않습니다. 스칼라는 Java Generics의 핵심 팀에서 일한 Martin Ordersky에 의해 개발되었습니다.

스칼라는 훨씬 뛰어난 언어입니다. 그것이 전부입니다. 달리 말하는 사람들은 단순히 더 잘 알기 위해 스칼라를 탐험하지 않았습니다.

위의 꼬리 재귀 최적화 (JVM이 Scala의 컴파일러가 할 수있는 방식을 수행 할 수 없음)라고 말하고 싶습니다.

스칼라는 또한 JVM 앱보다 빠르게 컴파일하고 실행합니다 (예, 맞습니다). 프레임 워크는 말할 것도 없습니다. 예를 들어 Tomcat을 사용하고 REST를 처리하기 위해 일부 서브릿을 배포합니다.

Tomcat이 할 수없는 한 가지는 비 차단 I / O가 필요한 비동기 작업입니다. 이를 위해 JAVA 개발자는 일반적으로 메시지 큐를 사용하여 해결 방법을 고안했습니다 (메시지를 큐로 보내면 일부 다른 프로세스 또는 스레드가이를 선택하여 백그라운드에서 원하는대로 수행함).

불행히도이 방법은 cr * p이며 Tomcat에 Java 서블릿을 배포 할 때의 한계에 대한 해킹입니다.

Akka + 스프레이를 확인하십시오. 스칼라의 액터를 사용합니다. 액터는 메시지를 통한 유일한 통신 방법을 제외하고는 스레드와 같습니다.

그리고 비동기 REST 호출이 쉬워졌습니다. 장기간 실행되는 백그라운드 작업? 문제 없어요. 그냥 해고하고 잊어 버리고 REST 폴링을 수행하여 프론트 엔드에서 가끔씩 상태를 확인하십시오.

여전히 Java를 사용하고 있으며 scala보다 낫다고 생각되면 컴퓨터를 사용하여 입력을 중단하고 퀼 펜 시대로 돌아가서 촛불로 쓸 수 있습니다. 자바는 기본적으로 스칼라와 비교할 때 친숙하다.


4
이것은 목록 이해의 예가 아닙니다. 그리고 자바에서는 다음과 같이 씁니다 :int myVar = condition ? someValue : otherValue
kevin cline

1
//some value //other value주석을 편집하여 주석 /*some value*/이나 스타일을 지정 해야합니다 . 현재 구문 강조 표시를 망치고 있습니다 : p
KChaloux
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.