비트연산자 자바에서 , >>>는 비트연산자 기호이다. 비트연산자란 char, byte, short, int, long 등과 같은 자료형에서 해당 값을 비트로서 연산하는 기능을 수행한다. 비트연산자의 개념에 대해 다루려는 것이 아니므로 아래의 표만 첨부한다. 비트연산자 , >>>의 활용 1은 low + (high - low) / 2 와 같은 의미를 가진다. 만약 int mid = (low + high) >> 1 라고 사용했다면 (high + low) / 2 와 같은 의미를 가질 것이다. >>>와 >>의 차이를 알아보기 전에 low + (high - low) / 2와 (high + low) / 2의 차이를 먼저 알아야 한다. 한 줄로 요약하자면 (high + low) / 2를 사용하면 overflow가 발생..
자바에는 다음과 같은 3종류의 변수가 존재한다. 변수의 종류와 상관없이 모든 객체는 heap 영역에 저장된다는 설명은 아래에서 생략한다. 전역 변수 자바에는 엄밀히 말해서 전역 변수 (Global Variables)는 존재하지 않는다. 대신 전역 변수를 사용하기 위해서는 class는 public으로 변수에는 public static 키워드를 사용하여 선언하여 사용한다. static으로 선언된 변수는 클래스가 어떤 방식으로든 한번 선언된 이후에 메모리에 적재되고 그 이후에 애플리케이션이 종료될 때까지 메모리에 존재하게 된다. (애플리케이션을 맨 처음에 실행했을때 메모리에 적재되는 것이 아니다.) 이를 통해 전역 변수'처럼' 사용할 수 있게 구현할 수 있다. 자바 8 이전에는 PermGen 영역(a.k.a ..
자바 8 람다, 스트림 Optional 키워드 사용 가능 Date와 Time API 자바 11 인터페이스에 private 메서드 가능 (자바 9) 이외에 컬렉션, 스트림, Optional에 몇몇 메서드 추가 (자바 9) G1 GC가 디폴트 GC로 설정 (자바 9) var 키워드 사용 가능 (자바 10) OpenJDK가 Oracle JDK로 통합됨 자바 17 record 키워드 사용 가능 (자바 14) NullPointerException이 어떤 변수에 의해 발생했는지 설명 (자바 14) sealed 키워드 사용 가능 (자바 15) ZGC 도입 (자바 15) 각 버전별 상기 내용 이외에도 많은 기능이 추가되었지만 중요하다 생각되는 내용만 정리하였음. 레퍼런스 https://intrepidgeeks.com/..
직렬화 직렬화란 서로 다른 머신(PC, 스마트폰 등)끼리 객체를 주고받기 위한 방법으로 객체를 바이트스트림으로 변환하여 네트워크를 통해 데이터를 주고받는 것이 가능해진다. 직렬화의 필요성 CPU나 RAM과 같은 리소스를 공유하는 하나의 머신 내에서 객체를 주고받아야 한다고 가정해보자. 이때 객체는 프로세스 RAM의 힙 영역에 저장되어 있고 프로세스의 RAM은 OS의 커널에서 가상화하여 제공한 것이므로 커널의 IPC를 통해 해당 값에 쉽게 접근하여 사용할 수 있다. 단지 메모리 주소를 아는 것만으로도 객체에 접근이 가능하다는 뜻이다. 하지만 리소스를 공유하지 않는 서로 다른 머신에서 네트워크를 통해 객체를 주고받아야 한다면 어떻게 해야할까? 메모리의 주소값을 주고받더라도 해당 주소값은 서로 다른 머신끼리는..
현재 인터넷상의 URI를 중요도가 아닌 사용 빈도로 나눠 pseudo 그림으로 나타내자면 다음과 같다. 식별할 수 있는 어떤 값이든 URI가 될 수 있지만 식별이 가능하다고 해서 해당 URI가 가르키는 자원에 곧바로 접근이 가능한 것은 아니다. URN urn:isbn:0-486-27557-4은 URI이면서 URN이지만 URL은 아니다. 이름을 통해 해당 URN이 로미오와 줄리엣이라는 도서를 나타내는 URI라는 것은 알았지만 URI나 URN을 알았다고 해서 실제로 존재하는 어떤 자원에 접근할 수는 없기 때문이다. URN의 문법은 여기에서 확인할 수 있다. 'URN 문법'의 URL은 https://datatracker.ietf.org/doc/html/rfc2141 이지만 'URN 문법'의 URN은 RFC 2..
트랜잭션 격리 수준 트랜잭션의 격리 수준은 A라는 트랜잭션이 수행되고 있을때 B라는 트랜잭션에서 A가 다루고 있는 내용을 변경하거나 조회할 수 있도록 설정하는 것을 의미한다. 트랜잭션이 보장하는 ACID 4가지 특성 중 Isolation(격리성)의 trade-off에 대해서 다루는 내용이다. 이때 트레이드오프하는 두 가지 요소는 격리성과 동시성이다. 동시성이 높아지면 성능은 높아지지만 데이터의 정합성이 낮아지고 격리성이 높아지면 성능은 낮아지지만 데이터의 정합성이 올라간다. 격리 수준에는 아래와 같이 총 4가지 단계가 존재하며 옆의 숫자는 임의로 붙인 숫자로 높을수록 해당 기능이 강화된다. 동시성 3 격리성 0 (READ UNCOMITTED) WRITE-LOCK X READ-LOCK X CRUD 전부 가..
배치 잡을 사용해보며 해당 시간이 되면 task를 수행하는 daemon이 내부적으로 어떻게 동작하는지 궁금해졌다. infinite while loop를 돌며 cpu와 같은 리소스를 지속적으로 사용하는 것인지 아니면 다른 방법을 통해 최적화가 되어있는지 알고 싶었다. 결과적으로 말하자면 데몬의 종류는 여러 가지이며 크게 주기적으로 깨어나는 데몬(dcron)과 다음에 깨어나야할 시간을 계산 후에 sleep하는 데몬(fcron) 등이 있다. 두 종류의 데몬 모두 sleep()을 적극적으로 활용하여 cpu 사용량을 최소화시키는 최적화가 되어있었다. dcron Dillon's cron daemon, 줄여서 dcron이라 불리는 데몬은 최대 60초마다 한번씩 sleep()에서 깨어나 .crontab으로 구현된 cr..
정규표현식은 주어진 String에서 주어진 패턴에 맞는 캐릭터만 골라내는 검색 엔진이라 표현할 수 있다. 이때 정규표현식의 내부는 유한 오토마타로 구현되어있다. 내부 동작 먼저 정규표현식은 내부적으로 언어마다의 세부적인 문법 차이를 제외하고 대부분 비슷하게 구현되어있다. 패턴과 String이 주어지고 String의 왼쪽부터 시작하여 오른쪽 방향으로 비교를 시작한다. 이때 String을 한 번에 캐릭터 하나씩 파싱하여 패턴과 비교하는데 이때 패턴에서도 왼쪽-오른쪽 방향으로 비교를 하며 나아간다. String의 인풋과 String의 패턴을 비교한다고 가정해보자. 먼저 String 첫번째 캐릭터와 패턴의 첫번째 캐릭터가 일치하면 두번째 캐릭터끼리 비교한다. 두번째 캐릭터가 일치하면 똑같은 비교가 쭉 이어지고 ..
본 게시물은 해당 블로그에서 레퍼런스를 번역한 자료임을 알립니다. 퍼가실때 해당 블로그의 주소는 밝히실 필요가 없으나 레퍼런스의 주소는 밝혀주시면 감사하겠습니다. 자바 9 버전 이후부터 G1 GC가 디폴트 GC로 설정되었다. (역주: 자바 8까지는 패러렐 GC가 디폴트였고 자바 18인 현재까지 G1 GC가 디폴트 GC로 사용된다. 만약 싱글 코어라면 시리얼 GC가 디폴트로 설정된다.) G1 GC는 자바 7에 처음 도입되어 다른 GC와는 다른 매우 큰 힙 영역을 효과적이면서 동시에 다루는데에 특화되어 있다. 또한 최대 중단 시간을 넘지 않도록 설정할 수 있다. G1 GC가 다른 GC와 어떻게 다르게 동작하는지 확인하고 또 어떻게 G1 GC가 어떻게 큰 크기의 힙 영역을 다룰 때 다른 GC를 압도하는지 알아..
본 게시물은 해당 블로그에서 레퍼런스를 번역한 자료임을 알립니다. 퍼가실때 해당 블로그의 주소는 밝히실 필요가 없으나 레퍼런스의 주소는 밝혀주시면 감사하겠습니다. 자바의 GC를 이용한 메모리 관리는 해당 언어가 이륙한 엄청난 성과 중 하나라 할 수 있다. GC는 개발자로 하여금 메모리 할당과 할당 해제를 걱정할 필요없이 새로운 객체를 생성할 수 있게 해주었는데, 이는 GC가 자동으로 메모리를 다시 회수해주기 때문이다. 메모리 누수와 다른 메모리 관련된 문제를 전혀 걱정할 필요없이 더 적은 보일러플레이트 코드를 작성하게 함으로써 더 빠른 개발을 가능하게 하였다. (이론적으로는) 아이러니하게도 자바의 GC가 일을 "너무" 잘 하는 바람에, 너무 많은 객체를 생성하고 제거한다. 덕분에 대부분의 메모리 관련 문..
- Total
- Today
- Yesterday
- ModelAttribute
- RequestBody
- neovim
- IDE
- Dap
- lunarvim
- 루나빔
- RequestParam
- vim
- RequestPart
- 아키텍처
- JavaScript
- 도커
- 배포
- 레디스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |