본문 바로가기
반응형

기술적인 이야기/기타 개발32

소유권으로 알아보는 러스트의 상큼한(?) 메모리 관리 시스템 러스트(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.
Flutter에서 써드파티 모듈을 수동으로 집어넣기 Flutter는 오픈소스 의존성 시스템을 지원하며 따라서 커뮤니티에서 서드파티 패키지가 활발히 개발되고 있습니다. 그런데 간혹 이런 모듈 패키지들 중 있었으면 하는 기능이 빠져있거나 버그가 있거나 등 여러 이슈가 있을 수 있습니다. 이 경우 소스를 가져와서 직접 수정한 후 빌드해야 하는 경우가 될 수도 있습니다. 그렇다면 소스를 가져와서 어떻게 하면 될지를 간략히 정리해 봅시다. 간략히 정리하는 이유는 정말 간단하기 때문이지요. 😏 우선 원하는 모듈의 소스를 가져옵니다. 보통은 Github에서 가져올 테니 git clone 커맨드를 써서 복제하면 됩니다. 복제되는 위치는 마음대로 놓을 수 있습니다. 그다음으로 pubspec.yaml 파일을 열어서 의존성 목록에 아래와 같은 형식으로 해당 모듈의 소스가 위.. 2020. 6. 9.
Flutter 사용 시 발생하는 미확인 개발자 문제 macOS Catalina에서 Flutter CLI 도구를 이용해 개발 시 겪을 수 있는 문제 중 하나로 미확인 개발자 문제가 있습니다. 이 문제를 해결하는 방법을 간략히 정리하는 글입니다. 문제 flutter 커맨드를 사용할 때, 예를 들어 flutter doctor나 flutter build, 혹은 flutter run 시에 아래와 비슷한 오류가 날 때가 있습니다. "idevice_id" cannot be opened because the developer cannot be verifed. 위 오류에서 idevice_id 대신 ideviceinfo, iproxy 등 여러 이름이 올 수 있습니다. 즉 하나의 명령이 아니라 여러 명령 바이너리가 개발자 사인이 빠진 채로 빌드되어 있어서 macOS에서 경고.. 2020. 2. 18.
Python 3 정적 타이핑 소개 및 소감(?) 파이썬은 동적 타이핑 언어입니다. 쉽게 말해서, 하나의 변수가 타입에 구애받지 않는 데이터를 가리킬 수 있습니다. 그래서 동적 타이핑은 쉽고 간결한 코드를 만들 수 있기도 합니다. 하지만 이런 장점과 함께 단점도 존재합니다. a = 100 a = "String" 동적 타이핑은 이렇게 단순한 코드를 만들 수 있지만, 변수에 전달되는 값이 과연 원하는 것으로 전달되는 지를 감시할 수 없다는 큰 단점이 있습니다. 예를 들어 특정 함수를 호출할 때 특정 매개변수(parameter)에는 정수가 전달되고 어떤 매개변수에는 문자열이 전달되어야 하는데 이것이 잘못되었다고 할지라도 실제로 실행시키기 전까진 문제가 있는지 없는지 인터프리터가 파악해 주지 않습니다. def make_double_prev(v): return .. 2020. 2. 13.
Python에 F-string 이라는 게 있었다? 현대적인 언어에서는 대체로 String Interpolation이라 불리우는 기능들이 있습니다. 이 기능은 문자열 내에 특정 문자열을 집어넣거나 치환시키기 위한 특수한 문법이자 기능입니다. 만약 이런 기능이 없다면 문자열 조합에 상당한 난관(?)이 있겠지요. 이번 글은 이런 기능이 파이썬에도 있다는 것을 알게 되어서 공부 겸 작성해 본 글입니다. 기존의 파이썬의 이런 비슷한 기능으로 % 사인을 이용한 printf식 포매팅이나 format()을 활용한 치환법이 있었습니다. fs = '%d + %d = %d' % (1, 2, 3) fmts = '{} + {} = {}'.format(1, 2, 3) 하지만 이 방법의 문제는 명확했죠. 치환될 위치와 실제로 입력될 값을 다른 위치에 입력하다 보니 결국 눈으로 하.. 2020. 2. 11.
파이썬 코드 문법 검사기 flake8 flake8은 파이썬(Python) 코드를 점검해주는 도구이자 파이썬 패키지입니다. 이 도구는 일부 오류가 있을 법한 코드나 불필요한 모듈 임포트(import), 이상한 띄어쓰기나 잘못된 들여쓰기 등등 여러 문제점을 알려줍니다. 약간 딱딱하게 표현해서 PEP8 코딩 컨벤션에 맞지 않는 것들을 알려줍니다. 이런 기능을 하는 도구를 린트(Lint)라고 표현하기도 하지요. 비슷한 도구로 pyflake도 있습니다. 설치법 파이썬 패키지이기 때문에 pip로 그냥 설치하면 됩니다. pip install flake8 시스템에 따라 sudo를 줘서 루트 권한으로만 설치가 가능할 수도 있습니다. 사용법 flake8은 기본적으로 셸 CLI 유틸리티이기 때문에 커맨드 라인에서 간단히 실행시킬 수 있습니다. 그리고 실행 시 .. 2020. 1. 29.
파이썬의 새로운 의존성 관리자 Poetry Poetry는 파이썬(Python)용 패키징 겸 의존성 관리를 도와주는 도구입니다. pip와 virtualenv를 합쳐놓은 듯한 pyenv와 비슷하게 생각되는 도구네요. 최근에는 1.0으로 버전이 올라가면서 이제 쓸만해진 것 아닌가 하는 생각이 듭니다. 공식 홈페이지: https://python-poetry.org 굳이 pip나 virtualenv와 다른 점이 뭐가 있냐면 좀 더 통일화된 관리 방식을 제공해 준다는 점이 차이가 있으려나요? 실제로 poetry는 완전히 새로운 것이 아니라 기존에 제공되던 pip나 pipx, virtualenv 등을 그대로 사용하는 관리 방식을 제공합니다. 대신 npm이나 Cocoapods처럼 하나의 스펙 파일로 패키지 및 프로젝트 엔트리 포인트 등을 관리할 수 있게 해 준.. 2020. 1. 7.
Docker에서 macOS 호스트 포트에 접근하기 개인적으로 삽질했던 도커(Docker) 관련 경험을 하나 풀어서 메모해본다. 내용은 도커 컨테이너에서 macOS의 호스트에 열려있는 포트에 접근하는 방법에 대한 것이다. 하려는 것 회사 보안 정책 상 그냥은 접근할 수 없는 여러 서버들이 있다. 개발 중인 프로그램에서 정식으로 배포하지 않고 개발 서버로 이 서버에 접속하려면 VPN을 활성화 한 다음 SSH 터널링을 이용해 호스트에 포트를 열고 이 포트를 직접 접속하는 수밖에 없다. 도커를 쓰지 않고 이렇게 터널링으로 뚫어놓은 포트에 접근하는 것은 사실 아무 문제도 없다. 편하게 막 쓰면 된다. 그런데 도커를 사용하게 되면 문제가 발생한다. 컨테이너 내부에서는 당연히 호스트의 포트 상황을 전혀 모르기 때문에 어떻게든 알려줘야 한다. 그런데 컨테이너를 띄울 .. 2019. 7. 19.
python2가 없는(?) 내 컴퓨터 회사 프로젝트 때문에 npm으로 hiredis를 설치하는 도중 아래와 같은 에러를 만났다. > hiredis@0.5.0 install /foo/bar/develop/project/node_modules/hiredis > node-gyp rebuild gyp ERR! configure error gyp ERR! stack Error: Command failed: /foo/bar/.pyenv/shims/python2 -c import sys; print "%s.%s.%s" % sys.version_info[:3]; gyp ERR! stack pyenv: python2: command not found gyp ERR! stack gyp ERR! stack The `python2' command exists i.. 2019. 7. 12.
728x90
반응형