Spring이 제공하는 IOC Container을 만드는 방법Spring에서는 IOC Container을 만들기 위해 다양한 방법을 제공한다. Annotation을 기반으로 동작하는 IOC Container을 만들 수도 있고, xml을 기반으로 동작하는 IOC Container을 만들 수도 있다. 하지만 xml을 기반으로 동작하는 IOC Container은 이제는 거의 사용되지 않기 때문에 이번 글에서는 Annotation을 기반으로 동작하는 IOC Container을 만드는 방법을 살펴본다. Annotation을 기반으로 동작하는 IOC Container 만들기Annotation을 기반으로 동작하는 IOC Container는 AnnotationConfigApplicationContext 라는 클래스를 ..
Kotlin
느슨한 결합의 장점느슨한 결합을 사용하게 됐을 때의 장점은 크게 다음 두가지가 있다.1. 변경 혹은 리펙토링이 편해진다.2. 컴파일 타임의 최소화 지금부터 각각이 무엇을 뜻하는지 알아보자. 1. 변경 혹은 리펙토링이 편해진다.클래스만을 사용해 구현을 하게 되면, 해당 클래스의 역할이 처음에 생각했던 범위를 넘어서는 일이 자주 생긴다.예를 들어 검색을 하는 클래스와 검색 결과 상태를 저장하는 클래스가 분리되어 있다고 하고, 검색을 하는 클래스는 검색 결과 클래스에 의존성이 있기 때문에 이 상태값을 알 수 있는 상황을 가정해보자. 누군가 검색 결과 상태를 검색을 하는 클래스로부터 가져올 수 있으니 검색을 하는 클래스로부터 검색 결과를 가져오는 로직을 추가하게 되면 검색을 하는 클래스는 졸지에 검색 결과 상태..
자바의 Record 클래스 Java 14부터 Record라 불리는 데이터를 저장하는 클래스가 도입됐다. 이 Record는 코틀린의 Data class와 매우 유사한 기능으로, 'record' 키워드로 선언된 클래스는 equals, hashCode, toString 함수를 자동으로 생성한다. 예를 들어 다음과 같이 생성된 record 클래스 Blog가 있다고 해보자. *아래 코드는 Java이다. public record Blog(String name, int age) { } 이 Blog 클래스는 이름(name)과 생긴 후 지난 날짜(age)를 인자로 받는다. 이제 이 record 클래스가 어떻게 동작하는지 확인하기 위해 다음과 같이 코드를 만들어보자. public class Main { public st..
Cannot check for instance of erased type: T 오류는 왜 발생할까? JVM은 제네릭 타입을 실행 시점에 지원하지 않기 때문에, 자바의 제네릭과 마찬가지로 코틀린의 제네릭 또한 컴파일 타입에 타입 지워짐(Type Erasure)이 발생한다. 이 때문에 제네릭을 사용하는 일반 함수에서는 함수 본문에서 제네릭 타입을 이용해 연산을 할 수 없다. 예를 들어 다음과 isType 함수를 살펴 보자. fun isType(value: Any): Boolean { return value is T } 이 함수는 겉보기에는 문제가 없어 보인다. 하지만, T라는 타입은 컴파일 시점에 지워지고, 실행 시점에는 T가 무슨 타입인지 알 수 없기 때문에 다음과 같은 오류가 발생한다. Cannot ch..
함수의 매개 변수로 람다식을 받을 경우의 문제 일반적으로 함수를 호출하면 해당 함수가 서브루틴으로써 실행된다. 반면 inline fun으로 선언된 함수를 호출하면, 함수 호출을 실행하는 것이 아니라 해당 함수가 호출된 위치에 함수 내부의 코드가 삽입돼 실행된다. 예를 들어 다음과 같은 코드가 있다고 해보자. fun main(args: Array) { printWorldAfterFunction { println("Hello") } } fun printWorldAfterFunction(function: () -> Unit) { function() println("World") } 이 코드에서 printlnWorldAfterFunction 함수를 () -> Unit 타입의 람다식과 함께 실행하면, () -> ..