본문 바로가기
반응형

Rust14

Rust의 Generics 맛보기 제네릭(Generics)은 많은 언어에서 지원하는 다형 타입 지원 기능입니다. 동일한 기능을 여러 타입으로 사용하려는 경우 각 타입 별로 비슷한 코드를 중복해서 코딩해야 할 수도 있는데, 제네릭은 타입과 코드를 분리시켜서 하나의 코드로 다양한 타입을 사용해서 동작시킬 수 있게 만들어 주기 때문에 매우 효율적인 코딩이 가능합니다. 러스트(Rust)도 이런 제네릭을 지원합니다. 이 글에서는 러스트의 제네릭 기능을 살짝 살펴보며 깊게는 안 들어가고 간단히 맛만 보고자 합니다. 벡터 구경 제네릭은 여러 코드에 구현되어 있는데 그중 가장 가깝게(?) 찾아볼 수 있는 예제는 아마도 벡터(Vector) 일 것 같습니다. 다른 언어에는 리스트나 배열이라고 부를만한 그 자료구조지요. 벡터는 구조체로 구현된 자료구조이지만.. 2020. 11. 1.
Rust로 객체지향 프로그래밍 흉내내기 러스트(Rust)는 객체 지향 프로그래밍(OOP - Object Oriented Programming) 언어가 아닙니다. 애초에 클래스(class) 문법 조차 없고 따라서 상속(inheritance) 개념도 없습니다. 그저 구조체에 메서드를 구현할 수 있을 뿐입니다. OOP에서 정말 중요한 개념이 없는데 과연 러스트는 OOP 패러다임으로 코딩하는 것이 가능할지를 그냥 맛만 봅시다. 트레잇(trait) 러스트에는 트레잇(trait)이라는 개념이 있습니다. 이 기능은 인터페이스를 설계하는 기능입니다. 이를 이용해 특정 타입에 인터페이스에 맞는 메서드를 구현하도록 강제하기 위해서 사용할 수 있습니다. 이런 면에서 비교하자면 스위프트(Swift)의 프로토콜(Protocols)과 상당히 닮아 있습니다. 다짜고짜 .. 2020. 10. 26.
러스트의 열거형(Enums) 살펴보기 열거형은 일반적으로 상태(state)를 정의하기 위한 타입입니다. 하나의 타입에 여러 선택 가능한 값을 정의해두고 이 값들 중 하나를 선택할 수 있게 하기 위한 특수한 타입이지요. 러스트(Rust)도 열거형 타입을 지원하며 그 목적도 비슷합니다. 다만 각 값에 별도로 가질 수 있는 독립된 추가 값을 정의할 수 있다는 점이 독특한데 스위프트(Swift)의 열거형과도 비슷한 느낌을 받았습니다. 열거형(Enums) 러스트의 열거형은 아래와 같은 형식으로 정의할 수 있습니다. enum Gender { Male, Female, Other, } 위 코드는 세 가지 값 즉 Male, Female, Other라는 세 가지 값 중 하나를 가질 수 있는 Gender라는 타입을 정의하는 예제입니다. 다른 언어에 비해 약간 .. 2020. 10. 4.
러스트의 가변성(Mutability) 이야기 가변성(Mutability)과 불변성(Immutability)은 현대적인 언어에서는 제법 잘 다뤄지는 주제일지도 모릅니다. 그도 그럴게 코드의 구조나 성능이나 메모리 효율성이나 관리 등 다양한 면에서 영향을 끼치기 때문이니깐요. 러스트(Rust)도 비슷한 이야기를 할 거리가 있네요. 사실 이 이야기는 초반에 변수나 타입과 관련된 이야기와 함께 등장했었어야 하는 게 아닐까 할 정도로 기초적인 내용일지도 모릅니다. 불변 변수(Immutable Variables)와 가변 변수(Mutable Variables) 불변 변수는 생성될 때 받은 초기값을 변경할 수 없는 변수를 의미합니다. 이미 앞선 글들에서도 언급했지만 러스트의 변수는 기본적으로 불변성을 가집니다. let age = 16; age = 17; // E.. 2020. 9. 4.
러스트의 미래는 어떻게 될까? 최근 모질라(Mozilla) 재단과 관련된 암울한 소식이 나오고 있지요. 정확하게 재단이 아닌 회사(Mozilla Corporation)의 이야기지만 수익 문제로 운영이 힘들어지고 있어서 모질라의 많은 인력이 해고되고 있습니다. 모질라 파이어폭스의 핵심인 Servo 엔진 개발팀 또한 마찬가지로 운명이 암울합니다. 러스트(Rust)도 2010년 모질라의 연구 프로젝트로 시작한 언어인 만큼 모질라 재단의 상황에 영향을 받을 수밖에 없습니다. 그래서 러스트를 사랑하는 많은 사람들의 걱정 또한 끊이질 않고 있습니다. 그래서 러스트는 어떻게 될까요? 러스트는 이제 모질라에서 벗어나 별도의 재단으로 독립할 예정입니다. https://blog.rust-lang.org/2020/08/18/laying-the-found.. 2020. 8. 19.
러스트의 구조체 살펴보기 러스트(Rust)는 다양한 타입을 제공합니다. 원시 타입의 종류도 많지요. 그리고 튜플과 같이 다양한 타입을 묶을 수 있는 그룹형 타입도 있습니다. 그렇다면 러스트의 복잡한 자료구조는 튜플만 쓰면 되는 것일까요? 물론 아니니까 이런 글을 쓰고 있는 것이겠지요. C의 구조체(Structs)와 비슷하게 러스트도 구조체라 불리는 특수한 복합 타입을 정의하는 기능을 가지고 있습니다. 현대적인 OOP 언어의 클래스(class)와도 비슷하다고도 볼 수 있겠지만 물론 다른 겁니다. 러스트에서 구조체는 세 가지 의미가 있습니다. 하나는 C의 구조체와 비슷한 것, 다른 하나는 튜플 구조체, 다른 하나는 단위로만 쓰는 구조체의 세 가지입니다. 여기서 아무래도 제일 중요한 것은 처음의 C의 구조체와 비슷한 것이겠지요. 일반.. 2020. 8. 19.
소유권으로 알아보는 러스트의 상큼한(?) 메모리 관리 시스템 러스트(Rust)라는 언어의 유명세는 그 특유의 메모리 관리 시스템 덕분에 널리 알려진 것 같습니다. 독창적이면서도 릭(leak)이나 레퍼런스 공유로 발생하는 여러 문제를 컴파일 때 미리 대비할 수 있기도 하기에 러스트의 특징과 장단점이 잘 드러나는 기능인 것 같네요. 이번 글은 러스트의 소유권 개념과 메모리 관리 시스템을 간단히 살펴보는 글입니다. 메모리의 라이프사이클(Life Cycle) 대부분의 언어들이 그렇지만, 변수가 인스턴스화 되는 시점에 메모리가 할당(allocate)됩니다. 상식적이라면 상식적인 이야기지요. 그렇다면 이 메모리는 언제 해제(deallocate) 될까요? 러스트의 메모리 관리의 기본은 바로 스코프(Scope)입니다. 변수는 자신이 생성된 스코프를 벗어나면 사라지는데 이걸 메모.. 2020. 8. 15.
러스트의 함수와 클로저 함수는 반복되는 명령을 별도로 분리해서 쉽게 호출할 수 있게 해 주기 때문에 모든 프로그래밍 언어에서 아주 중요한 기능입니다. 러스트도 당연히 이 함수 기능이 제공되지요. 이 함수 기능을 살펴보고, 하는 김에 함수와 비슷한 클로저도 살펴보기로 했습니다. 함수(Functions) 이미 main 함수에서도 봐왔지만 함수는 fn이라는 명령으로 정의할 수 있습니다. fn hello() { println!("Hello?"); } fn main() { hello(); } 설명할 필요도 없을 만큼 간단한 예제이지만 간략히 설명하자면 "Hello?"라는 메시지를 출력하는 hello라는 이름의 함수를 만들고 이를 main 함수에서 호출하고 있는 예제입니다. 이제 저 "Hello?" 메시지를 찍고 싶다면 hello 함수만.. 2020. 8. 10.
러스트의 제어 구조 이번 편은 러스트(Rust)의 제어 구조 혹은 흐름 제어(Control Flow)에 관해서 살펴보는 글입니다. 매우 기초적인 내용이고 앞선 글들에서 일부 언급된 내용도 있어서 신선하지 않을 수도 있는 내용입니다. 제어 구조라는 개념은 소프트웨어에서 굉장히 중요합니다. 예를 들어 게임을 하는데 키를 눌러도 정해진 대로만 캐릭터가 움직인다면 무슨 의미가 있을까요? 이런 식으로 직렬 흐름에 변화를 가하는 것이 바로 이 제어 구조 혹은 흐름 제어입니다. 조건에 따라 흐름을 다르게 하면서 필요한 일을 할 수 있게 제어하는 것이지요. 논리식 본론으로 가기 전에 러스트의 논리식도 간단히 살펴봅시다. 다른 언어를 안다면 그다지 언급하지 않아도 될 정도로 러스트의 논리식도 평이(?)한 편입니다. let cond = !(.. 2020. 8. 5.
러스트의 기본 타입들 프로그램의 정의는 데이터를 이용해 연산을 하거나 컴퓨터에 특정 명령을 내리는 것입니다. 특히 이 연산 작업이 핵심이고 이걸 하려면 타입(Types)이라는 것을 필수적으로 알아야 합니다. 이 글에서는 러스트에서 제공하는 기본 타입을 정리하려 합니다. 참고로 여기서 기본 타입이라는 의미는 원시 타입(Primitive Types)과 함께 별도의 use 선언 없이 쓸 수 있는 타입들이라는 의미입니다. 물론 자의적인 기준입니다. 수치 타입 숫자 데이터를 저장하거나 연산하기 위한 타입을 뭉뚱그려서 수치 타입이라고 칭하겠습니다. 이 분류는 크게는 정수형과 실수형으로 나눌 수 있습니다. 정수형(Integer Types) 수치 타입 중 가장 자주 사용하게 될 것이 바로 정수형입니다. 정수란 소수점 없이 깔끔(?)한 숫자.. 2020. 7. 31.
러스트의 모듈 시스템과 접근 제어 모듈화는 프로그래밍에 있어 정말 중요한 요소입니다. 코드의 가독성과 함께 유지보수의 편리성에도 영향을 끼치지만, 그 자체로 설계가 되어 기능과 성능 자체에도 영향을 끼치지요. 러스트도 그래서 당연히 모듈화를 지원합니다. 다만 러스트의 모듈 시스템은 좀 독특한 편입니다. 몇 가지 시험을 해보면서 알아낸 내용을 정리해 보겠습니다. 러스트 모듈 시스템의 기초 러스트에서 모듈은 mod라는 키워드를 이용해 코드 어디서든 정의할 수 있습니다. mod foo { pub fn public_foo() { println!("foo::public_foo!") } fn private_foo() { println!("foo::private_foo!") } } fn main() { foo::public_foo(); } 위 예제는.. 2020. 7. 29.
러스트의 시작점 main 함수 살펴보기 단독 실행 프로젝트에서 시작점은 매우 중요합니다. 그야 시작하는 곳이니깐요. C 언어와 비슷하게 러스트(Rust)도 시작점은 main이라는 이름의 함수에서 출발합니다. 이 함수와 관련해 개인적으로 궁금했던 몇 가지 사항을 정리해 보겠습니다. main 함수 위에서도 언급했지만, 러스트 프로그램이 시작되는 지점은 main이라는 이름을 가진 함수입니다. fn main() { // ... } 튜토리얼 등에서 자주 볼 수 있는 러스트의 메인 함수는 위와 같은 모양입니다. 여기에 코딩하는 모든 코드는 프로그램 실행 시 바로 실행됩니다. 보이지 않는 리턴 타입 C 언어에 익숙하다면 표준(?)적인 main 함수는 아래와 같이 기본적으로 리턴 타입을 가지고 있다는 것을 알고 있을 것입니다. int main() { ret.. 2020. 7. 26.
Cargo :: 러스트 프로젝트 및 패키지 매니저 러스트(Rust) 공부를 시작하기에 앞서 우선 Cargo에 대해 알아두면 좋을 것 같아 먼저 살펴봤습니다. Cargo는 러스트 프로젝트를 생성하고 의존성을 관리하기 위한 도구입니다. 거기다 필요한 외부 유틸리티 패키지도 설치할 수 있게 도와줍니다. 참고로 러스트를 제대로 설치했다면 Cargo도 설치되어 있을 테니 별도의 설치 걱정은 없습니다. 이미 공식 매뉴얼 등에도 사용 방법이 잘 정리되어 있겠지만, 그냥 넘기기는 좀 섭섭하기도 해서 간단한 사용법을 정리해 보고자 합니다. 새 프로젝트 생성하기 아래와 같은 명령으로 새 러스트 프로젝트를 시작할 수 있습니다. cargo new PROJECT_NAME --bin 위 명령은 실행 가능한 파일 프로젝트를 현재 디렉터리에 새로 생성합니다. 즉 PROJECT_NA.. 2020. 7. 24.
러스트(Rust) 시작해보기 최근 주변에서 러스트(Rust)라는 언어에 대한 관심이 폭증하고 있는 것 같습니다. 그래서 저도 자연스럽게 관심을 가지게 되는 것 같습니다. 그러다보니 궁금해져서 슬슬 공부를 시작해볼까 합니다. 이 글은 첫 글로써 간단한 소개와 함께 macOS에서 러스트 개발에 필요한 컴파일러와 도구들을 설치하는 방법을 알아봅시다. Rust? 러스트(Rust)는 프로그래밍 언어의 한 종류입니다. 소스 파일을 작성하여 이를 컴파일하여 기계어 파일로 변환한 후 이를 실행시키는 방식이며 따라서 시스템 소프트웨어 개발에 유리한 언어입니다. 그래서 C 언어가 사용되는 분야를 상당수 대체할 수 있을 것으로 생각됩니다. 그런데 여기에 현대적인 언어들이 가지고 있는 다양한 편의 기능을 추가로 제공하고 있어서 C 언어가 다루기 힘들었던.. 2020. 7. 23.
728x90
반응형