게시글
질문&답변
2024.04.27
trait를 인자로 받을 때 &impl과 &dyn차이
심도 깊은 질문 감사합니다. impl은 정적 디스패치라고, 컴파일 타임에 해당 트레이트를 구현한 구체적인 타입을 파악할 수 있는 경우이고, dyn같은 경우 동적으로 런타임에 파악하는 경우에 활용합니다. 전자는 컴파일타임에 구체적인 정보를 파악해야 하는 대신에 성능 페널티가 없고, 후자는 컴파일 타임에 미리 정해지지 않은 해당 트레이트 구현체를 활용할 수 있지만, 런타임에 해당 구현체를 쫓아가야 하는 부담이 있습니다. 해당 주제는 중급 강의에 잘 정리해볼게요. 수강 및 질문 감사드립니다.
- 1
- 2
- 46
질문&답변
2024.04.19
구조체는 언제나 Heap에 저장되나요??
예리한 질문 감사드립니다. 덕분에 저도 다시 한번 학습하게 되었습니다. 구현하신 구조체는 스택에 저장되는 것이 맞겠습니다. 구성멤버의 메모리 크기가 컴파일타임에 사전 결정되기 때문에 더욱 가능합니다. 스택과 힙 메모리 어디에 할당되는가를 중요하게 설명드렸기에 혼란을 끼친 것 같습니다. 소유권 이전은 사실 엄밀하게 따지면 소유권의 대상(즉 메모리를 차지하고 있는 데이터)이 복사 되는가 아닌가가 더 중요하다고 볼 수 있습니다. 스택에 위치하는 기본 데이터형(i32 등)은 기본적으로 Copy 트레이트가 구현된 상태이고, 직접 선언하는 Struct는 기본적으로는 Copy트레이트가 구현되지 않습니다. 따라서 복제(Copy)가 발생하지 않고 소유권이 이동되어 버리는 상황인데요, 구현하신 코드에서 해당 구조체에 대해 Copy트레이트를 구현하신다면, 소유권이 이동되지 않고 복사되어 활용 가능합니다. #[derive(Clone, Copy)] struct Rectangle { width: u32, height: u32, } fn main() { let rect = Rectangle { width: 20, height: 30, }; println!( "가로가 {}, 세로가 {}인 사각형의 면적은 {}이다.", rect.width, rect.height, area(rect) ); print!("{:?}", rect.width); } fn area(rect: Rectangle) -> u32 { rect.width * rect.height } 이렇게 구현하시면 컴파일됩니다. 첫줄의 derive를 이용해서 Copy트레이트를 구현하였기 때문입니다. 대신 main함수의 스택공간과, area함수의 스택 공간 모두를 중복해서 차지하고 있게 되겠습니다. 다시 정리하면, Heap을 차지하는 데이터라고 하더라도 Copy트레이트를 구현하면 내용이 복사되면서, 소유권 이동이 일어나지 않겠습니다. 중급과정을 제작할 예정인데, 보충해서 잘 설명해보도록 하겠습니다. 수강과 질문 감사드립니다.
- 2
- 2
- 76
질문&답변
2024.04.04
혹시 어떤 폰트일까요?
여러 폰트를 썼는데요, 고운돋움 IBM Plex Sans KR Pretendard 입니다. 도움이 되셨기를 바랍니다.
- 0
- 2
- 130
질문&답변
2024.04.04
Lifecycle 강의에서 두 문자열 슬라이스를 비교해 긴 문자열 슬라이스를 리턴하는 것 관련 질문
예리한 질문 감사드립니다. 네, 아무래도 소유권과 임대, 그리고 생명주기(라이프사이클)등이 좀 생소하기 때문에 설명과 이해가 어려운 것 같습니다. 아마 아래 예제에 대한 질문이신 것 같습니다. fn str_lifetime() { let s1 = String::from("가나다"); let s2 = "하나둘셋"; let res = longest(s1.as_str(), s2); println!("더 긴 문자열은 {}", res); } /* 수명 표기를 잘 한 경우 */ fn longest (s1: &'a str, s2: &'a str) -> &'a str { if s1.len() > s2.len() { s1 } else { s2 } } 러스트의 함수에서 로컬 변수값을 리턴하는 것은 문제가 되지 않습니다. 로컬 변수에 대한 소유권이 함수 안에 있다했을 때, 반환값으로 넘어가면 해당 소유권이 함수 호출자에게로 이전되고, 호출한 입장에서는 해당 반환값을 문제없이 잘 활용할 수 있습니다. 게다가 소유권 "임대"의 경우에는 애초에 나한테 있던 소유권이 아니라 빌려왔던 것이기 때문에, 외부의 참조값을 빌려온 함수 입장에서는 애초에 내 소유가 아닙니다. 반환을 하든 안하든 애초에 내 소유가 아니었기 때문에 소유권 고민 문제에서 자유롭게 됩니다. 해당 라이프사이클에 대한 설명은, 소유권 임대의 상황에서, 그 임대값 참조의 수명을 명시해야 할 필요가 있는 경우에 대한 것인데요, 강의 중에 설명을 한 내용입니다만, 여기 글로 다시 정리해보겠습니다. longest 함수에서 s1 과 s2 라는 문자열슬라이스, 그러니까 참조값을 임대해 와서 무언가를 하고 있습니다. 코드 안에서는 s1 과 s2 의 len() 함수를 써서 길이를 판단해보고, 더 긴 참조값을 반환했습니다. 러스트 컴파일러 입장에서는 런타임에서 달라질 수 있는 (사실 이 코드에서는 s1과 s2의 구체적인 값이 하드코딩되어있기 때문에 어쩌면 알 수도 있겠습니다만, 일반적으로 문자열 값은 런타임에 다른 값이 발생하겠죠) 문자열들의 길이를 미리 알 수가 없습니다. 그러니 s1 참조값과 s2 참조값 중 어느 것이 반환될지 모르는 상황입니다. 이럴 때, 러스트 프로그래머가 둘 중 어느것이든 반환 될 수 있고, 그 라이프사이클이 반환값의 라이프사이클 조건과 맞을 수 있도록 명시해주는 작업인 거죠. 그렇게 컴파일러의 임대 검사기 (borrow checker)가 'a라는 동일 lifecycle 기준으로 검사를 진행할 수 있게 해주는 상황입니다. 다시 글로 적어도 어려운 내용인 것 같습니다. 추가 설명드리면 좋을 부분 있으시면 편히 말씀 부탁드립니다. 수강해주시고, 질문 남겨주셔서 감사합니다.
- 0
- 1
- 72
질문&답변
2024.02.12
Optional<T> 새 기능 7초 정도 영상이 안나옵니다
제보 감사드립니다. 영상 다시 업로드하여 해결하였습니다.
- 1
- 2
- 80
질문&답변
2024.01.08
build 오류
음, 뭔지 해결하기 어려울 것 같은 불안함이 듭니다만, 혹시 해결될지 모르니, --release arm64 옵션을 빼고 한 번 진행해보시겠어요? 결과가 같을지 모르겠고, 혹시 여전히 안되신다면, 아래 커맨드로 rust설치 버전 상황을 한번 적어봐 주시겠어요? rustup show
- 0
- 1
- 156
질문&답변
2023.12.20
강의 예제 URL 404 오류
어이쿠, 알려주셔서 감사합니다. 문제 해결해두었습니다. 또 궁금하신 점 있으시면 언제든 질문 남겨주세요~
- 1
- 1
- 95
질문&답변
2023.12.18
웹 어플리케이션 개발에도 잘 사용되나요?
웹어플리케이션의 프런트를 말씀하시는 거라면, 아무래도 웹어셈블리 형태로 빌드돼서 활용되는 경우가 많을 것 같습니다. 웹어셈블리 바이너리를 생성하기에 너무 잘 되어있으니, 고성능 프런트 작업이 필요한 경우에 활용하기 좋아서 러스트를 쓰는 경우가 적지 않을 것으로 예상해요. 다만, 일반적인 자바스크립트 기반 웹프런트에는 별 쓰임새가 아직 없으리라 생각합니다. 웹어셈블리측면에서는 강의에 포함된 간단한 예제를 참고해주세요. 백엔드 측면에서 보자면, API를 만들어서 배포하는 측면으로 활용하기 좋을 텐데요, 강의 예제에도 포함된 AWS 람다 함수로도 배포해서 쓰기 좋으니, 러스트가 마음에 드신다면 웹애플리케이션 백엔드 서비스를 만들기 좋을 것 같습니다. 저 개인적으로는 람다함수 형태로 배포해서 쓰는 방식을 좋아하고 있어요. 사실 제가 만드는 토이앱들이 성능이 중요하지는 않습니다만, 대신 가볍고 빠르니까 유지비용이 저렴해서 좋습니다. 람다함수로 배포해두면 비용이 거의 발생하지 않아서 부담없어서 좋더라구요. 어떤 언어든 널리 활용되는 언어들은, 웹애플리케이션을 만들기 좋다고 봐도 무방할 것 같아요. 웹개발이야 어디서나 중요하고 많이 쓰이는 활용분야인데, 어떤 언어가 해당 작업을 하기에 불편하다면, 아직 범용성이 갖춰지지 않은 수준이라고 봐야하겠죠. 러스트는 개발자들이 사랑하는 프로그래밍 언어로 여러 해동안 유지된 수준이니만큼, 웹개발 측면에서는 충분히 유용하다고 봐도 된다고 생각합니다.
- 1
- 1
- 209
질문&답변
2023.11.06
Elm의 functor?
오, 어떤 "필요"에 의해서 Elm을 공부하고 계신지 궁금합니다. 챗지피티말대로, Elm에는 펑터나 모나드 같은 것들이 잘 드러나지 않습니다. 하지만, 사실상 배후에는 펑터나 모나드 개념이 그대로 들어있습니다. Maybe.map , List.map 처럼, 각각 별개의 함수처럼 동작하지만, 사실상 하나의 함수를 받아서, 내부의 요소를 변환하는 펑터 map 작업을 합니다. 엘름이 나름 훌륭한 점은, 이용자로 하여금 펑터나 모나드 등을 구체적으로 알지 못하더라도, 문제없이 개발할 수 있다는 점인 것 같습니다. 사실 펑터가 뭔지 전혀 모르고도 Elm 개발을 잘할 수 있죠. 그리고 String.any isDigit은 펑터와 관련있는 함수가 아니기 때문에, 질문 자체가 틀려서, 챗GPT가 제대로 답변할 수 없었다고 봐야겠네요. 고차함수 관련 질문을 하신 것 같습니다. Is Maybe.map a functor related function in Elm? 이렇게 한번 물어봐 보시면 참고가 될 것 같습니다.
- 0
- 2
- 190
질문&답변
2023.10.23
임대값의 수명에 대한 강의는 언제쯤 볼 수 있을까요?
오래 기다리셨습니다. 임대값 수명에 대한 강의 추가완료하였습니다.
- 0
- 2
- 189