안녕하세요. 요즘 JVM Garbage Collector 에 대해 공부를 하면서 GC 알고리즘에 대해 알게되었는데요. 그러다 문득 JVM 버전마다 기본 GC 알고리즘이 무엇인지 궁금해졌어요. 그래서 구글링을 열심히 해보았는데 오라클 공식사이트에는 제대로 된 내용이 잘 안보이더라구요. 스택오버플로에서 정리해준 내용이 있긴 하지만 직접 눈으로 봐야 속이 시원하기 때문에 제 노트북 콘솔에서 확인해보려해요. 1. Hotspot JVM 설치 우선 오라클 홈페이지에서 Jdk 를 버전별로 다운받았어요. 그리고나서 각 Jdk 를 설치해주었어요. 설치를 완료하고나니 C:\Program Files\Java 경로에 아래처럼 폴더가 생겼어요. jdk 폴더를 기준으로 JVM GC 알고리즘을 확인해볼게요. 2. Hotspot J..
제네릭 파헤지기의 마지막 보스몹 제네릭 와일드카드(Generic Wildcard) 에 대해 알아보려해요. 가장 어려운 내용이지만 그래도 한 번 파헤쳐볼게요. 1. 공변성과 불공변성(무공변성) 제네릭 와일드카드 내용을 알아보기 이전에 공변(covariant) 과 불공변(invariant) 개념에 대해 알아야해요. A가 B의 하위타입일 때 T 가 T 의 하위타입이면 T는 공변이예요. A가 B의 하위타입일 때 T 가 T 의 하위타입이 아니면 T는 불공변이예요. 대표적으로 배열은 공변이고 제네릭은 불공변이예요. 먼저 배열 예제 코드를 살펴볼게요. public static void runCovariantArray() { Integer[] integers = new Integer[]{1, 2, 3, 4, 5, 6,..
자바 인터페이스에도 제네릭을 적용할 수 있는데요. 제네릭 클래스를 사용했던 것과 동일하게 인터페이스에 제네릭 타입을 선언해주면 되요. 그러면 한 번 알아볼게요. 1. 제네릭 인터페이스 선언 public interface BoxInterface { S getUniqueId(); } 제네릭 클래스와 동일하게 제네릭 타입을 선언해주면 되요. 선언한 제네릭 인터페이스를 클래스에서 구현해볼게요. public class BookBox implements BoxInterface { private S uniqueId; public BookBox(S uniqueId) { this.uniqueId = uniqueId; } @Override public S getUniqueId() { return this.uniqueId;..
이번에 파헤쳐 볼 녀석은 자바 제네릭 메소드(Generic Method) 예요. 제네릭 메소드라는 단어 자체가 생소한데요. 사실 저는 한 번도 써보지 않은 기능이예요. 그래도 제네릭을 파헤치기로 마음 먹은 이상 알아볼 필요는 있을 것 같아요. 그러면 제네릭 메소드 파헤치기 진행시켜! 1. 제네릭 메소드 선언 구조 제네릭 메소드 구조는 아래와 같아요. (public) (static) 리턴타입 함수명(제네릭타입1 변수1, 제네릭타입2 변수2, ...) { ... } 이렇게만 봐서는 잘 와닿지 않죠. 코드로 확인해볼게요. public static String createInfo(T price, U author) { ... } 이렇게 보니까 좀 편안하네요. 위의 제네릭 메소드 코드에서 낯설었던 부분은 함수 리턴..
스프링을 본격적으로 사용하기 시작한지도 4년이 다 되어 가네요. 그럼에도 여전히 볼 때마다 멈칫하게 되는 부분이 있어요. 바로 자바의 제네릭(Generic) 문법이예요. public interface MemberRepository extends CrudRepository { Optional findById(String id); Optional findByEmail(String email); Optional findByMemberNo(long memberNo); } 원래 쓰던대로 그러려니 하고 개발을 할 수도 있겠지만 마음 한구석 찜찜함은 가시질 않네요. 그래, 개발자라면 본인이 사용하는 문법에 대해 기본적인 내용은 알아야지..! 그래서 자바 제네릭을 파헤쳐보기로 마음먹었어요. 1. 제네릭은 왜 만들어졌을..
생성자나 정적 팩터리 메서드를 사용할 때 제약이 하나 있다. 선택적 매개변수가 많을 때 적절히 대응하기 어렵다는 점이다. 1. 점층적 생성자 패턴(telescoping constructor pattern) 식품 포장의 영양정보를 표현하는 클래스를 생각해보자. 영양정보는 소수의 필수항목과 다수의 선택항목으로 이뤄진다. 그런데 대부분 제품은 이 선택 항목중 대다수의 값이 그냥 0이다. 전통적으로 이러한 상황에서는 점층적 생성자 패턴(telescoping constructor pattern) 을 즐겨 사용했다. 필수 매개변수만 받는 생성자, 필수 매개변수와 선택 매개변수 1개를 받는 생성자, 선택 매개변수를 2개까지 받는 생성자, ... 형태로 선택 매개변수를 전부 다 받는 생성자까지 늘려가는 방식이다. pu..
1. 정적 팩터리 메서드란 클래스의 인스턴스를 얻는 전통적인 수단은 public 생성자다. 하지만 모든 프로그래머가 꼭 알아둬야 할 기법이 하나 더 있다. 바로 정적 팩터리 메서드(static factory method) 이다. 먼저 정적 팩터리 메서드로 인스턴스를 어떻게 얻는지 아래 코드를 보자. import lombok.Getter; @Getter public class JwtVo { private JwtHeaderVo header; private JwtPayloadVo payload; private JwtSignatureVo signature; private JwtVo(JwtHeaderVo header, JwtPayloadVo payload, JwtSignatureVo signature) { thi..
1. JVM 이란 Java Virtual Machine 은 하나의 개념, 즉 스펙이다. 정확한 설계도가 있는 것이 아닌 이렇게 해야 한다는 표준화된 정의만 존재한다. 그래서 JVM 벤더사들마다 이러한 표준에 맞게 자신들의 방식으로 엔진을 개발한다. 유명한 JVM 벤더사로는 Oracle, IBM 등이 있다. 2. JVM 구조 JVM 은 스펙이란 것을 알았으니 이 설계 스펙에 대해 알아보자. Java Source : 사용자가 작성한 Java 코드이다. (확장자 .java) Java Compiler : Java Source 파일을 JVM이 해석할 수 있는 Java Byte Code로 변경한다. Java Byte Code : Java Compiler에 의해 수행될 결과물이다. (확장자 .class) Class ..
개발하면서 한글 문자를 초성, 중성, 종성으로 분리해야할 필요가 생겼는데요. 구글링하면서 알게된 내용을 정리해보려해요. 우선 한글은 유니코드라는 글로벌하게 약속된 체계에 의해 고유한 식별값이 부여되어 있는데요. '가' 라는 글자는 44032 이고, '힣' 이라는 글자는 55203 으로 할당되어 있어요. 그런데 이 식별값이 그냥 부여된 게 아니라는 것이 중요한 포인트입니다. 바로 완전한글 결합공식 에 의해 생성된 식별값이였던거죠!!! (초성 인덱스 * 21 + 중성 인덱스) * 28 + 종성 인덱스 + 0xAC00 0xAC00(44032) 은 유니코드 체계에서 한글이 시작되는 지점으로 '가' 를 나타내요. 위 공식에 쓰이는 초성, 중성, 종성 배열은 아래와 같아요. 초성 배열(19개) "ㄱ", "ㄲ", "..