본문 바로가기

전체 글

(117)
[Rust] 문자열 러스트에서 문자열 선언에는 여러 방법이 있습니다. let mut s = String::new(); // 비어있는 문자열 생성 let data = "initial contents"; let a = data.to_string(); let b = "initial contents".to_string(); // 3, 4라인과 동일 let c = String::from("initial contents"); // 위와 동일 to_string과 String::from은 모두 리터럴로부터 스트링을 생성하는 같은 일을 합니다. 어떤 것을 사용하는가는 코더의 스타일에 따라 사용하시면 됩니다. 문자열 추가 let mut s = String::from("foo"); s.push_str("bar"); push_str로 foo 뒤..
[Rust] Option 과 Result Option 러스트에는 기본적으로 null이 존재하지 않습니다. 하지만 null을 표현하기 위한 방법으로 Option이 존재합니다. enum Option { Some(T), None, } let x = Some(7); let y = None; enum으로 Option을 정의하며 T는 제네릭 타입으로 어떤 데이터 타입도 가능합니다. 따로 만들어 줄 필요 없이 기본 라이브러리에 저장되어 있습니다. fn main() { let some_number = Some(5); let some_string = Some("a string"); println!("some_number : {}",some_number.unwrap()); println!("some_string : {}", some_string.unwrap())..
[Rust] match 흐름 제어 연산자 러스트는 match라고 불리는 극도로 강력한 흐름 제어 연산자를 가지고 있는데 이는 우리에게 일련의 패턴에 대해 어떤 값을 비교한 뒤 어떤 패턴에 매치되었는지를 바탕으로 코드를 수행하도록 해줍니다. match는 enum과 같이 사용했을 때 매우 강력한 도구로 사용될 수 있습니다. enum Coin { Penny, Nickel, Dime, Quarter, } fn value_in_cents(coin: Coin) -> u32 { match coin { Coin::Penny => 1, Coin::Nickel => 5, Coin::Dime => 10, Coin::Quarter => 25, } } 함수의 매개변수로 열거형 Coin을 받고 match coin으로 coin이 어떤 것에 해당되는지에 따라 코드를 실행합..
[Rust] enum 열거형 코드를 작성할 때 구조체보다 간결하게 사용할 수 있는 열거형에 대해 알아보겠습니다. IP 주소는 v4와 v6가 존재합니다. 이를 열거형으로 표현해보겠습니다. enum IpAddrKind { V4, V6, } 사용은 다음과 같이 가능합니다. let four = IpAddrKind::V4; let six = IpAddrKind::V6; IpAddrKind라는 enum은 데이터 타입으로서 함수의 인자로도 쓰일 수 있습니다. fn route(ip_type: IpAddrKind) { } route(IpAddrKind::V4); route(IpAddrKind::V6); 열거형에는 데이터 또한 포함할 수 있습니다. enum IpAddr { V4(String), V6(String), } let home = IpAddr..
[Rust] 구조체의 메소드 러스트에서는 구조체에서 사용할 수 있는 함수를 정의할 수 있습니다. 이를 메소드라고 합니다. struct Rectangle { length: u32, width: u32, } impl Rectangle { fn area(&self) -> u32 { self.length * self.width } } fn main() { let rect1 = Rectangle { length: 50, width: 30 }; println!( "The area of the rectangle is {} square pixels.", rect1.area() ); } 메소드는 구조체 밖에서 정의되고 impl [구조체명]로 선언할 수 있습니다. 메소드의 인자로 존재하는 &self는 메소드를 호출하는 구조체 자체입니다. self.l..
[Rust] 참조자(References) 와 빌림(Borrowing) 참조자와 빌림에 대해 알아보겠습니다. 참조자는 C, C++에서 포인터와 비슷하다고 생각하시면 이해하기 쉬울 것 같습니다. fn main() { let s1 = String::from("hello"); let len = calculate_length(&s1); println!("The length of '{}' is {}.", s1, len); } fn calculate_length(s: &String) -> usize { s.len() } 참조자는 &을 사용해 나타냅니다. 저번에 배웠던 소유권에 따르면 s1을 calculate_length에 전달한다면 소유권은 calculate_length로 넘어가고 println! 에서 s1에 대한 출력은 에러를 발생시킬 것입니다. 하지만 참조자(&)를 이용해 잠깐 c..
[크립토 좀비] 레슨 03 정리 컨트랙트의 불변성 : 스마트 컨트랙트는 한번 메인넷에 배포되면 영구적으로 존재한다. 외부 의존성: 문제가 생기면 변경이 가능할 수 있도록 setter를 설정해 외부에서 주입받도록 설계한다. Ownable 컨트랙트: 함수에 onlyOwner 제어자를 추가하면 컨트랙트 배포자만이 함수에 접근할 수 있도록 해주는 컨트랙트 해당 컨트랙트에 ownable 컨트랙트를 상속받아 onlyOwner 제어자를 사용한다. 예시 contract MyContract is Ownable { event LaughManiacally(string laughter); // 아래 `onlyOwner`의 사용 방법을 잘 보게: function likeABoss() external onlyOwner { LaughManiacally("Muah..
[Rust] 소유권(Ownership) Rust의 핵심기능이라고 할 수 있는 소유권(Ownership)에 대해 알아보겠습니다. 모든 프로그램은 실행하는 동안 컴퓨터의 메모리를 사용하는 방법을 관리해야 합니다. 몇몇 언어들은 프로그램이 실행될 때 더 이상 사용하지 않는 메모리를 끊임없이 찾는 가비지 컬렉션을 갖고 있습니다. 또 다른 언어들에서는 프로그래머가 직접 명시적으로 메모리를 할당하고 해제해야 합니다. 하지만 러스트는 제3의 접근법을 이용합니다. 소유권이라는 시스템을 통해 더 효율적인 코드를 작성할 수 있게 합니다. 소유권 규칙 소유권에는 다음과 같은 규칙이 존재합니다. 러스트의 각각의 값은 해당 값의 오너(owner)라고 불리는 변수를 갖고 있다. 한 번에 딱 하나의 오너만 존재할 수 있다. 오너가 스코프 밖으로 벗어나는 때, 값은 버려..