Processing math: 100%
본문 바로가기
  • 개발하는 곰돌이

Programming Language35

[Kotlin] Kotest를 사용해서 코틀린스러운 테스트 코드를 작성해보자! 목차들어가기 전에보통 자바 + 스프링 환경에서 테스트 코드를 작성할 때는 JUnit을 많이 사용합니다. 스프링부트에서 기본적으로 제공하는 테스트 프레임워크가 JUnit이기도 하고, 오랫동안 사용되다 보니 레퍼런스도 풍부해서 자연스럽게 JUnit을 사용해서 테스트 코드를 작성하는 경우가 많죠. 코틀린을 사용할 때는 코틀린에 특화된 테스트 프레임워크인 Kotest를 사용할 수도 있습니다. Kotest는 더 직관적이고 코틀린스러운 테스트 코드를 작성할 수 있다는 장점이 있죠. 이번 글에서는 Kotest에 대해 정리하겠습니다.Kotest?Kotest는 JUnit을 환경에서 실행되는, 코틀린에 특화된 테스트 프레임워크입니다. 코틀린 전용의 JUnit 확장판이라고도 볼 수 있죠. JUnit과는 달리 어노테이션을 사.. 2025. 7. 7.
[OOP] 일급 컬렉션(First Class Collection)으로 컬렉션을 다뤄보자 목차들어가기 전에컬렉션은 굉장히 유용하고 그만큼 많이 사용되는 자료구조 인터페이스지만 그 자체로도 많은 기능을 구현할 수 있다. 이렇게 유용한 컬렉션을 일급 컬렉션(First Class Collection)으로 사용한다면 이미 강력한 기능을 갖고 있.. 2024. 4. 15.
[OOP] 원시 타입을 Wrapper Class로 포장해보자(Value Object) 목차 들어가기 전에 주의! 이 글에서 다루는 Wrapper Class는 일반적으로 자바에서 이야기하는 Integer, Double, Long 등과 같이 원시 타입에 대응하는 클래스가 아니라 개발자가 필요에 의해 작성한 별도의 클래스를 이야기 합니다. 여러 클래스들을 작성하다 보면 숫자 등의 원시 타입 멤버 변수들을 추가하는 경우가 매우 많다. 이러한 멤버 변수들은 클래스의 성질을 나타내기 위해 반드시 필요한 존재들인데 원시 타입 멤버 변수를 Wrapping(포장)해주는 클래스를 작성해서 사용한다면 몇가지 부가 효과를 얻을 수 있다. 이렇게 작성된 Wrapper Class의 객체를 값 객체(VO : Value Object)라고 한다. Wrapper Class를 사용하면 얻을 수 있는 장점을 정리해본다. 원.. 2024. 3. 18.
[Kotlin/Java] JUnit을 사용한 단위 테스트에서 System.in을 사용하는 콘솔 입력 로직 테스트하기 목차 들어가기 전에 간단한 토이 프로젝트를 진행하던 중에 콘솔을 통해 사용자로부터 값을 입력받아서 처리하는 로직을 구현하게 되었다. 이 로직을 테스트하기 위해 단순히 IDE로 프로젝트를 실행해서 돌려볼 수도 있었지만 입력받아서 처리하는 로직만 테스트를 하고 싶었기 때문에 단위 테스트로 구현하고자 했다. 그런데 그냥 평범하게 콘솔 입력을 하면 되겠지라는 생각과는 달리 단위 테스트에서는 콘솔 입력을 사용할 수 없었다. 하지만 단위 테스트에서도 콘솔로 입력하지 않을 뿐이지 표준 입력을 사용하는 로직을 테스트하는 방법을 찾을 수 있어서 정리해두려고 한다. 테스트를 하려는 기능 fun readConfig() = System..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.
[OOP] Getter와 Setter는 지양하는게 좋다 목차 들어가기 전에 얼마 전 사내에서 Getter와 Setter를 함부로 사용하면 안되는 이유에 대한 세미나가 있었다. Setter에 대한 이야기는 워낙 많이 알려져있었지만 Getter에 대한 이야기는 잘 하지 않다보니 꽤 흥미로운 주제였다. 그렇다면 왜 Getter와 Setter를 함부로 사용하면 안될까? 이 이유를 한 번 알아보자. Getter와 Setter를 사용하는 이유 객체 지향의 원칙 중 하나는 정보 은닉(Information Hiding)이다. 객체의 구체적인 정보를 외부에 노출하지 말라는 것이다. 이러한 이유 때문에 자바에서는 클래스를 작성할 때 모든 필드를 private으로 숨기고 public 메소드를 통해 간접적으로 필드를 다루게 된다. 코틀린의 경우에는 프로퍼티를 private으로 숨.. 2023. 6. 7.
[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.