오늘의 인기 글
최근 글
최근 댓글
Today
Total
04-29 01:41
관리 메뉴

우노

[Scala] Java와 Scala의 차이 본문

Language/Scala

[Scala] Java와 Scala의 차이

운호(Noah) 2021. 3. 31. 11:20
  • Java와 Scala는 둘 다 JVM 위에서 실행되며, 기존의 Java 라이브러리를 그대로 사용할 수 있다는 공통점이 있습니다.
    • 반대로 Java로 작성된 프로그램에서 Scala로 작성된 라이브러리를 사용할 수도 있습니다.
  • Java는 객체지향을 지원하지만 Scala는 함수형과 객체지향을 모두 지원하며, Scala는 Java의 한계를 극복하기 위해 등장했습니다.
    • Scala는 "함수형을 추구하되 객체지향도 쓸수 있다." 정도이지만, 덕분에 굉장히 강력해질 수도, 복잡해질 수도 있습니다.
  • 해당 포스트에서는 Java와 Scala의 간단한 3가지 차이점에 대해서 다뤄보겠습니다.

1. 함수형 프로그래밍 언어

  • Scala는 "순수 함수"를 지향하는 함수형 프로그래밍 언어입니다.

    • 순수 함수란?

      • 함수의 입력이 주어지면, 항상 일관된 출력이 나오는 함수입니다.

      • 외부의 영향을 받지 않는 함수입니다.

      • 예제 코드

          // 순수 함수
          function func(a, b) {
                    return a + b; // 인자로 들어온 값만 참조해, 리턴값을 생성
          }
        
          // 비순수 함수
          function func(a, b) {
                    return a + b + c; // 외부 요인(c)에 따라 리턴값이 변경됨
          }
  • 또한, Scala는 함수형 프로그래밍 언어이므로, 함수 자체가 일급 객체가 되어, 모든 함수를 객체로 취급할 수 있습니다.

  • 즉, Scala에서는 함수를 함수의 인자로 넘길 수도 있고, 함수의 리턴 값으로 함수가 리턴될 수도 있습니다.

    • 일급 객체란?
      • 다른 요소들과 아무런 차별이 없는 객체를 뜻합니다.
      • 즉, 함수의 인자로도 넘겨질 수 있고, 변수에 대입도 가능한 객체를 일급 객체라고 합니다.
      • 일급 객체의 명확한 정의는 아래와 같습니다.
        1. 모든 일급 객체는 함수의 실질적인 매개변수가 될 수 있다.
        2. 모든 일급 객체는 함수의 반환값이 될 수 있다.
        3. 모든 일급 객체는 할당의 대상이 될 수 있다.
        4. 모든 일급 객체는 비교 연산(==, equal)을 적용할 수 있다.
  • 간단한 예를 들어보겠습니다.

      object Timer {
    
           def oncePerSecond(callback: () => unit) {
               while (true) { callback(); Thread sleep 1000 }
           }
    
           def timeFlies() {
               println("time flies like an arrow...")
           }
    
           def main(args: Array[String]) {
               oncePerSecond(timeFlies)
           }
    
      }
    • 위 예제는 Timer라는 클래스를 만들어,
    • main에서 oncePerSecond라는 메서드를 호출할 때, 또 다른 메서드인 timeFlies를 인자로 넘겨준 예제입니다.
    • oncePerSecond 함수의 인자를 보면 callback이 () => unit이라는 타입을 가짐을 알 수 있는데,
    • ()는 인자를 하나도 받지 않음을 뜻하고, unit은 자바의 void와 유사하게 리턴 값이 없음을 뜻합니다.
    • 위 프로그램은 1초마다 한번씩 callback으로 넘어온 timeFlies 메서드를 호출하게 됩니다.

2. 타입-변수 vs 변수-타입

  • 타입 선언 시, Java는 [int a;] 라고 하지만, Scala는 [val a : Int] 라고 합니다.
  • 이렇게 바꾼 이유는, "타입 추론" or "동적 타이핑" 을 용이하게 하기 위함입니다.
  • 타입추론을 사용하면, 변수 타입이나 메소드 변환 타입을 생략 할 수 있게 됩니다.
  • 즉, "타입을 쓰지 않아도 언어 내부에서 알아서 타입을 챙겨준다." 입니다.
  • 간단한 예를 들어보겠습니다.
    • Scala에서 변수 선언시,
    • [val a : Int = 1] 로 사용해도 되지만
    • [val a = 1] 처럼 변수 타입을 생략해도 됩니다.
    • [val b = new Test] 하면 b 를 알아서 Test 객체로 추론한다는것입니다.
  • 하지만, 모든 타입을 생략하면 컴파일러가 타입을 추론할 없기 때문에 오류가 발생합니다.
  • Scala 코딩을 처음 시작한 사람들은 타입을 어느 정도 생략해도 되는지 알기 어려운데,
  • 시행착오를 통해 컴파일러가 어디까지 타입 추론을 해주는지 감을 잡는 일이 필요합니다.
  • 단, 컴파일러가 추론할 수 있더라도, 필요한 경우에는 적절히 타입을 써주면 코드의 가독성을 높일 수 있습니다.

3. val / var

  • Scala는 변수를 2가지 종류(변경 불가능한 변수 / 변경 가능한 변수)로 나눕니다.

    • val : 변경 불가능한 변수
    • var : 변경 가능한 변수
  • Scala는 val, var 를 사용자가 선택할 몫으로 두었습니다.

  • 물론, Scala는 val 를 권장합니다.

  • 하지만, 양쪽 다 유용하며, 어떤 하나가 특별히 나쁘지 않습니다.

  • 간단한 예를 들어보겠습니다.

      val  a = 10
      a = 11   //  에러
    
      var b = 10
      b = 11  // 정상

참고

'Language > Scala' 카테고리의 다른 글

[Scala] 정규표현식  (0) 2021.05.28
[Scala] 튜플 (Tuple)  (0) 2021.04.15
[Scala] 배열 (Array, ArrayBuffer)  (0) 2020.11.30
[Scala] Map 요소 존재 여부 확인  (0) 2020.10.28
[Scala] String Interpolation  (0) 2020.10.28
Comments