We will find a way, we always have.

-interstellar

Programming Language 35

테스트로 배우는 러스트

러스트에 기여하면서 배웠던 점들 알게 된 점들 깨달았던 점들을 남겨보려고 한다. 우선 러스트의 첫 PR은 문서 수정이였다. 코드 구경하다가 깨진 링크를 발견하였고 이를 수정하는 PR을 올렸다. 이렇게 한번 기여하고 나니까 뭔가 나도 좀 더 기여할만한 것들이 있는지 이슈를 둘러보기 시작하였다. 다른 이야기지만 이렇게 깨진 링크가 있는 Repository가 꽤 많이 있다는 것을 발견하고 러스트로 새로운 프로젝트도 만들어보고 있으니 많관부 (깃허브, 블로그) 이후 다른 오픈소스보다 알게된 점인데 러스트의 이슈 관리는 아주 잘 돼있는 편이었다. 라벨링도 다양하게 잘 되어 있었고, E-eazy처럼 난이도로 분리된 것도 있고, E-mentor처럼 멘토가 붙어서 도움을 준다는 이슈도 있었다. PR을 올리면 자동으..

[자바] static과 static final의 유무에 따른 실행시간

백준 질문게시판을 구경하고 있었는데 재미있는 글이 올라왔다.모듈러 1,000,000,007를 static으로 두었을 때와 static final로 했을 때의 수행속도가 두배이상 차이난다는 글이었다.우선 static과 static final의 공통점은 둘 다 모든 객체가 해당 멤버 값을 공유한다. 차이점은 static final은 상수라는 점이다. 때문에 재할당이 불가하고 해당 값이 primitive type이라면 변경도 불가하다. 개념적인 차이점은 이제 알겠다. 그렇다면 바이트코드에선 어떠한 차이점을 가져오는지 살펴보자.  예를 들어 위와 같은 코드가 있다. (m,a,b는 입력받는 값이라고 생각하자.) MOD가 static final 일 때 바이트 코드이다.   아래는 MOD가 static 일 때 코드이..

[Rust] 러스트의 꽃, 소유권

러스트를 배우면서 가장 신기했던 부분은 바로 소유권이였다. 러스트 소유권에는 세가지 규칙을 따른다. 각각의 값은 소유자 (owner) 가 정해져 있다.한 값의 소유자는 동시에 여럿 존재할 수 없다.소유자가 스코프 밖으로 벗어날 때, 값은 버려진다 (dropped). 소유자 개념을 이해하기 위해 한가지 예시를 들어보겠다.   위 코드는 "레디"라는 문자열 객체를 만든 다음 tmp라는 변수에 할당을 해준다음 name을 출력하는 코드이다.  자바로 작성하면 아래와 같다.   자바에서는 아무런 문제 없이 돌아가지만 이 코드가 러스트에선 에러가 발생한다.    에러 발생 이유는 바로 소유권 때문이다.  처음에는 name이 힙 메모리에 저장된 문자열 "레디"를 소유하게 된다. 그 다음 tmp = name을 실행하면..

[Rust] 러스트에게 반한 점, immutable & mutable 변수

러스트에선 let 이라는 키워드를 사용하여 변수를 선언한다.    기본적으로 타입 추론을 해주고, 타입을 명시할 수도 있다.  러스트는 상당히 많은 타입 종류를 가지고 있는데, 이건 다음번에 이야기 해보도록 하고 이 글에서 이야기 하고 싶은 것은 immutable과 mutable이다.  자바를 사용하면서 이런글까지 쓸 정도로 final을 숨 쉬듯 써왔다. 로컬 변수, 파라미터, 필드 등등 붙일 수 있는 변수들에는 전부 final을 붙여왔었는데, 붙이면서도 애매했던 점은 사실 final을 붙여도 불변은 아니라는 것이였다. 재할당은 막을 수 있지만, 그 값 안의 있는 값들이 변경되는 것은 막을 수 없었다.  뿐만 아니라 final을 붙여도 값이 추가되는 것을 막을 순 없다.  위 코드는 문제없이 잘 돌아간다..

[Rust] 러스트에서 이분탐색

오늘 릿코드 데일리 풀다가 이분탐색을 사용할 일이 있어 러스트가 제공하는 이분탐색 라이브러리를 살펴보았는데, 재밌는 점을 발견하여 정리를 한다. (만약 데일리 풀이 코드가 궁금하다면 여기로) Vec에 binary_search 라는 함수가 있다. 만약 배열에 찾고자 하는 값이 있다면 해당 인덱스를 반환하고, 없다면 lower bound 즉 그 값이 들어가야 할 인덱스를 반환한다. 사실 자세한 설명은 아래에 첨부한 러스트 docs를 보는게 정확하고 친절하다. 그럼에도 이 글을 쓰는 이유는 러스트가 제공하는 이분탐색 함수가 파이썬이 제공하는 이분탐색 함수랑 다른 점이 있었고 여기서 러스트의 철학을 배웠기 때문이다. 파이썬이 제공했던 bisect 라이브러리와 달랐던 점은 무엇이었냐하면 Result로 한 번 값을..

