소개
안녕하세요 여러분. 다들 잘 지내고 계시죠? 9월은 정말 바빴어요. 사이트에 많은 새로운 개선 사항과 기능을 출시했는데, 주로 멘토링과 그 주변 흐름을 개선하는 데 집중했어요. 그 결과, 4주 전 같은 시기보다 멘토 요청이 두 배로 들어오고 있어요. 정말 좋은 일이죠. 멘토에게 코드 리뷰를 받아 본 적이 없다면 꼭 한번 해보세요. 정말 훌륭한 학습 방법이에요. 다른 사람을 돕고 싶다면, 대기열에는 도움을 기다리는 요청이 많이 있어요. 기여 메뉴에 있는 멘토링 링크에서 멘토로 등록할 수 있어요! 또 MySQL 5.6에서 MySQL 8로 큰 데이터베이스 업데이트를 했는데, 이 과정을 녹화해서 Insiders 섹션에서 볼 수 있어요. Insiders 회원이고 아직 보지 않았다면 꼭 확인해 보세요!
자, 이제 #12in23으로 넘어가 볼까요. 9월은 간결하고 함축적인 언어를 탐구한 흥미로운 달이었어요. 이번 달은 반대로, 훨씬 더 거대한 녀석들을 살펴볼 거예요. 객체 지향 언어, 그중에서도 C#, Crystal, Java, Pharo, Ruby, PowerShell에 집중해요. Pharo와 Java는 이미 각각 5월과 8월에 다뤘기 때문에 이 영상에서는 다시 다루지 않아요. 하지만 그 언어들의 소개가 궁금하다면 지난 달 영상을 확인해 보세요. 이번 영상에서는 C#, Crystal, Ruby, PowerShell을 살펴보고, 늘 그렇듯 Erik이 이 언어들이 왜 흥미롭고 독특한지 설명해 줄 거예요.
배지
늘 그렇듯, 이 언어들로 연습 문제 5개를 완료하면 객체 지향 10월 배지를 받을 수 있어요. 1년 배지도 있는데, 많은 분이 이를 위해 달리고 계신 걸로 알아요. 이를 위해 완료해야 할 5개의 추천 연습 문제가 있는데, 모두 OOP 방식으로 풀기 좋은 문제들이에요. 다음과 같아요.
- 이진 탐색 트리: 이진 트리에 숫자를 삽입하고 검색하기
- 원형 버퍼: 끝과 끝이 연결된 데이터 구조 구현하기
- 시계: 날짜 없이 시간을 다루는 시계 구현하기
- 행렬: 문자열로 표현된 행렬의 행과 열 반환하기
- 단순 암호: 치환 암호 구현하기
개요
C#
- 2000년에 Microsoft의 Anders Hejlsberg가 개발했어요
- 언어와 가상 머신에 공식 명세가 있어요. 2002년에 ECMA 공식 표준이 되고 2003년에 ISO 표준이 되었어요
- 컴파일러, .NET Framework(표준 라이브러리), Visual Studio(편집기)는 모두 처음에는 클로즈드 소스였지만, 2014년에 컴파일러와 .NET Framework가 오픈 소스로 전환되었어요
- Java(몇 년 먼저 출시됨)와 구문을 많이 공유하지만, C#은 Java를 그대로 베낀 것은 아니에요(예: 프로퍼티, 값 타입 지원, 검사 예외 없음)
- 바이트코드로 컴파일되며, .NET 7부터 기계어 컴파일도 지원해요(아직 개선 중이에요)
- 웹사이트부터 임베디드 시스템까지, 앱(Xamarin)부터 게임(Unity)까지 수많은 소프트웨어에서 사용돼요
Crystal
- Crystal은 Ary Borenszweig(Exercism 계정이 있어요), Juan Wajnerman, Brian Cardiff가 개발했어요(원래 이름은 Joy였는데 3일 후 Crystal로 바뀌었어요 :))
- Ruby의 우아함과 생산성을 갖추면서도 현대 컴파일 언어의 속도, 효율성, 타입 안전성을 목표로 설계되었어요.
- Manas 조직이 개발한 오픈 소스 언어예요.
- 2021년에 버전 1.0이 출시되었어요.
- LLVM을 사용해 기계어로 컴파일해요(Rust처럼요)
- 컴파일러는 처음에 Ruby로 작성되었지만 나중에 자체 호스팅 버전으로 전환되었어요
- 트럭 회사 Nikola, Manas 등에서 사용하며, 주로 웹사이트에 쓰이지만 클라우드 서비스, 명령줄 애플리케이션, 스크립트에도 사용돼요
PowerShell
- Microsoft의 Jeffrey Snover가 이끄는 팀이 만들었고 2006년에 처음 출시되었어요.
- 개발은 Intel이 계기가 되었어요. Intel은 CPU 개발을 돕기 위해 KornShell 스크립트를 Sun RISC에서 다른 플랫폼으로 옮기고 싶어 했어요. 결국 Intel은 다른 플랫폼을 선택했지만, Microsoft는 새 셸인 PowerShell 개발을 계속했어요. PowerShell은 Windows 시스템 관리를 개선할 가능성을 제시했거든요(당시에는 그다지 좋지 않아서 GUI가 자주 필요했어요)
- 구문은 KornShell에서 영감을 받았고, PHP, Perl 등에서도 영향을 받았어요
- 첫 버전은 .NET Framework에서만 실행되어 Windows에서만 돌아갔어요. 하지만 PowerShell 6.0(2018년 출시)은 크로스 플랫폼 오픈 소스인 .NET Core에서 실행되었어요.
- 주로 시스템 관리에 사용되지만, CLI 유틸리티나 다른 도구의 래퍼를 제공하는 데도 쓰여요. 우리는 Exercism 저장소를 대량으로 다룰 때 정말 많이 사용했어요
Ruby
- Yukihiro Matsumoto(일명 Matz)가 개발했고 1995년에 처음 출시되었어요
- Matz는 제대로 된 객체 지향 스크립팅 언어를 쓰고 싶었지만 기존 선택지(Perl, Python 등)가 마음에 들지 않아 새로운 언어 Ruby를 만들었어요
- Matz는 Ruby를 핵심은 단순한 Lisp 언어이고, 객체 시스템은 Smalltalk과 같으며, 블록은 고차 함수에서 영감을 받았고, 실용성은 Perl과 같다고 설명해요.
- 보통 인터프리터 방식이지만, 기계어로 JIT 컴파일할 수도 있어요
- 공식 인터프리터 외에도 JRuby(JVM에서 실행), Rubinius(LLVM 사용), 그리고 공식 설치 패키지에 포함된 JIT 컴파일러 YJIT 같은 대안 구현이 있어요
- 주로 웹사이트(Ruby on Rails 사용)에 쓰여요. 예: GitHub, Stripe, Shopify 등 많아요(Exercism과 Exercism 포럼도 포함!). Ruby는 자동화 목적으로도 사용돼요
프로그래밍 관점에서 이들은 어떻게 다른가요?
모두 객체 지향 언어지만, 같은 방식으로 구현하지는 않아요(예: Crystal과 Ruby는 메서드를 호출할 때 Smalltalk의 메시지 전달 모델을 사용해요).
C#
- 강타입이며 정적 타입이에요
- 명령형과 선언형 패러다임도 지원하며 점점 더 함수형에 가까워지고 있어요
Crystal
- 강타입이며 정적 타입이에요(Ruby와 달리)
- 함수형과 명령형 프로그래밍도 지원해요
PowerShell
- 강타입이에요
- 명령형, 함수형 프로그래밍과 파이프라인 기반 프로그래밍도 지원해요.
Ruby
- 동적 타입 언어예요
- 함수형과 명령형 프로그래밍도 지원해요
그렇긴 해도, 이 언어들은 모두 무엇보다 객체 지향 언어예요.
이 언어들을 멋지게 만드는 것은 무엇일까요?
C#
- Xamarin을 통한 앱을 포함해 (거의) 어디서나 실행돼요. 원래는 Windows에서만 실행되어 Mono가 등장했어요. Mono는 크로스 플랫폼을 지원하는 C# 컴파일러와 런타임의 무료 오픈 소스 구현이에요. 2015년에는 완전히 크로스 플랫폼이고 오픈 소스인 .NET Core가 도입되었어요.
- 범용: 앱, 웹사이트, 게임을 포함해 거의 모든 작업에 사용할 수 있어요
- 표현력: 비교적 적은 C# 코드로 많은 것을 할 수 있어요. 특히 LINQ는 생산성을 크게 높여 주고 다루는 재미도 있어요
- IDE는 물론 빌드 시스템 같은 다른 도구까지 훌륭한 도구를 갖추고 있어요. Visual Studio는 Windows 전용이지만, JetBrains Rider와 VS Code는 크로스 플랫폼이에요
- .NET Compiler Platform(흔히 Roslyn이라고 불러요)은 C# 코드를 파싱/변환/생성하는 훌륭한 방법이에요(우리는 C# 테스트 러너/분석기/리프리젠터에서 이를 폭넓게 사용해요)
- 문서가 방대하고 상세하며 잘 작성되어 있어요
- 큰 커뮤니티: 블로그, 포럼 등 많은 자료를 이용할 수 있어요
Crystal
- 우아하고 읽기 쉬운 구문 덕분에 Crystal 코드는 읽고 쓰기 쉬워요
- 표현력: Ruby처럼 Crystal도 표현력이 뛰어나서 적은 코드로 많은 것을 할 수 있어요. 이는 훌륭하고 방대한 표준 라이브러리 덕분이기도 해요.
- 빠른 속도: 정적 타입 덕분에 LLVM을 사용해 효율적인 기계어로 컴파일할 수 있고, 가비지 컬렉터를 통한 간단한 메모리 관리도 가능해요.
- 멋진 객체 지향 구현: 클래스는 물론 숫자와 불리언 같은 기본 타입까지 모든 것이 객체예요
- 기본 포함: 방대한 표준 라이브러리, 내장 포매터, 템플릿 엔진, 테스트 프레임워크 등이 있어요
- 상호 운용성: C 라이브러리와 쉽게 상호 운용할 수 있어요
- 크로스 플랫폼: Linux, macOS, Windows에서 실행되지만 Windows는 아직 일급 시민이 아니에요
PowerShell
- 강력함: PowerShell은 관리자를 위한 강력한 도구예요. Windows OS(구성 요소, 서비스, 설정)나 Exchange, SharePoint, Azure 같은 다른 Microsoft 제품 등 여러 시스템과 잘 통합돼요. REST API, 데이터베이스, 웹 서비스 등 다양한 기술과도 상호 작용할 수 있어요.
- 가용성: PowerShell은 모든 최신 Windows OS에 사전 설치되어 있고, .NET이 실행되는 모든 시스템(macOS, Linux, 많은 Unix 시스템 포함)에 설치할 수 있어요
- 보안: PowerShell에는 서명된 스크립트와 실행 정책을 기반으로 스크립트를 보호하고 실행을 제한하는 기능이 있어요. 자동화 프로세스의 안전을 보장하는 데 매우 중요해요.
- GUI: Windows Forms나 Windows Presentation Foundation 같은 다른 프레임워크와 결합해 PowerShell 스크립트용 그래픽 인터페이스를 설계하고 만들어 사용자 친화적으로 만들 수 있어요.
- 파이프라인: Unix 시스템의 Bash와 비슷하게, PowerShell에서는 한 cmdlet의 출력을 다른 cmdlet의 입력으로 전달해 cmdlet을 연결하여 복잡한 작업을 수행할 수 있어요
Ruby
- 우아하고 읽기 쉬운 구문 덕분에 Ruby 코드는 읽고 쓰기 쉬워요
- 표현력: Ruby는 표현력이 매우 뛰어나 적은 코드로 많은 것을 할 수 있어요. 이는 훌륭하고 방대한 표준 라이브러리 덕분이기도 해요
- 거대한 생태계: 사용할 수 있는 라이브러리(gem)가 엄청나게 많아요
- 멋진 객체 지향 구현: 클래스는 물론 숫자와 불리언 같은 기본 타입까지 모든 것이 객체예요.
- 실용적: Ruby와 대부분의 라이브러리는 매우 실용적이며 실제 문제 해결에 집중해요.
- 상호 운용성: C 라이브러리와 쉽게 상호 운용할 수 있어 성능이 특히 중요할 때 자주 사용돼요. 예를 들어 Nokogiri gem은 C 라이브러리를 감싸 무거운 작업을 처리함으로써 XML을 매우 빠르게 다룰 수 있게 해줘요
- 많은 혁신이 일어나고 있어요. 예를 들어 Stripe는 Ruby용 타입 검사기 Sorbet을 만들었고, Shopify는 Ruby용 JIT 컴파일러 YJIT을 개발했어요(Ruby 3.1+에 포함). WASM 지원도 작업 중이에요
돋보이는 기능
C#
- 뛰어난 성능, 특히 관리형 언어치고는요. 언어와 런타임 모두 성능을 높이는 기능이 많아요. 예: Span<t> 타입, CPU 내장 명령 접근(AVX 명령어 등). CLR은 성숙하고 안정적이며 성능이 뛰어난 가상 머신으로 계속 개선되고 있어요</t>
- 거대한 생태계: 사용할 수 있는 라이브러리가 엄청나게 많아요. 그 라이브러리들은 C#처럼 성숙하고 안정적이며 기능이 풍부해요
- 현대적이고 진화하는 언어: 언어와 런타임은 계속 진화하고 있으며 더 현대적으로 만들기 위한 정기적인 업데이트가 있어요. 예를 들면:
- 쉬운 동시성을 위한 async/await
- 효율적인 메모리 사용을 위한 span<t></t>
- 널 허용 참조 형식(10억 달러짜리 실수 해결)
- 런타임도 정기적으로 업데이트되어요. 예: 기계어로 직접 컴파일하는 .NET AOT
- 다른 많은 언어/생태계보다 대안이 적어요. 대부분의 경우 Microsoft가 제공하는 기본 솔루션을 사용하면 되는데, 여기에는 IDE도 포함되는 경우가 많아요. 이것을 단점이라고 볼 수도 있지만, 특히 언어를 처음 시작할 때는 큰 장점이 될 수 있어요
Crystal
- 두 세계의 장점: 전역 타입 추론과 유니온 타입의 조합 덕분에 Crystal은 타입을 거의 명시하지 않아도 되는 동적 타입 언어처럼 느껴지면서도, 정적 타입 언어의 성능과 추가 안전 보장(컴파일 시점의 nil 검사 포함)을 갖춰요
- 메타프로그래밍: Ruby의 동적 런타임 메타프로그래밍 대신, Crystal에는 컴파일 시점에 실행되는 매크로가 있어요. 매크로는 AST 노드에서 작동해 코드를 생성해요. 정의하고 사용하기 꽤 쉬워요. Embedded Crystal(ECR)은 매크로를 사용해 Crystal 코드를 다른 텍스트에 삽입하는 내장 템플릿 엔진이에요
- 뛰어난 동시성: 채널을 통해 통신하는 파이버(가벼운 실행 단위)를 사용하는 Go와 유사한 동시성 모델 덕분에 동시성을 쉽게 사용할 수 있어요
- 생산적이고 재미있어요. Ruby는 생산성과 개발자의 행복을 위해 설계된 것으로 유명하며, 우아하고 읽기 쉬운 구문과 뛰어난 사용성을 갖췄어요. Crystal의 구문과 설계가 Ruby와 매우 비슷하기 때문에 이는 Crystal에도 해당해요(재미있는 사실: 상당량의 Ruby 코드가 유효한 Crystal 코드예요).
PowerShell
- Cmdlet: PowerShell은 cmdlet("커맨들렛"이라고 발음해요)을 구성 요소로 사용해요. cmdlet은 기존 기능을 감싸는 작고 작업 지향적인 명령으로, 시스템 관리자에게 일관되고 관리자 친화적인 인터페이스(예: 모든 cmdlet의 도움말을 보여주는 Get-Help)를 제공해요. 모든 .NET 클래스, Windows Management Instrumentation, Azure 등 다양한 "백엔드"를 위한 cmdlet이 있어요. cmdlet은 어떤 .NET 언어로든 정의할 수 있으며, 매개변수, 매개변수 유효성 검사, 요구 사항(required true/false), 대체(스위치) 이름 등을 쉽게 정의할 수 있는 매우 선언적인 방식으로 정의돼요.
- 객체 지향: PowerShell의 거의 모든 것이 다양한 속성을 가진 객체예요. 파일, 프로세스, 레지스트리 키, 심지어 문자열과 숫자 같은 단순 데이터 타입까지 모두 객체로 취급되어요. 이 방식은 다양한 유형의 데이터와 서비스로 작업하고 상호 작용하는 방법을 단순화해요. .NET을 다뤄 본 사람이라면 매우 익숙할 거예요
- 원격 관리: Windows 서버와 시스템, 심지어 Azure, AWS, GCP 전반의 클라우드 리소스까지 원격으로 관리할 수 있어요. 이는 대규모 자동화와 배포를 관리하는 데 필수적이에요.
- 확장성: 훌륭한 내장 모듈 시스템이 있고, 사용자 정의 cmdlet, 함수, 모듈을 만들 수 있으며, 다른 프로그래밍 언어와 라이브러리와 함께 작업해 필요에 따라 기능을 더 확장할 수 있어요.
Ruby
- 생산적이고 재미있어요. Ruby는 생산성과 개발자의 행복을 위해 설계된 것으로 유명해요. 수치로 나타내기는 어렵지만, Ruby를 사용해 본 사람들의 열정이 모든 것을 말해줘요
- 메타프로그래밍: Ruby는 매우 동적이며 런타임 메타프로그래밍을 허용해요. 기존 클래스를 몽키 패치하든, 메서드를 동적으로 추가하거나 호출하든, Ruby가 다 해줘요
- Ruby on Rails는 웹사이트를 만들기 위한 훌륭하고 기능이 풍부한 프레임워크예요. 기본으로 템플릿, 캐싱, ActiveRecord(객체를 통해 데이터베이스와 상호 작용하는 방법), 마이그레이션, 스캐폴딩, WebSocket 등 많은 것을 갖추고 있어요.
무엇을 선택할까요
- 객체 지향 프로그래밍에 익숙하지만 다른 관점을 보고 싶다면 Pharo를 시도해 보세요
- Java나 C#을 알지만 한동안 손대지 않았다면 다시 한번 해보세요. 두 언어 모두 많이 발전했으니 반짝이는 새 기능들을 확인해 보세요!
- C#과 Java(그리고 조금 덜하지만 Ruby)는 구직 중이라면 좋은 선택이에요. 고용주가 가장 많이 요구하는 언어 중 일부거든요
- Ruby를 안다면, 정적 타입 Ruby가 어떤 모습이고 어떤 느낌일지 Crystal을 시도해 보세요
- 동적 언어를 좋아하지만 뛰어난 성능도 원한다면 Crystal을 확인해 보세요
- Bash나 Windows 배치 파일을 안다면, 셸 스크립팅에 대한 색다른 객체 지향적 접근인 PowerShell을 시도해 보세요
- 스크립팅 언어를 전반적으로 좋아한다면 Ruby, Crystal, PowerShell 모두 좋은 선택이에요
- 메타프로그래밍을 하고 싶다면 Pharo, Crystal, Ruby가 좋아요(C#도 메타프로그래밍 기능을 갖춰 가고 있어요)
- 텍스트 파일로 뒷받침되지 않는 언어로 프로그래밍하는 것이 어떤 느낌인지 경험하고 싶다면 Pharo와 독특하고 강력한 IDE를 시도해 보세요
- 웹사이트 만들기를 좋아한다면 Ruby on Rails 프레임워크가 있는 Ruby를 시도해 볼 만해요