Generic은 컨셉의 복제를 효율적으로 다루기 위한 도구입니다. 구체화된 타입이나 다른 속성들에 대하여 추상화된 대리인 역할. 제네릭은 함수, 구조체, 열거형, 메소드를 정의할때 사용할 수 있습니다. 제네릭 데이터 타입 활용 다양한 타입의 파라미터를 받아 작업을 수행할 수 있습니다. 다른 언어들처럼 함수이름 뒤에 꺽쇠괄호를 써주면 된니다. 제너릭타입명은 값 하나면 T를 쓰고 함수타입 하나면 F를 쓰는게 관례입니다. 함수정의에서 제네릭 데이터 타입을 이용합니다. data: T는 [i32],[f32],[&str]타입의 파라미터를 받고 있습니다. fn show(data : T) -> T { data } fn main(){ println!("i32 data : {}", show(29)); println!("f..
테스트 함수 Rust에서 테스트는 함수로 구현되며, 테스트 코드를 넣기 위해서는 함수(fn)앞에 #[test] attribute를 붙이면 됩니다. #[test] fn add_test() { assert!(1 + 1 == 2); } 위와 같은 코드를 작성하고 cargo test를 실행하면 cargo는 #[test]가 붙어있는 함수를 찾아 차례로 실행하게 됩니다. assert!()매크로 안의 식이 참이면 pass, 거짓이면 error로 취급합니다. $ cargo test running 1 test test add_test ... ok 테스트 모듈 테스트모듈은 크게 Unit Test와 Intergration Test로 구분합니다. Unit Test : 각 소스 단위를 테스트 합니다. src폴더 안의 각 소스 ..
러스트코드를 파이썬에서 실행하는 방법입니다. 러스트의 높은 성능때문에 많은 파이썬 개발자들이 러스트 코드를 파이썬에서 사용하기 위한 도구를 개발했습니다. 그중에서 가장 널리 사용되는 PyO3 크레이트의 사용법을 알아보겠습니다. 파이썬 가상환경 만들기 pipenv pipenv는 pipenv 명령어 하나로 가상환경의 생성, 삭제, 의존성의 추가, 삭제, 업데이트 등을 모두 할 수 있는 편리한 도구입니다. pipenv는 프로젝트의 가상 환경을 자동으로 생성 및 관리하고 패키지를 설치/제거할 때 Pipfile에서 패키지를 추가/제거합니다. 또한 패키지 유효성을 검사하는 데 사용되는 매우 중요한 Pipfile.lock을 생성합니다. Pipfile.lock은 가상 환경에 설치된 각 패키지의 정확한 버전을 기록하는 ..
비동기 프로그래밍이란? 비동기 모델에서는 여러 가지 일이 동시에 일어날 수 있습니다. 프로그램에서 오래 실행되는 함수를 호출해도 실행 흐름이 차단되지 않고 프로그램이 계속 실행됩니다. 함수가 완료되면 프로그램은 결과를 알고 액세스합니다. 위 그림에서 왼쪽은 동기 함수의 실행 흐름, 오른쪽은 비동기 함수의 실행 흐름을 나타냅니다. 동기 함수의 경우, 요청1에 대한 응답이 주어질 때까지 기다렸다가 요청 2를 처리합니다. 비동기 함수는 요청1을 보낸 다음 응답이 올 때까지 기다리지 않고 바로 요청2를 처리합니다. 그 후, 응답 1과 응답2가 도착하면 결과를 바로 확인합니다. 비동기 함수를 사용하면, 프로그램 외부에서 작업이 끝나길 기다리는 동안에 다른 작업을 수행할 수 있기 때문에 효율적으로 작업을 수행할 수..
모든 컴퓨터는 멀티코어 프로세서를 가지고 있어서 여러개의 프로세스를 병렬적으로 실행할 수 있습니다. 하지만 각 프로세스는 독립적으로 격리되어 있어서 서로간에 데이터를 공유하기 어렵습니다. 하나의 프로세스로부터 여러개의 스레드를 만들면 한 프로세스 안에 속한 스레드들은 격리되어 있지 않고 메모리를 공유하며 서로 통신할 수 있습니다. 스레드 스폰 프로세스에서 스레드를 만드는 것을 스레드를 스폰(spawn)한다고 말합니다. 싱글 스레드 스폰하기 모든 프로그램은 메인 스레드로부터 시작합니다. 메인 스레드가 main 함수를 실행하고, 다른 스레드들을 실행시킬 수도 있습니다. 스레드 한 개를 스폰하는 방법은 아래와 같습니다. from threading import Thread from time import slee..
포인터란? 포인터는 메모리에 주소를 포함하는 변수에 대한 일반적인 개념입니다. 이 주소는 다른 데이터를 참조하거나 "가리키고"있습니다. Rust에서 가장 일반적인 종류의 포인터는 4장에서 배운 참조입니다. 참조는 & 기호로 표시되며 참조가 가리키는 값을 차용합니다. 데이터를 참조하는 것 외에는 특별한 기능이 없으며 오버헤드도 없습니다. 반면 스마트 포인터는 포인터처럼 작동하지만 추가적인 메타데이터와 기능을 가진 데이터 구조입니다. 스마트포인터는 C++에서 시작되었으며 다른 언어에도 존재하기 때문에 스마트 포인터의 개념은 Rust에만 있는 것이 아닙니다. Rust에는 표준 라이브러리에 정의된 다양한 스마트 포인터가 있어 레퍼런스가 제공하는 기능 이상의 기능을 제공합니다. 일반적인 개념을 살펴보기 위해 참조..
파이썬의 예외 처리 LBYL 도약하기 전에 살펴보세요(Look before you leap). 이 코딩 스타일은 호출이나 조회를 하기 전에 명시적으로 전제 조건을 테스트합니다. 이 스타일은 많은 if 문이 있다는 특징이 있습니다. if key in mapping: return mapping[key] 멀티 스레드 환경에서 LBYL 접근 방식은 '보기'와 '도약' 사이에 경쟁 조건이 발생할 위험이 있습니다. EAFP 허락보다 용서받는 것이 더 쉽습니다(Easier to ask for forgiveness than permission). 이 코딩 스타일은 유효한 키 또는 속성이 있다고 가정하고, 가정이 거짓으로 판명되면 예외를 포착합니다. 이 깔끔하고 빠른 스타일은 많은 try except 블럭이 있다는 특징..