연봉 높은 프로그래밍 언어 순위 2018

🗓 ⏱ 소요시간 12 분

이번 포스팅에서는 연봉 많이 받는 프로그래밍 언어 세계 순위를 알아보고 몇 가지 언어들에 대해서 살펴보겠습니다. 순위는 stackoverflow Developer Survey Results 2018 을 참고했습니다.

순위

언어가 많으므로 TOP 10 까지만 보겠습니다. 세계 순위와 미국 순위에 모두 올라가 있는 언어는 굵게 표시하였고, 환율은 KRW 1,122.50/1 USD 기준입니다.

세계 기준

순위 언어 연봉(USD) 연봉(KRW) 개발 연도
1 F# 74,000 83,065,000 2005
2 Ocaml 73,000 81,942,500 1996
3 Clojure 72,000 80,820,000 2007
3 Groovy 72,000 80,820,000 2003
5 Perl 69,000 77,452,500 1987
5 Rust 69,000 77,452,500 2010
7 Erlang 67,000 75,207,500 1986
7 Scala 67,000 75,207,500 2003
9 Go 66,000 74,085,000 2009
10 Ruby 64,000 71,840,000 1995

미국 기준

순위 언어 연봉(USD) 연봉(KRW) 개발 연도
1 Erlang 115,000 129,087,500 1986
1 Scala 115,000 129,087,500 2003
3 Ocaml 114,000 127,965,000 1996
4 Clojure 110,000 123,475,000 2007
4 Go 110,000 123,475,000 2009
4 Groovy 110,000 123,475,000 2003
4 Objective-C 110,000 123,475,000 1983
8 F# 108,000 121,230,000 2005
8 Hack 108,000 121,230,000 2014
10 Perl 106,000 121,230,000 1987

글로벌 순위와 미국 순위를 살펴봤는데 순위권에 든 언어들은 대부분 비슷하다는 걸 쉽게 알 수 있습니다. 물론 순위 자체는 조금씩 다르지만요. 그리고 함수형 언어 혹은 함수형 프로그래밍을 지원하는 멀티 패러다임 언어들이 상위권에 많이 있다는 것을 알 수 있습니다. 하지만 Erlang, Ocaml, F# 등 조금은 생소한 언어도 많은데요, 하나씩 살펴보겠습니다. 언어별 첫 번째 예제는 Hello world, 두 번째 예제는 ‘하노이의 탑’ 입니다.[1]

Erlang

Erlang(얼랭)은 1986년 스웨덴의 통신 장비 제조사인 에릭슨이 만든 함수형 언어입니다. 병행처리에 초점을 맞춘 언어로 ‘BEAM’(Erlang VM)이라는 가상 머신 위에서 실행됩니다. 서버를 만들 경우 많은 요청을 안정적으로 처리할 수 있습니다.

1
2
3
4
5
6
7
8
% This file is a "Hello, world!" in Erlang for wandbox.
-module(prog).

% Erlang for Wandbox must exports main/0
-export([main/0]).

main() ->
io:format("Hello, Erlang!~n").

특징

  • 초경량 프로세스로 많은 처리에 강합니다.
  • 비동기 메시지 기반으로 멀티 코어 환경에서 CPU 를 최대한 활용할 수 있습니다.
  • 가동 중인 시스템을 정지하지 않고 프로그램을 변경하는 핫 스와핑(Hot Swapping)이 가능합니다.
  • 장애가 발생하면 그냥 충돌(Crash) 시키고 재가동되어 복구시킵니다.

관련 키워드

  • Cowboy : Erlang용 소형, 고성능 웹 서버
  • ETS 와 Mnesia : 언어 처리계에 포함된 DBMS.
  • OTP : 표준 라이브러리. 개발을 전화 회사에서 시작했기 때문에 Open Telecom Platform 의 약자. 경량 프로세스로 병렬/분산 처리 가능.

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
-module(prog).
-export([main/0]).

main() ->
N = read_num(),
hanoi(N, "a", "b", "c").

read_num() ->
case io:fread("", "~d") of
eof -> 0;
{ok, X} ->
[Y] = X,
Y
end.

hanoi(1, From, To, _Via) -> io:format("~s -> ~s~n", [From, To]);
hanoi(N, From, To, Via) when N > 0 ->
hanoi(N - 1, From, Via, To),
io:format("~s -> ~s~n", [From, To]),
hanoi(N - 1, Via, To, From).

Scala

Scala(스칼라)는 2003년 Martin Odersky 가 만든 Java 를 업그레이드 한 함수형/객체지향형 언어입니다. Java 보다 간결한 소스코드로 실행할 수 있고 컴파일 후에는 Java 의 바이트코드를 출력합니다. 데이터 분석 (Apache Spark) 등에 많이 사용됩니다.

