Java & Kotlin
-
인터페이스의 default, static 메소드Java & Kotlin 2021. 10. 6. 00:37
1) 서론 창피하지만, 최근 이펙티브 자바를 읽으며 인터페이스에 default, static 메서드가 된다는 것을 알았습니다. JDK 17이 나오는 시점에서 JDK 8 조차 제대로 업데이트되지 않은 채 "그게 돼?" 라는 충격에 빠졌습니다. 그래서 이번 기회에 해당 메서드들이 왜 만들어졌고, 어떻게 사용되는지 공부해봤습니다. 2) default / static 메서드 원래 인터페이스는 추상 메서드만 사용 가능했었습니다. 여기서 추상메서드란 구현부가 없는, 아직 완성되지 않은 메서드인데요. 왜 추상메서드만 허용을 했었는가에 대한 명확한 설명은 없지만, 오라클 공식문서를 참고하면 오라클이 인터페이스를 어떻게 바라보고 있는지 조금은 알 수 있습니다. 오라클 공식문서에서는 인터페이스를 자동차 산업의 표준이 되는..
-
과거의 나에게...(와인 검색 서비스 회고)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..