제네릭 파헤지기의 마지막 보스몹 제네릭 와일드카드(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..
암/복호화 처리가 필요해서 pip 로 pycrypto 를 설치했다. pip install pycrypto 그런데 아래와 같은 에러가 발생했다. 에러 1. Microsoft Visual C++ 14.0 error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/ 에러 문구와 같이 친절하게 설치 링크가 나와있다. 해당 링크로 이동해보면 상단에 'Build Tools 다운로드' 버튼으로 인스톨러를 다운받아서 설치 가능하다. https://visualstudio.microsoft.com/ko/v..
'Levenshtein Distance 알고리즘'과 '한글 초성, 중성, 종성 분리'에 대해서 다뤘었는데요. 이 두 내용을 결합해서 Levenshtein Distance 알고리즘에서 한글을 사용할 수 있게 변경해보려해요. 우선 Levenshtein Distance 에서 한글을 썼을 때 문제가 되는 부분은 '수정(modify)' 연산인데요. 영어 알파벳과 달리 한글은 초성, 중성, 종성으로 이루어져있기 때문이예요. '햇볕' -> '해변' 으로 수정하는 비용과 '태양' -> '기차' 로 수정하는 비용을 서로 다르게 보는거죠. 그래서 기존 Levenshtein Distance 알고리즘의 수정연산에서 한글 글자를 초성, 중성, 종성으로 분리해서 얼만큼 바꿔야하는지 비용을 계산하는 부분이 새로 추가된다고 보시면 ..
개발하면서 한글 문자를 초성, 중성, 종성으로 분리해야할 필요가 생겼는데요. 구글링하면서 알게된 내용을 정리해보려해요. 우선 한글은 유니코드라는 글로벌하게 약속된 체계에 의해 고유한 식별값이 부여되어 있는데요. '가' 라는 글자는 44032 이고, '힣' 이라는 글자는 55203 으로 할당되어 있어요. 그런데 이 식별값이 그냥 부여된 게 아니라는 것이 중요한 포인트입니다. 바로 완전한글 결합공식 에 의해 생성된 식별값이였던거죠!!! (초성 인덱스 * 21 + 중성 인덱스) * 28 + 종성 인덱스 + 0xAC00 0xAC00(44032) 은 유니코드 체계에서 한글이 시작되는 지점으로 '가' 를 나타내요. 위 공식에 쓰이는 초성, 중성, 종성 배열은 아래와 같아요. 초성 배열(19개) "ㄱ", "ㄲ", "..