우노
[Scala] Java와 Scala의 차이 본문
- 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에서는 함수를 함수의 인자로 넘길 수도 있고, 함수의 리턴 값으로 함수가 리턴될 수도 있습니다.
- 일급 객체란?
- 다른 요소들과 아무런 차별이 없는 객체를 뜻합니다.
- 즉, 함수의 인자로도 넘겨질 수 있고, 변수에 대입도 가능한 객체를 일급 객체라고 합니다.
- 일급 객체의 명확한 정의는 아래와 같습니다.
- 모든 일급 객체는 함수의 실질적인 매개변수가 될 수 있다.
- 모든 일급 객체는 함수의 반환값이 될 수 있다.
- 모든 일급 객체는 할당의 대상이 될 수 있다.
- 모든 일급 객체는 비교 연산(==, 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 |