전체 글
이펙티브 자바, 쉽게 정리하기 - item 52. 다중정의는 신중히 사용하라
이펙티브 자바, 쉽게 정리하기 - item 52. 다중정의는 신중히 사용하라 다중정의(Overloading) 문제의 예제 코드 static class CollectionClassifier { public static String classify(Set s) { return "집합"; } public static String classify(List s) { return "리스트"; } public static String classify(Collection s) { return "그 외 컬렉션"; } } @Test public void collectionClassifierTest() { Collection[] collections = { new HashSet(), new ArrayList(), new H..
SQLite 직접 만들어보기 Step 2 - 세상에서 가장 간단한 SQL 컴파일러와 가상머신 만들어보기
원본 글 https://cstack.github.io/db_tutorial/parts/part2.html SQLite 의 앞단 (front-end) SQLite 의 앞단은 문자열을 구문 분석(parsing) 하고 바이트 코드라는 내부 표현을 뱉어내는 SQL 컴파일러이다. 바이트 코드는 가상 머신(virtual machine) 으로 넘어가 가상 머신에 의해 실행된다. 다시 아키텍처 살펴보기 SQLite 공식 사이트에서 제공하는 아키텍쳐 문자열을 먼저 바이트 코드로 만든 뒤에 바이트 코드를 가상머신에서 실행하는 2가지 절차를 따르면 무슨 장점이 있을까? 2가지 파트를 각각 구현하기 때문에 각 파트에 대한 복잡도를 낮출 수 있다. 가상 머신은 SQL 문법 에러에 대해 걱정하지 않아도 된다. 일반 쿼리를 한번 ..
SQLite 직접 만들어보기 Step 1 - 매우 간단한 REPL 만들어보기
원본 글 https://cstack.github.io/db_tutorial/parts/part1.html DB 동작에서 의문점 디스크와 메모리에서 데이터는 어떤 포멧으로 저장되는가? 데이터는 언제 메모리에서 디스크로 이동하는가? 테이블당 기본키 (primary key) 는 왜 하나여야만 하는가? 트랜잭션 롤백은 어떻게 동작하는가? 인덱스는 어떻게 포맷되는가? 풀 테이블 스캔 (full table scan) 은 언제 어떻게 수행되는가? prepared statement 는 어떤 포맷으로 저장되는가? SQLite SQLite 는 작고 내부 구현에 대한 참고자료도 풍부해 공부하기 좋다. 프론트엔드 (front-end) 토크나이저 (tokenizer) 파서 (parser) 코드 생성기 (code generato..
Windows WSL 에서 C 언어 코딩 환경 세팅하기
WSL 을 세팅하는 이유 윈도우즈에서 mingw 를 이용해 C 언어 코딩을 하려고 했는데 리눅스 버전과 라이브러리 차이가 조금 심해서 어쩔 수 없이 WSL 을 세팅해야 했다 WSL Ubuntu Linux 에서 C 언어 사용법 WSL 설치 WSL 을 WSL2 로 업그레이드 공식 문서 보고 쉽게 가능 sudo apt-get install build-essential gdb 설치 안되면 sudo apt-get update 이용 C/C++ Extensions 설치 설치 이후 WSL 전용도 익스텐션도 설치 .vscode 아래 설정 파일들 c_cpp_properties.json 파일 { "configurations": [ { "name": "Linux", "includePath": ["${workspaceFolde..
git cat-file 명령어란?
git cat-file 명령어란? 리포지토리 오브젝트에 대한 콘텐츠 유형 및 크기 정보를 제공하는데 사용된다 git cat-file (-t | -s | -e | -p | ) 명령어 설명 : 검사를 원하는 SHA1 해시 값 옵션들 -t: 오브젝트의 타입을 보여준다 (commit, tree, blob, 등) -s: 오브젝트의 사이즈를 보여준다 -e: 오브젝트가 존재하는지 그리고 접근 가능한지를 확인한다 -p: 타입을 기반으로 의 내용을 예쁘게 프린트한다 예시 git cat-file -p 1f37a3c8 위와 같이 명령어를 입력하면 1f37a3c8 라는 커밋 해시 값을 찾아낼 것이다 -p 옵션을 줬기 때문에 커밋 정보를 예쁘게 프린트한다
WSL 에서 apt-get install 을 이용한 패키지 설치가 동작하지 않을 때
증상 sudo apt install tree sudo apt install xxx 명령어가 먹지 않는다 Reading package lists... Done Building dependency tree Reading state information... Done E: Unable to locate package tree 위와 같은 메세지를 내뱉으며 설치가 되지 않음 해결 $ sudo apt-get update apt-get update 명령어를 먼저 입력하여 패키지 리스트를 최신으로 만들면 이후부터는 apt get install 이 잘 동작한다
이펙티브 자바, 쉽게 정리하기 - item 51. 메서드 시그니처를 신중히 설계하라
이펙티브 자바, 쉽게 정리하기 - item 51. 메서드 시그니처를 신중히 설계하라 메서드 이름은 신중히 짓자 메서드 표준 명명규칙을 따르자. (item. 68) 최대한 커뮤니티에서 널리 받아들여지는 이름을 사용하자. 편의 메서드를 너무 많이 만들진 말자 클래스에 메서드가 너무 많으면 다른 개발자가 알기도 힘들뿐더러 문서화 등 유지보수도 힘들다. 확신이 서지 않으면 만들지 말자. 매개변수 목록은 짧게 유지하자 일반적으로 4개 이하가 좋다. 같은 타입의 매개변수가 연속으로 나오면 특히 해롭다. 동작이 의도와 다르게 변질되기 쉽다. JS 에서는 3개 이상인 경우 매개변수 객체 등을 이용하는 것이 깔끔했다. 자바에서는 이걸 헬퍼 클래스라고 한다. 매개변수가 너무 길 때 1: 메서드를 쪼개자 메서드를 여러 메서..
이펙티브 자바, 쉽게 정리하기 - item 50. 적시에 방어적 복사본을 만들라
이펙티브 자바, 쉽게 정리하기 - item 50. 적시에 방어적 복사본을 만들라 클래스 내부 수정을 본의아니게 허락하는 경우 static class Period { private final Date start; private final Date end; public Period(Date start, Date end, int version) { if (start.compareTo(end) > 0) { throw new IllegalArgumentException( start + "가 " + end + "보다 늦다." ); } if(version == 1) { this.start = start; this.end = end; } else { // 방어적 복사본 만들기 this.start = new Date(s..
WSL 루트 (ROOT) 계정 패스워드 분실 (까먹었을 때)
WSL 루트 (root) 계정 패스워드 분실 (까먹었을 때) 명령 프롬프트를 실행한다 wsl -u root 명령어를 입력한다 passwd 명령어를 이용하여 root 계정의 새로운 암호를 설정한다. 특정 유저의 패스워드를 까먹었다면? passwd 유저이름 명령어를 이용하여 해당 유저의 패스워드를 초기화한다. 레퍼런스
이펙티브 자바, 쉽게 정리하기 - item 49. 매개변수가 유효한지 검사하라
이펙티브 자바, 쉽게 정리하기 - item 49. 매개변수가 유효한지 검사하라 오류 검사의 일반 원칙1: 오류를 즉시 잡아라 "오류는 가능한 한 빨리 발생한 곳에서 잡아야 한다." 오류를 발생한 즉시 잡지 못하면 해당 오류를 감지하기도 어렵고, 정확히 어디서 발생했는지 알기도 어렵다. 다양한 매개변수 검사 예시 (가장 간단한 원칙) 인덱스 값은 음수이면 안 된다. 객체 참조는 null 이 아니어야 한다. 매개변수 검사를 제대로 하지 못했을 때 벌어지는 일 메서드가 수행되다가 모호한 예외를 던지며 실패한다. 메서드가 잘 수행되지만 잘못된 결과를 반환한다. 메서드에서 사용한 다른 객체를 이상한 상태로 만들어 미래의 알 수 없는 시점에 문제가 발생한다. 아래 단계의 현상일수록 문제는 더욱 심각해진다. 예외의 ..
이펙티브 자바, 쉽게 정리하기 - item 48. 스트림 병렬화는 주의해서 적용하라
이펙티브 자바, 쉽게 정리하기 - item 48. 스트림 병렬화는 주의해서 적용하라 자바 언어와 동시성 동시성 프로그래밍에서는 항상 앞서가있었다. 1996년부터 스레드, 동기화, wait/notify를 지원 자바 5부터 java.util.concurrent, Executor 등을 선도적으로 지원했다. 자바 7부터 fork/join 패키지를 추가 자바 8부터 병렬 스트림을 지원 스트림에서는 parallel()을 통해 손쉽게 동시성을 제공했다. 동시성 주의점 안전성(safety) 과 응답 가능(liveness) 메르센 소수 구하기 예제로 parallel() 문제 살펴보기 메르센 소수란 2의 n승 빼기 1로 표현되는 소수를 말한다. @Test public void mersenne() { primes() .ma..
SQLite 직접 만들어보기 Step 0 - SQLite 아키텍처 살펴보기
SQLite 직접 만들어보기 Step 0 - SQLite 아키텍처 살펴보기 SQLite 아키텍처 다이어그램 개요 SQLite 의 동작을 간단히 설명하자면, SQL 텍스트 정보를 바이트 코드로 컴파일하고 가상 머신에서 바이트코드를 동작시킨다. sqlite3_prepare_v2() 는 인터페이스로 SQL 텍스트를 바이트코드로 변환시키는 컴파일러 역할을 한다. sqlite3_stmt 객체는 단일 SQL 문을 구현하는 바이트코드 프로그램에 대한 컨테이너이다. sqlite3_step() 인터페이스는 바이트코드 프로그램을 가상머신으로 넘기고 프로그램이 완료될 때까지 실행한다. 완료의 의미는 아래 3가지 중 하나이다. 결과를 반환한다. 에러를 던진다. 인터럽트 된다. 인터페이스 (Interface) 아키텍처 그림에서..