2019-11-26 작성

[Book] 프로그래밍 언어도감(2) Java 언어

목차: Java 계열 언어

  • Java
  • Groovy
  • Scala
  • Kotlin

Java 🔥

  • 탄생 : 1995년
  • 주요 용도 : 업무 시스템, Android 앱, 웹앱
  • 분류 : 절차형 객체지향형/컴파일러

JVM에서 실행 : 컴파일을 하면 Bytecode가 생성되고, 이 Bytecode를 JVM이 실행하는 것으로 어떤 플랫폼이든 동작할 수 있다. "Write once, run anywhere", 한 번 코드를 쓰면, 어떤 환경에서든 동작한다.

이용자 수가 많다 : 라이브러리, 프레임워크, 서적 등 자료가 많고 항상 인기 순위권에 든다. 객체지향형이라 대규모 개발에도 적합하기 때문에 많은 시스템 개발 분야에서 사용되고 있다.

가비지 컬렉션 : 메모리 관리의 자동화로 인해 프로그래머가 생각해야 할 부분이 적다.

Applet : 애플릿은 웹 브라우저에서 실행되는 프로그램이다. 2000년대에 많이 사용되었지만, 동작이 시작하는데 시간이 걸리는 등의 문제로 점점 사용되지 않게 되었다. 

Servlet & JSP : 웹 서버에서 실행되는 Java 애플리케이션. 주로 데이터 처리를 실행하는 Servlet, 주로 표시를 실행하는 JSP를 분리하여 유지보수성을 높였다.

Groovy

  • 탄생 : 2003년
  • 주요 용도 : 데스크톱, 웹, Android 앱
  • 분류 : 객체지향형/인터프리터 컴파일러

Java와 비슷한 스크립트 언어 : 기본적인 사고방식이나 문법은 Java와 같다. Java처럼 정적 타이핑도 가능하지만, 변수의 자료형 선언을 하지 않는 동적 타이핑도 가능하다. 행 마지막의 세미콜론이 필요없는 등 스크립트 언어로서 쉽게 구현할 수 있도록 되어 있다. JVM 위에서 동작하기 때문에 Java의 API나 라이브러리를 호출할 수 있다. 성능, 안정성 등의 Java에 적합한 부분은 Java로 쓰고, 빠르게 쓰고 싶으면 Groovy를 사용해서 생산성을 높일 수 있다. 

 Grails 웹앱 개발 : Groovy를 사용한 웹 애플리케이션 프레임워크. Ruby on Rails와 비슷해서 생산성이 높다.

 JRuby와의 차이 : Ruby 인터프리터를 Java로 구현한 'JRuby'가 있다. Groovy와 비슷한 사용이 가능하지만 Groovy 쪽이 Java의 표기법에 더 가깝다고 할 수 있다.

GroovyMarkup : DOM 같은 트리형 데이터 구조를 언어 기능으로 가지고 있다. XML이나 HTML 등의 형식을 지정하고 출력할 수 있다.

 루즈 스테이트먼트 : 클래스와 연관되어 있지 않는 메서드로, 다른 언어에서는 '최상위'라고 불리는 경우도 많다. 루즈 스테이트먼트(loose statement)가 컴파일되면, 스크립트 자체가 클래스로 전개되어 함수 정의는 그 클래스의 메서드가 된다.

 Gradle & Gant : Gradle은 Android의 빌드 시스템으로 사용되고 있다. Gant는 Ant의 빌드를 Groovy로 기술할 수 있기 때문에 유연성이 높다.

Scala

  • 탄생 : 2003년
  • 주요 용도 : 기업 시스템
  • 분류 : 함수형 객체지향형/인터프리터 컴파일러

Java에서 업그레이드! 함수형과 객체지향형의 양날의 검. Java보다 간결한 소스코드로 실행할 수 있고 컴파일 후에는 Java의 바이트코드를 출력할 수 있다. 이 때문에 Java의 자산을 활용하면서 자료형 검사도 엄격하게 할 수 있다.인터프리터도 표준으로 갖추고 있고, 커맨트라인에서 scala 커맨드를 실행하는 해서 대화형으로 실행할 수 있다. 변수가 아닌 자료형으로 프로그래밍을 하는 '타입 레벨 프로그래밍' 등 특징적인 기능도 갖추고 있다.

