그냥 자바를 쓰세요
(teamten.com)- 내가 가장 좋아하는 언어는 파이썬. 그럼에도 불구하고 나는 모든 곳에 - 간단한 스크립트까지 - 자바를 사용한다.
- 몇 가지 경험들:
- 자바 베이스인 회사에서 테스트 시나리오를 자바스크립트로 작성하였음. 하지만 스택 트레이스 추적이 어렵고, 자바랑 자바스크립트 사이 브릿지 코드를 작성하느라 괜한 수고를 했음.
- 로그를 json 포맷으로 저장하고 있었는데, 동료 개발자가 이 로그를 다루는
logcat
이라는 프로그램을 만듦. 그 프로그램에 만족했지만, 이후 비슷한 프로그램을 자바로 만들자 10배 이상의 성능 향상을 보였음. - 자바에 대한 풍부한 경험과 자료 덕분에, 웹 서비스를 만드는 점에서 파이썬보다 자바가 빨랐음. 엄밀히 말하면 이건 한 언어를 사용함에 따른 이점임.
- 자바에 대한 가장 뜨거운 논쟁은 verbose(장황함). 하지만 이건 전혀 단점이 아님. 아래의 두 코드를 보라.
// java
Map<String,User> userIdMap = new HashMap<String,User>();
// python
userIdMap = {}
- 하지만 실제로 파이썬 코드는 아래처럼 작성되어 있을 가능성이 더 많다. (그렇지 않다면, 정말 유지보수하기 힘들 것이다)
# Map from user ID to User object.
userIdMap = {}
- 즉, 동적 타입 언어를 쓰는 것은 30분만에 멋진걸 만들기 위해 14일 이후의 생산성을 희생하는 것과 같다.
- 스택오버플로우는 ASP.NET 을 써서 (2010년에) 5대의 서버로 60,000,000 페이지뷰를 버텼다.
- 단위 테스트의 예시를 보자. 단위 테스트를 작성하고 유지보수하는 것은 시간을 소모한다. 특히, 타입으로 간단히 확인할 수 있는 예외사항들은 동적 타입 언어의 유닛 테스트로 잘 잡히지도 않는다 (예: 파서)
- (파이썬을 쓰지 않는 이유 중 하나를 추가하자면) 즉석 해결책(quick hack)은 점점 커져서 매우 중요한 툴이 되는데, 그걸 재작성할 여유는 없어서 결국 쓸 때마다 퍼포먼스와 유지보수에 허덕이게 된다.
- 마지막으로, 다른 정적 타입 언어들 대신 자바를 선호하는 이유들
- C/C++는 내 업무에 적용하기 어려움
- C#은 크로스 플랫폼 지원이 부족함
- Scala는 너무 복잡함
- D, Go 같은 다른 언어는 내 업무에 투입하기엔 너무 새 것임
- 제가 이 글을 긱뉴스에 가져온 몇 가지 이유가 있습니다:
- "난 자바가 진짜 좋아!"라는 글을 처음 봐서 신기했습니다 (제목만 보고 반전이 있을 줄 알았는데...)
- 본인만의 (자바로 만든) 공구상자를 가지고 있다는 점이 재밌었습니다. 뭔가 주머니에서 주섬주섬 고대무기를 꺼내는 노인의 이미지가 생각났어요.
- 저는 개인적으로 자바스크립트와 파이썬을 많이 좋아합니다. 그러나 얼핏 보면 이 언어들도 '타입을 어떤식으로든 도입' 쪽이 대세로 느껴집니다 (typescript for javascript, typing/mypy for python). 이런 상황에서, 이 글을 보니 제가 (타입을 전혀 강제하지 않는 방식으로) 정적 타입 언어를 쓰는게 약간은 자기만족에 가깝지 않나 하는 생각이 들었습니다.
- 저자는 자바와 파이썬에 대한 경험을 갖고 있어서 그 두 언어를 직접적으로 비교했지만, 굳이 그렇게 한정지어 생각할 필요는 없는 것 같습니다. 보다 넓은 관점에서 정적 타입과 동적 타입 언어에 대해 여러분은 어떤 생각을 가지고 계신가요?
PS. 특정 언어를 무의미하게 비하하지는 맙시다 :D
토론이 과열되고 있습니다.
반론이 있다면 그 내용만을 적어주세요.
사이트 이용법에 어긋나는 댓글은 삭제 처리하였습니다.
또한 이용법에 맞지않는 활동이 반복적인 아이디를 차단하였으니 참고하시기 바랍니다.
건전한 토론을 부탁드립니다.
파이썬을 하다가 자바를 처음 봤을 때는 정말 장황하다고 느껴졌는데 요즘 파이썬에 완전한 타입 힌트를 추가하기 위해 필요한 코드들을 보면 딱히 그렇지도 않은 것 같습니다 ㅋㅋ 자바의 아쉬운 점은 오히려 메서드명을 엄청나게 길게 지으려고 하는 네이밍 컨벤션인 것 같아요.
업무 내용이나 배정이 분리되는 여러 가지 이유 중에 언어가 추가돼서 특정 인원에 대해 업무 과중이 발생하고 인원 변동시 업무 진행이 안됩니다. 채용에도 영향을 미치는 요소라서 기술 스택 선정은 신중을 기해야 한다고 생각합니다
다만 반대로 익숙하다는 이유로 채용 풀이 적거나 채용 후 별도 학습이 필요한 언어를 고수한다면 그것도 문제긴 하겠죠
저도 정적 타입 언어를 선호합니다.
동적타입언어가 편한 부분은 있지만, 프로덕션 환경에서 유지보수가 힘들어지는 경우가 종종 있네요.
그리고 동적타입언어들은 보통 설계철학이 "간단한 코드 작성"을 목표로 하는 경우가 많아 언어 차원에서 암시적으로 관리해주는 것들이 많은데, 이 때문에 최적화할 여지가 적을때도 많습니다.
결국 구현 편의성 vs 최적화 여지가 많음 이 둘 사이에서 개발환경에 맞게 고민하고 선택하는게 좋을 것 같네요.
스택오버플로우 서베이에서 자바의 인기 순위가 계속 떨어지고 있는건 다 그만한 이유가 있죠.
유독 한국에서는 그놈의 정부프레임워크를 스프링으로 못박어 버리는 바람에 취업할때 쓸만하지만,
서구권에서 레거시 말고, 새로운 프로젝트를 시작할때 자바를 선택하는건 거의 사라지고 있는 듯
그만한 이유가 있는건 맞는데 그 이유를 다르게 생각하시는것 같네요.
TIOBE 사이트에서도 개발언어 순위를 참고용으로만 봐야하고 시장 점유율 또는 인기랑 직접적인 관련은 없다고 언급돼있습니다.
결론은. 파이썬이 압도적 점유율로 1위인데 시장에 나온 툴이 있나요?
가장 흔히 접하는건 C/C++과 닷넷, 그리고 자바(코틀린) 및 swift 입니다.
질문과 검색이 많다고 많이 쓰는 언어는 아닌거죠.
파이썬은 전공을 하지않아도 누구나 쓸수있는 언어입니다.
인기가 많은걸 부정할순 없지만 개발 시장에선 얘기가 다르죠.
'시장에 나온 툴'이라는 게 어떤 의미인지 조금 불명확하지만... 장고, FastAPI, PyTorch, NumPy, Pandas 등등 툴은 충분하지 않나요...?
비용문제만 한정하면 자바는 메모리 사용때문에 클라우드에서 비용이 많이 나가더라구요. 정적언어로 100MB,200MB 메모리 필요한 프로그램이 자바로 작성하면 1G,2G 필요한 경우가 허다하구 경량쓰레드는 라이브러리 호환성때문에 안되는 경우가 많더라구요.
자바도 정적언어입니다만... 메모리 문제는 가비지 콜렉터나 JVM에 해당하는거고 말씀하신 "정적언어로 100MB,200MB 메모리 필요한 프로그램"은 C, C++ 같은 네이티브 언어에 해당하는 얘기일 듯 합니다.
환각 죄송합니다. ㅠㅠ java도 정적 언어 맞습니다. 클라우드에서 이런저런 비용 합치면 메모리 1G당 3만원 정도 생각해야 되서 자바로 개발하는 서비스는 매우 비싼 비용이 지출되더라구요.
말씀하신 예외의 의미가 너무 넓게 와닿는데 조금만 자세히 설명해주실 수 있을까요?
제가 아는 정적/동적 타입 언어의 정의는 변수의 타입이 컴파일 타임에 정해져있고 그걸 바꿀때 명시적으로 해야하면 정적 타입 언어이고, 동적 타입 언어는 런타임 시점에 얼마든지 변수의 타입을 정할 수도 있고 암시적으로 바꿀 수도 있는 언어였습니다.
런타임에 다운캐스팅을 수행한다거나 하는 상황을 마주하면 자바는 런타임에 타입 체크를 해야합니다. 이런 이유로 자바가 동적타입이고, 이때 발생하는게 예외죠
근본적으로 이 간극이 없다면 예외를 예외라고 부를 필요가 없습니다. throw는 throw하는 객체를 전역변수에 담아두고 goto하는 패턴의 문법설탕이 되겠죠
말씀하신것과 유사하게 타입체크를 런타임에 수행하는 언어를 동적타입이라 부릅니다. 하지만 이건 프로그램에서 다뤄지는 모든 값에 대한 얘기입니다. 자바 글이니 자바를 예로 들면, 자바 코드는 컴파일타임에 타입체크 되지만 이건 그 변수에 대응될 값이 변수의 타입과 일치해야한다는 중요한 암시를 내포하고 있습니다.
타입체크를 런타임에 한다고 동적타입이면 C도 동적타입 언어 인가요? void포인터라는 개념이 있는걸로 아는데 둘간의 어떤 차이가 있는지요
어떤 C컴파일러가 자료형 검사를 코드에 끼워넣고 자료형이 틀렸을때 명시적인 오류를 발생시키나요? 그런 구현체가 있으면 예를 하나만 들어 주십시오
타입체크를 런타임에 한다고 동적타입이면 C도 동적타입 언어 인가요?
네 C가 타입체크를 런타임에 하면 동적타입 언어입니다.
그렇지 않기 때문에 정적 타입입니다.
void 포인터는 그냥 원래 자료형을 알 수 없는 raw 포인터입니다. 해당 포인터가 가르키는 주소에 어떤 타입이 있는지는 알 수 없습니다.
저는 정적타입 언어를 좋아합니다. 생각을 해야 할 필요성을 줄여줘서 그 시간에 다른걸 생각할 수 있거든요.
자바는 정말 독특한 지위에 있는 언어죠. 자바를 마지막으로 업무에 사용했던게 대략 10여년 전이지만 지금도 어떤 프로그램을 취미가 아닌 업무로 개발해야 한다면 1순위로 고려할 언어 목록에 들어가 있습니다.
지금 업무에 쓰는 주 언어는 Ada와 C언어지만 개인적으로 또는 팀 내에서 사용할 도구들은 주로 PowerShell로 짭니다. 그런데 작성하다가 시간이 조금만(5분만...) 지나면 "이 변수가 무슨 타입이었더라?"를 생각하고 있더라구요. 그래서 요즘엔 타입을 꼭 명기하고 있습니다. (PowerShell은 변수 정의에 타입을 지정할 수도 있고, 생략하고 동적으로 사용할 수도 있습니다)
저는 C도 별로 좋아하지 않아요. Ada였다면 컴파일러가 걸러줬을 타입 관련 오류를 C는 전혀 잡아주지 못하거든요. C 같은 문법에 Ada의 타입 시스템을 지원하는 언어가 있으면 좋겠다는 생각을 종종 합니다.
Javascript와 Python은 정이 안 가네요. Perl이나 Shell Script는... 생각하고 싶지도 않네요.
C#이 크로스플랫폼이 왜 부족한가요. 요즘 대부분의 닷넷서버앱을 리눅스서버에 배포해요.
파이썬은 애초에 비교대상이 아니고, 코틀린, C#에 비해서 장황하고 필요한 기능들이 많이 없는건 맞는것같아요.
C#도 가상머신을 쓰는 언어라 크로스 플랫폼 지원이 진작에 나왔어야 됐지만 제가 알기로는 극 최근에 나온걸로 알고있고 그렇기 때문에 윈도우가 아닌 타 OS에 돌릴수는 있다 정도의 인식이 당분간 지속될거 같네요.
게다가 365일 수행되는 서버위주의 리눅스 환경이면 해당 시스템에 10년 이상 안정성이 검증된 타 언어보다 충분히 검증되지 않은 닷넷을 꺼려하는것도 사실입니다.
그런의미에서 크로스플랫폼이 부족하다고 말하는게 아닐까요
10년전 글이니 .net core가 태동한지 얼마지나지 않아 글이 저렇게 쓰인겁니다.
이미 닷넷 어플리케이션들은 리눅스, 맥에서 안정적으로 잘 동작합니다.
python식 간결한 문법에 정적 타입 붙은 언어같은거 없나 찾아보다가 우연히 GDScript를 발견했는데, 이건 보편적으로 사용하긴 힘들다는점이 너무 큰 단점이에요.
기회가 되신다면, godot을 통해서 작은 프로젝트를 진행해보시고, GDScript를 맛봐보시는걸 추천드려요.
제가 주로 c++을 사용하는 지라 c++을 예로 들었을 뿐입니다. 저도 java는 좋은 언어라고 생각하는데, 제가 지적하고 싶었던 건, 저 원 포스팅에 java의 장점에 대한 이야기가 부족하다는 것이었어요.
java 너무 좋아, 라고 적었으면 java의 장점 이야기가 메인이 되어야 하는데, 타 언어에 대한 비판이 메인인 것 같아서요.
의견 주신대로 java의 jvm은 굉장히 좋다고 생각합니다.
원 저자는 단지 C++을 적용하기 어려운 업무여서 자바를 쓰는것 같아요. 아마 파이썬과 C++중에 골라야 한다면 C++을 선택하지 않았을까요?
자바는 jvm상에서 돌아가니 로컬과 머신 환경을 동일하게 세팅이 가능하죠. C++로 모든 개발자와 머신 환경을 동일하게 만드려면 상당한 시간이 들겁니다. 유지도 어렵고...