1
2
3
4
5
6
7
// This file is a "Hello, world!" in Scala language for wandbox.

object Wandbox {
def main(args: Array[String]): Unit = {
println("Hello, Scala!")
}
}

특징

  • Java 와 똑같이 쓸 수도 있지만, 훨씬 간략하게 표현이 가능합니다.
  • Java 와 호환 가능하고, 함수형 프로그래밍 언어를 지원합니다.
  • 컴파일을 할 때 복잡한 처리를 하기 때문에 컴파일에서 실행까지의 속도가 느립니다.

관련 키워드

  • PartialFunction : 인수의 유효 범위가 정해져 있고 그 범위 내에의 인수에 대해서만 기능하는 함수.
  • Play Framework : Scala 와 Java 로 작성하는 웹 애플리케이션 오픈소스 프레임워크.
  • Implicit 수식자 : 컴파일러가 암시적 변환을 통해 타입을 자동으로 변환.

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Hanoi {
def exec(n: Int, from: String, to: String, via: String) {
if (n > 1) {
exec(n-1, from, via, to)
println("%s -> %s".format(from, to))
exec(n-1, via, to, from)
} else {
println("%s -> %s".format(from, to))
}
}
}

object Main {
def main(args: Array[String]) {
// 표준 입력에서 받아옴
var n = io.StdIn.readLine.toInt
val h = new Hanoi
h.exec(n, "a", "b", "c")
}
}

OCaml

OCaml(오카멜) 은 1996년 INRIA(프랑스 국립정보학 자동제어 연구소)에서 만든 언어입니다. 객체지향형을 도입한 함수형 언어로, 인증 기술용 메타 언어에서 발전해 주로 금융계 등에서 많이 사용합니다. 자료형을 엄격하게 구분하고 있지만 자료형 추론 덕분에 프로그래머가 자료형을 지정할 필요는 거의 없습니다.

1
2
3
(* This file is a "Hello, world!" in OCaml language for wandbox. *)

print_endline "Hello, OCaml!"

특징

  • 정수의 곱셈과 소수의 곱셈은 연산자가 달라 자동 형변환이 되지 않습니다. 이에 따라 자료형을 잘 맞춰야 합니다.
  • 네이티브 코드를 생성하는 컴파일러와 바이트 코드를 생성하는 컴파일러가 존재합니다.
  • 32bit 환경에서는 int 형이 31bit, 64bit 환경에서는 63bit의 범위를 갖습니다. 1bit는 가비지 컬렉션이 사용합니다.

관련 키워드

  • functor : Ocaml 은 모듈 단위의 분할 컴파일이 가능하고, 인수로 모듈을 받아 새로운 모듈을 생성할 수 있다. 펑터는 다른 모듈에 의해 매개화되는 모듈.
  • ML : 튜링상을 수상한 로빈 밀너가 개발한 함수형 언어. OCaml 은 ML 기반으로 만들어짐.
  • 함수의 다형성 : 1개의 함수 정의로 다양한 자료형에 대응이 가능하다.

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
let rec hanoi n from to_ via =
if n = 1 then
print_endline(from ^ " -> " ^ to_)
else
begin
hanoi (n - 1) from via to_;
print_endline(from ^ " -> " ^ to_);
hanoi (n - 1) via to_ from;
end;;

(* 표준 입력에서 받아옴 *)
let n = read_int() in

hanoi n "a" "b" "c"

Clojure

Clojure(클로저)는 2007년 Rich Hickey 가 만든 함수형 언어입니다. 주로 JVM 상에서 동작하고 LISP와 비슷한 문법을 가진 LISP 계열 언어입니다. REPL 에 의한 인터팩티브한 개발이 가능하고 병렬 처리에 강합니다. Ring 이나 Compojure 같은 라이브러리로 웹 개발도 가능합니다. 주로 Web 시스템, 안드로이드 앱 개발에 사용합니다.

1
2
3
4
5
(ns clojure.examples.hello
(:gen-class))
(defn hello-world []
(println "Hello World"))
(hello-world)

특징

  • JVM, CLR(.NET VM), JavaScript 등 기존의 플랫폼 상에서 동작이 가능합니다.
  • 리스트, 벡터, 맵 등을 시퀀스로 추상화해서 다룰 수 있습니다.
  • 멀티 메소드(복수의 함수를 묶은 것 같은 특수한 함수)로 런타임 시 호출되는 메소드가 정해지는 것이 가능합니다.

