Java & Kotlin
-
과거의 나에게...(와인 검색 서비스 회고)Java & Kotlin 2021. 10. 2. 01:39
1) 서론 이 글은 약 1년 전, 학생 때 만든 "와인 검색 서비스"의 회고(변명) 글입니다. 머릿속으로 대략 생각하면서 작성했습니다. 조만간 시간이 나면, 실제로 리팩토링 진행해볼 예정입니다. 저는 이상하게 새로 무언가를 만드는 것보다, 리팩토링을 통해서 더 좋은 코드와 성능 향상에 관심이 많습니다. 당시에 만든 서비스와 글은 아래와 같습니다. https://yeon-kr.tistory.com/131?category=868421 전체적인 내용(변명)은 "그때는 그게 최선이었다. 그것밖에 몰랐다"라고 할 수 있을 듯합니다... 과거의 나야... 제발 무전받아... 그렇게 하는 거 아니야... 2) 와인 검색 서비스... 패기는 좋았다! 사용된 기술 스프링 프레임워크 (boot X) JSP + JavaSc..
-
(Java)primitive, reference 타입Java & Kotlin 2021. 8. 26. 18:28
1) 서론 primitive, reference 타입은 개발을 공부했거나 컴퓨터공학과 수업을 들었다면, 당연히 알 수 있습니다. 하지만 막상 면접 때 질문을 받으니 머릿속에서 정리가 안 되는 경험을 했습니다. "긴장을 했기 때문"이라는 좋은 핑계가 있지만, 아무리 긴장을 해도 그 순간 바로 대답하지 못했다는 것은 제대로 알지 못했기 때문이라고 생각합니다. 그래서 이번 기회에 제대로 한번 정리해보려고 합니다. 2) primitive type 먼저 늘 그렇듯 영어의 의미를 알아야 합니다. primitive는 "초기의, 원시의"라는 의미입니다. 자바 언어에서는 primitive는 사전에 정의된 예약 키워드입니다. 즉 그 말은 변수명, 메서드명 등으로 사용할 수 없습니다. 자바에서는 아래와 같이 8개의 prim..
-
[Lombok]@Builder과 생성자 애노테이션Java & Kotlin 2021. 8. 8. 16:16
서론 Lombok에서는 @Builder, @AllArgsConstructor, @NoArgsConstructor, @RequiredArgsConstructor와 같이 빌더와 생성자를 쉽게 만들어 주는 애노테이션들이 있습니다. 하지만 무작정 사용하게 되면 명확하지 않고, 에러를 발생시킬 수도 있습니다. 그래서 이 글에서는 해당 애노테이션들의 역할과 차이점에 대해서 작성하고, 발생할 수 있는 에러에 대해서 정리하려고 합니다. 생성자 애노테이션 1. @NoArgsConstructor 파라미터가 없는 기본 생성자 final 필드 포함 X 자바에서는 파라미터가 존재하는 생성자를 만들 경우 반드시 파라미터가 없는 기본 생성자를 작성해야 합니다. 이때 @NoArgsConstructor를 사용하여 편리하게 생성자를 작..
-
Lambda(람다) 표현식 적용하기Java & Kotlin 2021. 6. 28. 20:09
1. Lambda Expression? 오라클 공식 문서에서는 아래와 같이 설명하고 있습니다. "Lambda expression(이하 "람다식"이라 한다)은 메서드와 비슷합니다. 람다식은 알맞은 형식의 parameters의 목록과 이 parameters로 표현된 body를 제공합니다." "람다식의 값은 functional interface(이하 "함수적 인터페이스"라 한다)의 인스턴스를 생성한다"라고 합니다. 즉 람다식은 기본적으로 메서드처럼 파라미터를 받아, body를 구현합니다. 하지만 이는 함수적 인터페이스의 인스턴스를 생성하는 데 목적이 있습니다. 모든 메서드를 람다식으로 표현을 하는것이 아니라는 것을 알 수 있습니다. 그렇다면 여기서 말하는 "함수적 인터페이스"는 뭘까요? 2. Functiona..
-
Java 불변 객체 - Immutable ObjectJava & Kotlin 2021. 4. 24. 13:57
1. 서론 자바의 객체를 불변 객체로서 보호하는 방법입니다. 2. 불변 객체란 (Immutable Object) 객체가 불변하다는 것은 생성된 이후에 변하지 않는 것을 의미합니다. 아마도 자바 언어를 처음 배울 때 쓰레드 공유를 통해서 은행에 잔고를 확인하는 코드는 익숙하실 것 같습니다. 쓰레드 동기화 기능을 사용하지 않으면, 동시에 여러 곳에서 잔고를 빼가고 잔액이 마이너스를 기록하는 것을 볼 수 있는데요. 불변 객체도 비슷합니다. 결국에는 여러 곳에서 참조를 많이 하는, 동시적으로 이벤트가 발생하는 애플리케이션에서 변하지 않는 값을 가질 때 사용될 수 있습니다. 하지만 당연히 불변 객체의 단점도 있겠죠? 생성할 때 초기값이 아닌, 새로운 값을 입력하려면 새 객체를 만들어야 합니다. 그만큼 자원의 소모..
-
(Java)for문 / Collection.size() 성능 개선Java & Kotlin 2021. 4. 4. 03:07
1. 문제 크롤링한 데이터를 배열에 임시 저장 후 다시 꺼내서 DB에 저장하는 for문 입니다. 이때 데이터의 개수는 약 800개가 되고, 평균 131초가 걸립니다. 어떻게 단축 할까요? 2. 연구 for loop안에서 size() 메서드를 계속해서 호출하게 되면, 해당 List 사이즈를 계속 해서 측정 후 돌려주는 연산이 일어납니다. 즉 JVM의 overhead가 발생하게 됩니다. 하지만 두번째 코드에서는 같이 for문 밖, 객체변수에 size()을 할당합니다. 즉 List의 size를 측정하는 size() call이 한 번만 발생합니다. 최초에 측정한 사이즈를 가지고 그대로 사용하게 됩니다. 실제로 측정해봤습니다. 약 800개 데이터, 3회 평균 측정 시간 입니다. 각각 131571ms, 119916..
-
(java)String vs StringBuilder 수행 시간 차이Java & Kotlin 2021. 3. 28. 18:14
1. 서론 일반적으로 문자열을 저장할 때 String 클래스를 사용합니다. 하지만 이미 저장된 String 문자열에 반복적으로 추가 저장할 때도 좋은 방법일까요? 2. String - Immutable Object String은 불변(immutable) 객체입니다. 불변하다는 것을 어떤 의미일까요? 불변하다는 것은 만들어진 상태 그대로 상수로서 존재합니다. 즉 객체로서 생성된 후 상태를 변경하지 못합니다. 그렇다면 이미 만들어진 String 객체에 추가적인 데이터를 저장할 때는 어떻게 될까요? 이때는 메모리에서 추가 공간을 할당해 새 객체를 만듭니다. 즉 추가적이 메모리 주소의 할당이 발생합니다. 같은 참조 변수를 사용하더라도 메모리를 추가로 할당해야 합니다. 예를 들어 String hello1 = ne..
-
(Java)파사드 디자인 패턴 - Facade Design PatternJava & Kotlin 2021. 3. 28. 15:53
1. 서론 자바를 이용해 개발할 때 Slf4j를 구현한 Log4j2를 많이 사용합니다. 이때 Slf4j 공식 문서를 보면, 'Facade Pattern'을 이용했다고 합니다. 그래서 Log4j2가 이를 구현해 사용한다고 하는데요. 그래서 Facade Pattern은 뭘까요? 2. 영어사전의 정의 영어는 영어로서 먼저 받아드려야 한다고 생각합니다. 해당 단어의 사전적 의미를 먼저 파악 후 프로그래밍적 측면으로 바라보면 좀 더 쉽다고 생각합니다. 빌딩의 표면, 특히 거리 혹은 열린 공간을 바라보고 있는 주요한 정면이 덜 좋거나 칭찬할만한 현실을 감추는데 사용하는 바깥을 바라보는 표면 사전에는 위와 같이 정의되어 있습니다. Origin을 보게 되면 French의 face라는 단어에서 왔다는 것을 알 수 있습니..