분류 전체보기 476

[leetcode] 3079. Find the Sum of Encrypted Integers - Rust

leetcode 문제 중 Rust의 다양한 타입변환을 참고하기 좋은 문제가 있어 기록해둔다.   자세한 내용은 주석에 상세하게 적어두었으니 참고바란다.  알고리즘 문제 풀이 중 가장 기본적인 내용은 타입간 변환이다. i32 -> char -> char 's  -> string -> i32 -> 혹은 u8 u32 usize 등으로 변환이 자유자재로 가능해야한다.  이게 안되면 중간에 막히는 곳이 너무 많다.   /** 1530 ~ 1545 i32 char's string간 변환이 핵심인 듯 하네요 */impl Solution { pub fn sum_of_encrypted_int(nums: Vec) -> i32 { let mut output = 0; f..

[Rust] Rust가 ++연산자를 지원하지 않는 이유

Rust 로 리트코드를 풀던 중 한 문제에서 Rust의 재미있는 특성을 발견했다.  아래 코드를 보면 count += 1이 있다. count++로 사용하려 했으나 컴파일 타임 에러로 인해 사용할 수 없었다.  Rust는 ++, --같은 연산을 허용하지 않는다는 것이 이유였다.  왜 없을까?  우선 안전성과 명확성이 그 이유라고 한다.  명확성의 경우 count += 1처럼 어떤 연산을 하는지 명확하게 보여줄 수 있다고 하는 점 때문이다.이 부분은 조금은 이해가 가지만 안전성이란 대체 어떤 걸 이야기하는 걸까?  ++가 위험하다는 걸까?  알아보니 ++의 경우 사이드 이펙트를 발생시킬 여지를 갖고 있다고 한다. 그 예시가 바로 이런 코드라고 한다. int a = i++ + ++i;이 코드가 컴파일러마다 결..

Rust lang 2024.05.03

[leetcode] 2451. Odd String Difference - Rust

간만에 카페에서 쉬면서 평화로운 시간을 보낸다. 역시나 쉴때는 리트코드 푸는게 제일 재밌다.  심심해서 Rust로 풀어봤다.   재밌는 문제다. 문제 자체는 쉬운 편인데 Rust로 풀자니 Rust자체의 문법에서 살짝 걸려넘어지는 부분이 있었다. 정리해둘만한 부분이 있는데 같이 살펴보자.  자 우선 for word in &words에서 &로 borrow해서 사용한다. 이렇게 사용하는 이유는 borrow해서 사용하지 않으면 밑에서 words를 참조하려고 할때 위에서 소유권이 이미 이전되었기 때문에 컴파일 에러가 나기 때문에 borrow해서 사용해야 한다. 또 재밌는 부분은 String타입은 개별 word를 접근하려고 할때 String타입 그 자체에서 [] indexing으로 접근할 수 없기 때문에 word...

[생각] 건강 악화

최근 건강이 좋지 못해 연차를 연속으로 사용했다.  이틀전 자다가 코피를 흘렸는데 꽤 많이 흘렸다. 이후로 양쪽에서 계속 코피가 났는데 잠자던 침구에 쏟은 양이 많아 흠칫했다.  어제는 잇몸에서 피가 너무 많이 나왔다. 이전에 일하다가 입이 찜찜해서 화장실에서 뱉었는데 생피가 두세 스푼 가량 나와서 놀랐는데 어제는 꽤 많이 나왔다. 입에 피를 잔뜩 머금을 정도로 많이 나와서 놀랐다.  집중할때 입을 꽉 깨무는 버릇이 있는건가? 싶었는데 꼭 그렇지도 않고 스트레스 때문인가 싶었지만... 원인은 잘 모르겠다. 그냥 코랑 입에서 피가 자주 그것도 꽤 많이 난다.  병원에 다녀오고 마취 취료가 필요하다고 해서 예약을 하고 잠시 휴식을 좀 취했다.  긴장이 풀려서인지 아니면 그냥 스트레스 누적 때문인지, 그저 개..

생각들 2024.05.03

[kotlin] 코틀린 inline과 crossinline 키워드

코틀린에 흥미로운 키워드가 하나 있다.  inline과 crossinline이라는건데, 오늘 처음 봤다.  inline함수로 지정하면 컴파일 시 해당 함수의 바이트코드가 호출 지점에 직접 삽입된다고 한다. 이걸 인라인화라고 한다. 그래서 함수 호출의 오버헤드를 줄일 수 있다고 한다.  간단한 함수 있을때 사용하면 조금이나마 성능을 줄일 수 있을 것 같다. 별거없다. 그냥 코드 치환이고 성능 조금 더 올리고 싶을 때 쓰면 된다.  재밌는건 crossinline이라는 생소한 키워드도 있다.  이건 inline 함수의 람다 파라미터에 사용된다. inline 함수 내부에 전달된 람다가 비지역 반환(non-local returns)를 할 수 없음을 나타낸다고 한다. 혹은 방지라는 용어가 더 알맞겠다.  비지역 반..

Kotlin lang 2024.04.27

[개발 이야기] 신입에서 주니어로

작년 2월에 입사하고 벌써 1년이 훌쩍 넘었다.  졸업하자마자 곧장 신입으로 일했고 이것 저것 하다보니 벌써 신입 타이틀을 떼고 주니어가 되었다는게 신기하다.프론트엔드, 백엔드 등등 가리지않고 많은걸 해볼 수 있었다. 신입, 주니어, 시니어 등등 이런건 그저 호칭에 불과하지만 오늘따라 유독 와닿는 단어인것 같다.  마침 카페에 와서 글을 쓰다보니 유독 의미에 대해 생각하게 되는 것 같다.  처음 입사했을 때 지라 티켓만드는 것도 몰랐고, git rebase를 할 줄 몰라서 꼬인 커밋을 해결하지못하고 다시 clone받아야했던 적도 있다. MR은 어떻게 드려야하는지, 질문은 어떻게 해야하는지 그리고 문서 작성과 업무에 대한 공유까지 모든게 낯설었다. 어려운 프로젝트도 있었고 쉬운 프로젝트도 있었다. 그래서 ..

개발 이야기 2024.04.27

[개발 이야기] exception 핸들링에 대한 고민

최근 exception핸들링에 대해서 고민이 있다. 애플리케이션을 만들때 어떻게 예외를 처리해야할지에 대해 근본적인 해답이 없다는 생각이 든다.  외부 api호출같은 IO작업에서 주로 try catch같은 exception 처리를 하는게 좋은데, 이미 요청이 실패하거나 크리티컬한 이유로 실패해서 exception이 터졌다면 애초에 처리하고자하는 정상적인 상태에서 깨진 상황인데 이상황에서 뭘 더 핸들링할까라는 생각이 든다. 바꿔 말하자면 이미 깨진 상태인데 뭘 더 하겠냐라는 뜻이다.  크리티컬한 이슈가 아닌 경우를 생각해보자면, 뭔가를 등록하려는데 중복 등록이라던지 혹은 워닝으로만 남겨도 될만한 작업이라면 쉽다. 그런데 인증이 잘못되었거나 뜬금없는 timeout 혹은 전혀 대비되지 않았던 예외케이스처럼 크..

개발 이야기 2024.04.26

[kotlin] 코틀린 코루틴에 대한 개념 정리 (4)

코틀린에는 구조화된 동시성이란 개념이 있다고 한다.  꽤나 비중있는 주제인것 같아 깔끔하게 정리해보고자 한다.  코루틴에는 코루틴 내부에서 또 코루틴을 만들 수 있다.이 경우 부모코루틴과 자식 코루틴이 생긴다. 코루틴에는 Job객체로 코루틴을 추적할 수 있는데, Job객체 내부에는 parent와 children이라는 프로퍼티가 있어서 이걸로 부모 자식간 양방향 참조가 가능하다.참고로 parent는 Job?타입이고, children은 Sequence 타입이다. parent가 Job?인 이유는 루트 코루틴의 경우 부모가 없을 수도 있기 때문이다.  그리고 CoroutineContext의 경우 부모에서 자식으로 상속되고, 자식에서 별도의 CoroutineContext를 사용한다면 상속받은걸 덮어씌우게 된다. ..

Kotlin lang 2024.04.25

[kotiln] 코틀린 코루틴에 대한 개념 정리 (3)

지난번 포스팅에서 코루틴 빌더 함수와 Job객체에 대해 알아보았다.  이번 포스팅에서는 async와 Deferred에 대해서 알아보자.  이전에 배운 launch 코루틴 빌더 함수는 코루틴으로부터 결과값을 받을 수 없었다. 다만 Job객체를 받을 뿐이었다.  그런데 코루틴으로부터 작업에 대한 결과값을 받을 필요가 있을 수 있다. 이때 사용하는데 async와 Deferred응답 객체이다. async(Dispatchers.IO) { ... }와 같이 사용할 경우 Deferred를 리턴받고, 해당 Deferred타입의 변수에 대해 await()메서드를 사용하면 결과를 받을 수 있다. await()을 사용하는 이유는, 코루틴이 언제 완료될지는 모르기 때문에 Deferred가 미래의 값이라는 의미..

Kotlin lang 2024.04.22
반응형