관련 키워드

  • Leiningen : Clojure 용 빌드 툴이자 패키지 관리 툴.
  • Overtone : Clojure 로 만들어진 오픈소스 신시사이저.
  • STM(Software Transactional Memory) : DB 의 커밋/롤백같은 트랜잭션 개념을 프로그래밍에 도입한 것.
1
2
3
4
5
6
7
8
9
10
11
12
(use '[closure.java.io])

(defn hanoi [n from to via]
(if (> n 1)
(do
(hanoi (dec n) from via to)
(println (format "%s -> %s" from to))
(hanoi (dec n) via to from))
(println (format "%s -> %s" from to))))

(doseq [n (line-seq (reader *in*))]
(hanoi (read-string n) 'a 'b 'c))

Go

Go(고)는 2009년 구글이 만든 객체지향형 언어입니다. 언어 사양이 간단하고 쉬우며 고속으로 처리할 수 있어 인기가 많습니다. Linux, macOS, Windows, iOS, Android 등 다양한 플랫폼을 지원합니다. 구글에서 검색 시 Go 라는 단어로는 원하는 자료를 찾기 어려워 Golang 이라고 부릅니다. 주로 웹 앱 개발에 사용됩니다.

1
2
3
4
5
6
7
8
9
10
// This file is a "Hello, world!" in Go language for wandbox.
package main

import (
"fmt"
)

func main() {
fmt.Println("Hello, Go!")
}

특징

  • 코드 스타일이 통일되어 다르게 쓰는 경우 문법 오류로 취급합니다.
  • 유닛 테스트를 기본적으로 포함하고 있습니다.
  • 컴파일 시 실행 환경을 지정할 수 있어 여러 플랫폼에 프로그램 배포가 쉽습니다.
  • 클래스의 개념은 없고, 인터페이스를 사용합니다.

관련 키워드

  • Go 루틴 : 함수 호출 전에 go 를 붙이는 것만으로 해당 함수를 비동기로 실행할 수 있다. 쓰레드 처리.
  • Docker : 컨테이너형 가상화 소프트웨어. Docker 개발에도 Go 가 사용되고 있다.
  • Go 커맨드 : 패키지 다운로드, 인스톨, 빌드나 테스트 등을 실행할 수 있는 커맨드.

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package main
import "fmt"

func hanoi(n int, from, to, via string) {
if n > 1 {
hanoi(n - 1, from, via, to)
fmt.Println(from, " -> ", to)
hanoi(n - 1, via, to, from)
} else {
fmt.Println(from, " -> ", to)
}
}

func main() {
// 표준 입력에서 받아옴
var n int
fmt.Scan(&n)
hanoi(n, "a", "b", "c")
}

Groovy

Groovy(그루비)는 2003년 Guilaume Laforge 가 만든 객체지향형 언어입니다. JVM 상에서 동작하는 스크립트 언어로 Java 와 혼용해서 사용이 가능해 생산성을 높일 수 있습니다. 주로 데스크톱, 웹, 안드로이드 앱 개발에 사용됩니다.

1
2
3
// This file is a "Hello, world!" in Groovy language for wandbox.

println "Hello Groovy!"

특징

  • Java 와 매우 비슷합니다. 하지만 자료형 선언을 하지 않는 동적 타이핑이 가능하고 세미콜론이 필요없는 등 스크립트 언어의 특징도 가지고 있습니다.
  • Grails 를 이용해 웹 개발을 쉽게 할 수 있습니다.

관련 키워드

  • GroovyMarkup : DOM 과 같은 트리형 데이터 구조를 언어 기능으로 가지고 있음.
  • Loose Statement : 클래스와 연관되어 있지 않은 메소드로, 컴파일 시 스크립트 자체가 클래스로 다뤄진다.
  • Gradle 과 Gant : Groovy 로 기술할 수 있는 빌드 툴.

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Hanoi {
def exec(int n, String from, String to, String via) {
if (n > 1) {
exec(n - 1, from, via, to)
println(from + " -> " + to)
exec(n - 1, via, to, from)
} else {
println(from + " -> " + to)
}
}
}

// 표준 입력에서 받아옴
Scanner cin = new Scanner(System.in)
String n = cin.nextLine
Hanoi h = new Hanoi()
h.exec(Integer.decode(n), "a", "b", "c")

F#

F# 은 2005년 마이크로소프트에서 개발한 함수형/객체지향형 언어입니다. Visual Studio 에 기본적으로 탑재되어 있고, C# 이나 Visual Basic 같은 .NET Framework 의 언어와 상호 운용할 수 있는 멀티 패러다임 언어입니다. 함수형 언어 OCaml 의 영향을 받았습니다. 주로 Windows 앱, 웹 앱 개발에 사용됩니다.

1
2
3
4
5
6
// This file is a "Hello, world!" in F# language for Wandbox.

module Wandbox =
let main() = printfn "Hello, F#!"

Wandbox.main()

특징

  • Option 형을 이용해 NullReferenceException 예외를 방지합니다.
  • 자료형을 생략할 수 있습니다.
  • 2가지 종류의 Syntax 가 있습니다. (Lightweight syntax / Verbose syntax)

관련 키워드

  • FsCheck : 테스트 케이스를 무작위로 자동생성해주는 테스트 툴.
  • Type extension : 이미 정의된 객체 자료형에 새로운 함수를 추가할 수 있다.
  • 활성 패턴 : 입력된 데이터를 파티션으로 분할해서 이름을 붙이고, 패턴 매치를 통해 데이터를 정리할 수 있다.

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
USING: formatting kernel locals math io math.parser ;
IN: hanoi

: move ( from to -- )
"%s -> %s\n" printf ;

:: hanoi ( n from to via -- )
n 1 > [
n 1 - from via to hanoi
from to move
n 1 - via to from hanoi
]
[ from to move ]
if ;

readIn string>number "a" "b" "c" hanoi

Perl

Perl(펄)은 1987년 Larry Wall 이 만든 함수형/객체지향형 언어입니다. 문자열 처리에 장점이 있고, 웹 애플리케이션 개발에 많이 사용되는 언어입니다. 1990년대 CGI 에서 사용되는 언어로 압도적인 점유율을 가지고 있었습니다. Linux 환경 표준으로 설치되어 있는 경우가 많아 쉽게 시작할 수 있습니다. 빠른 스크립트 언어지만 소스코드 가독성 측면에서 Ruby 와 Python 에 뒤쳐져 점유율을 빼앗겼습니다.

1
2
3
# This file is a "Hello, world!" in Perl language for wandbox.

print "Hello, Perl!\n";

특징

  • 오래된 만큼 모듈이 많이 존재합니다.
  • 문자열 처리가 쉽고 정규 표현식이 폭넓게 사용되는 계기를 마련했습니다.
  • Perl 6 은 Perl 5까지와는 다른 언어라고 할 만큼 큰 변화가 있었습니다.
  • TMTOWTDI(There’s more than one way to do it) 같은 기능을 여러가지 방법으로 구현할 수 있다는 뜻으로 펄 프로그래밍의 모토입니다.

관련 키워드

  • 정규표현식 : 문자열의 패턴 매치를 할 수 있는 표현 방법
  • CPAN : Perl 모듈 관리 시스템
  • CGI (Common Gateway Interface) : 웹 사이트에서 동적인 페이지를 만드는 간단한 방법

예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl

sub hanoi{
my ($n, $from, $to, $via) = @_;

if ($n > 1){
$hanoi($n - 1, $from, $via, $to);
print $from . " -> " . $to . "\n";
&hanoi($n - 1, $via, $to, $from);
} else {
print $from . " -> " . $to . "\n";
}
}

# 표준 입력으로 받아옴
my $n = <STDIN>;
&hanoi($n, "a", "b", "c");

정리

이것으로 연봉을 많이 받는 프로그래밍 언어 순위를 살펴봤습니다. 물론 언어가 많고 광범위해서 자세한 내용을 살펴볼 순 없었지만, 소개 차원에서 대략적인 언어 특성을 살펴봤습니다.

저는 자바를 많이 사용하는데 자바 개발자는 너무 많아서 그런지 연봉 순위에 들지 못했네요. Scala 나 Groovy 는 JVM 상에서 동작하기 때문에 자바 개발자라면 비교적 쉽게 익힐 수 있을 것 같습니다. 저도 한 번 이쪽으로 공부를 해봐야겠습니다. 그리고 앞으로는 데이터 사이언스, 딥러닝 등이 더 중요해지면서 R, Python 등이 더 연봉이 올라가지 않을까 싶기도 합니다.

분야에 따라서, 플랫폼에 따라서, 풍부한 라이브러리에 따라서, 필수적으로 선택해야만 하는 언어가 있습니다. 기존 언어의 장점을 강화하고 단점을 극복한 언어들이 나오기도 합니다. 이식성이 개선되어 하나의 언어로 여러 플랫폼을 커버가 가능해지도 합니다. 분명한 것은 하나의 언어만으로는 자신의 범위가 매우 제한된다는 것입니다. 생산성을 높이고 새로운 분야에 도전하기 위해서 몇 가지 언어를 선택해서 익힐 필요가 있습니다.

참고