[VM] 그랄VM (GraalVM)

최근 읽고 있는 도서 JVM 밑바닥까지 파헤치기에서 자바의 신기술 중 그랄VM이 무엇인지 잠깐 엿보았었다. 그런데 바로 다음날 if 카카오에서도 GraalVM 도입으로 JVM 백엔드 애플리케이션의 구동 초기 성능 문제 해결하기 라는 제목으로 발표영상이 올라와 이건 운명이다 생각하여 그랄VM이 뭔지 정리해보려고 한다. 그랄VM (GraalVM)2018년 4월 오라클 연구소는 그랄VM이라는 새로운 기술을 발표했다. "Run programs faster anywhere" 라는 구호로 등장했다.   사진 출처: https://blogs.oracle.com/java/post/for-building-programs-that-run-faster-anywhere-oracle-graalvm-enterprise-editi..

[자바] JVM 남이 주는거 아무거나 받아먹지 말자

서론문제 상황은 이렇다. 이 글을 쓰기 위해 JDK 8을 설치하고 열심히 디버깅하면서 글에 첨부할 자료들을 캡쳐했다. 그리고 인텔리제이를 종료하고 시간지나 다시 켜니 라이센스 재인증 하라는 알림창이 떴다.  재인증을 하려니 Problem with connection: SSL error probably caused by disabled SNI 와 Received fatal alert: handshake_failure 에러가 발생하였다.  인텔리제이에서 연결을 요청하는데 proxy 문제인지 뭐 암튼 인터넷 연결이 되지 않아 라이센스를 인증하라는데 인증할 수가 없는 그런 상황이었다.  사실 이런 문제 발생 예고는 이전부터 있었다. 언제부터인가 인텔리제이에서 db 커넥션 오류가 계속 발생하고 플러그인을 설치하려..

[자바] 공백 처리 탐험기 (isEmpty(), isBlank(), strip(), trim())

서론Tomcat 구현하기 미션 중 요청을 처리하는 과정에서 공백 제거를 하지않아 예외가 발생했다.   자바에서는 양 사이드 공백 제거를 위해 trim()과 strip() 두가지 메서드를 제공한다. 이 둘은 어떤 차이를 가지고 있고 어떻게 구현되어있는지 알아보자.  공백 확인공백 제거로 들어가기 전 공백 확인 메서드를 살펴보자. 문자가 빈문자열인지 확인할 때 isEmpty() 혹은 isBlank() 메서드를 사용하곤 했다.    isEmpty()를 사용하면 문자열이 딱 "" 요녀석인지만 확인해주고 isBlank()를 사용하면 "" 이외의 공백, 탭, 줄바꿈과 같은 녀석들도 판별할 수 있다.     어떻게 확인하는가? 위 메서드들은 어떻게 문자가 비었는지 알까소스코드를 까보자.  isEmpty() Strin..

[자바] final에 美친놈

서론 우테코 레벨1 때 첫번째 미션이었던 자동차 경주 미션과 마지막 미션인 체스 미션의 main 메서드를 살펴보면 눈에 띄게 달라진 게 있다. 바로 final main의 파라미터인 args에도 final, 로컬 변수에도 final, try catch 문에서 잡은 예외에도 final이 붙어 있다. 제일 처음 꼬신건 :네오:였다. 문자열 덧셈 계산기 피드백 강의를 보는데 코드 여기저기서 final을 볼 수 있었다. 그때부터 이녀석에게 관심을 갖기 시작했다. 그럼 이제 final이 뭐길래 얘는 필사적으로 final을 붙이려고 하는지 알아보자. 본론 final 키워드를 추가할 수 있는 곳은 여럿 있는데 각각 의미가 다르다. 클래스 상속 제한 메서드 오버라이딩 제한 변수 재할당 제한 여기서 나는 변수에 초점을 두..

[자바] 내가 커스텀 예외를 사용하게된 이유 (IllegalArgumentException, IllegalStateException)

서론지금까지 도메인 요구 사항에 맞지 않는 입력이 들어온다면 주로 IllegalArgumentException를 사용하였고 파라미터로 어떤 예외인지 메시지를 담아 의미를 전달하였다. 이녀석이 뭐 특별한 기능을 제공하느냐? 라고 물어본다면 네니오라고 답할 수 있다. IllegalArgumentException이 제공하는 기능은 의미를 전달하는 것이다. 다시말해 유효하지 않은 인자가 왔다는 의미를 전달하는데 요게 바로 특별한 기능이다. 나는 이 IllegalArgumentException 안에 메시지를 넣어 예외를 다르게 표현하는 방식을 사용해왔다. 프리코스 때 뿐만 아니라 우테코 들어와 자동차 미션, 사다리 타기 미션 때까지만하여도. 이때까진 커스텀 예외를 사용하는 크루를 보고 아 너무 오버 엔지니어링 아..