Java를 그대로 사용 가능 : Java를 그대로 사용하는 것도 가능하고, 함수형 기능을 사용하는 것도 가능하다. Scala에서 Java의 프로그램을 호출하거나, Java에서 Scala의 프로그램을 호출하는 것도 가능하다.

 생략 표기법 : Java와 똑같이 쓰는 것도 가능하지만, 문장 끝에 세미클론은 필요 없다. 또 매개변수를 갖지 않는 메서드를 호출할 때는 괄호를 생략할 수 있는 경우도 있다.

소규모에서 대규모까지 지원 : 스케일러블한 프로그래밍 언어를 지향하고 있다. 어떤 규모의 프로그램이든 1개의 언어로 작성할 수 있도록 하고 함수형과 객체지향형의 요소를 도입하고 있다.

컴파일에서 실행까지가 느리다 : 컴파일을 할 때 복잡한 처리를 실시하고 있고 JVM의 구동이 필요하다. 때문에 컴파일에서 실행까지 시간이 걸린다. 실행 개시 후에는 Java와 같은 속도로 처리할 수 있다.

 PartialFunction : 인수의 유효범위가 정해져 있고, 그 범위 내의 인수에 대해서만 기능하는 함수. ofElse라는 함수를 사용해서 복수의 particalFunction을 합성할 수 있다.

Play Framework : Scala와 Java로 웹 애플리케이션을 쉽게 작성하기 위해서 사용되는 오픈소스 프레임워크. 디폴트로 RESTful한 방식이 도입되어 있다. (공식 홈페이지: https://www.playframework.com/)

Implicit 수식자 : 자동 형변환, 암시적 매개변수 등을 개발자가 지정할 수 있는 기능이다. 컴파일러에 처리를 맡기는 것으로, 복잡한 합성이 필요한 경우에도 코드의 중요 부분에만 집중할 수 있다.

Kotlin 🔥

  • 탄생 : 2011년 (JetBrains)
  • 주요 용도 : Android 앱
  • 분류 : 객체지향형/컴파일러 트랜스파일러

 Android 공식 언어 : Google이 만반의 준비를 하고 채택하여, Android 앱의 개발 언어가 되었다.

Java와 상호운용 가능 : Java로 쓰여진 클래스를 상속하고 Kotlin에서 클래스를 쓰는 것도, 그 반대도 가능하다. Java의 프로젝트 안에서 일부만 Kotlin으로 개발하는 것도 가능하기 때문에 기존 프로젝트에도 채택 가능하다. JVM 위에서 동작하는 애플리케이션을 개발할 수 있지만, Java에서는 장황하게 표현되는 부분도 간결하게 기술할 수 있다. 또 NULL 값 사용가능(Nullable)이나 NULL 값 사용불가(NotNull)에 의해서 NULL 안전한 언어라는 특징이 있다. 

JavaScript로도 변형 가능 : JavaScript를 Kotlin에서 생성할 수 있기 때문에 브라우저 안에서 실행하는 처리도 Kotlin으로 기술할 수 있다.

기존 클래스의 확장 가능 : Java 등의 언어에서는 기존 클래스는 확장하지 않고 상속에 의해서 기능을 추가한다. Kotlin에서는 확장 함수나 확장 프로퍼티를 사용해서 상속할 수 없는 클래스여도 기능 확장이 가능하다.

 Try Kotlin : 온라인 상에서 Kotlin을 체험할 수 있는 실행 환경. 샘플도 있고 Kotlin Konas라는 문제도 준비되어있어 그문제를 구현하는 것으로 학습이 진행된다.

스마트 캐스트 : 사전에 is 연산자로 자료형을 체크해두면, 이어지는 처리에서 명시적으로 캐스트 연산자를 사용할 필요가 없다.

IntelliJ IDEA : Kotlin을 개발한 JetBrains가 제공하고 있는 통합 개발 환경이다. 많은 프로그래밍 언어를 지원하고 있고 플러그인으로 지원되고 있는 언어도 있다.