본문 바로가기
  • 개발하는 곰돌이

Programming Language/Kotlin & Java28

[Kotlin/Java] JUnit을 사용한 단위 테스트에서 System.in을 사용하는 콘솔 입력 로직 테스트하기 목차 들어가기 전에 간단한 토이 프로젝트를 진행하던 중에 콘솔을 통해 사용자로부터 값을 입력받아서 처리하는 로직을 구현하게 되었다. 이 로직을 테스트하기 위해 단순히 IDE로 프로젝트를 실행해서 돌려볼 수도 있었지만 입력받아서 처리하는 로직만 테스트를 하고 싶었기 때문에 단위 테스트로 구현하고자 했다. 그런데 그냥 평범하게 콘솔 입력을 하면 되겠지라는 생각과는 달리 단위 테스트에서는 콘솔 입력을 사용할 수 없었다. 하지만 단위 테스트에서도 콘솔로 입력하지 않을 뿐이지 표준 입력을 사용하는 로직을 테스트하는 방법을 찾을 수 있어서 정리해두려고 한다. 테스트를 하려는 기능 fun readConfig() = System.`in`.bufferedReader().run { val host = input("Host.. 2023. 12. 7.
[Java] UnmodifiableList는 진짜 불변 리스트가 아니다 목차 들어가기 전에 불변성이 강조되는 객체지향 프로그래밍의 특성상 자바에서도 UnmodifiableList라는 클래스가 존재한다(물론 List 뿐만 아니라 Map과 Set도 존재한다). UnmodifiableList라는 이름에 걸맞게 add(), set(), remove() 등 리스트의 내부가 변경되는 메소드를 사용하면 바로 예외가 터져버린다. 그런데 이 UnmodifiableList는 불변성을 보장하는 진짜 불변 리스트가 아니다. 이에 대해 알아보자. 이하의 모든 내용은 Map과 Set에도 동일하게 적용된다. UnmodifiableList 객체 선언 UnmodifiableList 객체는 다음과 같이 Collection.unmodifiableList()를 사용하여 선언할 수 있다. List unmodif.. 2023. 8. 15.
[Java] Java 14부터 추가된 Record 타입과 Kotlin의 Data Class 비교 목차 들어가기 전에 자바 14부터 코틀린의 Data 클래스와 유사한 Record라는 클래스가 추가되어 자바 16에서 정식으로 지원되기 시작했다. 그동안 자바에서 DTO 등의 클래스를 만들 때는 Lombok의 도움을 받아 @Data 어노테이션을 붙이는 경우가 많았지만 Record 클래스가 추가되어 이러한 필요성이 줄어들게 되었다. 하지만 자바의 Record 클래스와 코틀린의 Data 클래스는 비슷하지만 다른 점이 있다. 이에 대해 정리해본다. Record 클래스의 기본 구조와 사용법 Record 클래스는 아래와 같은 구조로 선언된다. public record Member( String account, String name, int age ) { ... } 클래스 명 뒤에 소괄호로 메소드의 파라미터를 지정하.. 2023. 6. 14.
[Kotlin] 확장 함수와 람다를 사용해서 중복 코드를 제거해보자! 목차 확장 함수 확장 함수는 특정 타입에 실제로 존재하는 메소드는 아니지만, 해당 타입의 메소드 처럼 사용할 수 있는 함수이다. 예를 들어, 문자열의 \(i\)번째 문자와 \(j\)번째 문자를 맞바꾼 새로운 문자열을 반환하는 확장 함수는 아래와 같이 작성할 수 있다. fun String.swapChar(i: Int, j: Int): String { val sb = StringBuilder(this) sb[i] = this[j] sb[j] = this[i] return sb.toString() } 여기서 String.은 String 타입에 대한 확장 함수라는 것을 나타내며 확장 함수 내부의 this는 이 확장 함수를 사용하는 객체를 의미한다. 이렇게 작성한 확장 함수는 다음과 같이 사용할 수 있다. fun.. 2023. 5. 8.
[Java/Kotlin] 필드(Field)와 프로퍼티(Property)는 무슨 차이가 있을까? 목차 들어가기 전에 처음 코틀린에 대해 공부하기 시작하면서 프로퍼티에 대한 내용을 다룰 때 좀 혼란스러운 느낌이 있었다. 자바 클래스의 필드를 이야기하는 것 같다가도 조금 다른듯한 느낌이었기 때문이다. 그래서 당시에는 그냥 어차피 비슷한 개념이고, 언어마다 명칭이 다른가보다 하면서 코틀린 클래스의 프로퍼티 = 자바 클래스의 필드의 느낌으로 인식하고 사용했다. 그러다가 최근에 객체지향의 사실과 오해(조용호 저)에 대한 스터디를 진행하면서 프로퍼티라는 단어가 나와서 이야기를 조금 했었는데, 비슷한 개념인 것은 맞지만 다른 점이 있다는 이야기를 들어서 확실하게 정리해야겠다는 생각이 들었다. 필드(Field)와 프로퍼티(Property) 결론부터 말하자면 프로퍼티는 객체가 갖는 상태와 같은 속성이고, 필드는 프.. 2023. 5. 2.
[Kotlin] Java와 Kotlin, 그리고 Lombok 목차 Java에서의 Lombok 자바에서는 기본적으로 클래스의 Getter, Setter, 생성자를 비롯한 기본적인 메소드나 Builder 패턴 등의 디자인 패턴을 개발자가 직접 작성하거나 IDE의 도움을 받아 작성해야 한다. 그런데 클래스에 새로운 필드를 추가하거나 기존 필드를 삭제하면 기존의 코드에도 영향을 주게 되어 굉장히 번거롭다. 이러한 번거로움을 Lombok이 등장하면서 덜어주게 되었다. 추가하고자 하는 기능에 대한 어노테이션만 추가해 놓으면 코드를 작성할 땐 클래스의 필드에 변경이 일어나더라도 전혀 신경 쓰지 않고 사용할 수 있게 된 것이다. 이러한 편의성으로 인해 자바를 이용한 개발에서 Lombok은 뗄 수 없는 관계라고 볼 수도 있을 것이다. Kotlin과 Lombok 코틀린은 클래스의 .. 2023. 4. 21.
[Kotlin] 불변 컬렉션과 가변 컬렉션 목차 서론 코틀린의 컬렉션은 기본적으로 자바의 그것을 그대로 사용하지만 불변 컬렉션과 가변 컬렉션으로 구분된다는 차이가 있다. 물론 자바에서도 불변 컬렉션을 만드는 것이 불가능하진 않지만 불변이라는 것을 컴파일 타임에 검증할 수 없고, 만드는 것도 조금 번거롭기 때문에 완전하다고 보기는 어렵다. 이 글에서는 코틀린의 불변 컬렉션과 가변 컬렉션에 대해 다룬다. 컬렉션(Collection)? 컬렉션은 수집이라는 단어 의미 그대로 다수의 객체를 수집해놓은 객체라고 볼 수 있다. 컬렉션은 크게 리스트(List), 집합(Set), 맵(Map)으로 나눌 수 있다. List : 인덱스를 통해 요소에 접근할 수 있는, 순서가 보장된 컬렉션. 중복 요소가 허용된다. 스택과 큐, 덱 등의 자료구조도 큰 의미에서 리스트에 .. 2023. 4. 18.
[Java] HashMap vs Hashtable(feat. ConcurrentHashMap) 목차 서론 스터디를 진행하던 도중 Hashtable에 대한 이야기가 조금 나왔었다. 사실 이전까진 Hashtable이라는 것이 있다는 것만 알고 Map의 구현체로 대부분 HashMap을, 아주 가끔 TreeMap을 사용했는데, Hashtable은 HashMap과 비슷하게 Key - Value 쌍의 Map 구현체인 것은 동일하지만 세부적인 내용에서 차이가 있는 구조라고 한다. 이 글에서는 HashMap과 Hashtable의 차이에 대해 조금 다뤄보려고 한다. HashMap HashMap은 자바 1.2에서 등장한 Map 인터페이스의 구현체이다. 기본적으로 HashMap은 동기화를 지원하지 않기 때문에 다중 스레드 환경에서는 동시성 이슈가 발생할 수 있다. 이러한 이유로 인해 HashMap에서는 연산 도중 M.. 2023. 3. 27.