자바

    [Kotlin] inner class 를 통해 중첩 클래스에서 바깥쪽 클래스 참조하기

    자바의 중첩 클래스 문제와 코틀린의 중첩 클래스 자바에서는 내부에 선언되는 중첩 클래스에서 기본적으로 바깥쪽 클래스의 변수를 참조할 수 있었다. 예를 들어 다음과 같이 OuterClass와 InnerClass가 있는 경우 InnerClass의 함수인 getOuterClassValue에서 OuterClass의 변수인 outerClassValue를 참조할 수 있었다. public class OuterClass { String outerClassValue = "outerClassValue"; class InnerClass { String getOuterClassValue() { return outerClassValue; } } } 하지만, 이 방식은 내부의 클래스에서 항상 외부의 클래스에 대한 참조를 유지한다..

    [Kotlin] ReentrantLock 사용해 락 걸고 해제하기

    ReentrantLock 사용해 락 걸기 코틀린에서는 기본적으로 자바의 ReentrantLock 클래스를 사용해 락을 걸고 해제할 수 있다. ReentrantLock을 사용해 락을 걸고 해제하는 방법은 간단하다. 임계영역(Critical Area)의 시작지점에서 ReentrantLock 객체의 lock 함수를 호출하고 임계영역의 종료 지점에서 ReentrantLock의 unlock 함수를 호출하면 된다. ReentrantLock 객체를 사용해 보기 위해 다음과 같은 SafeAdder 클래스를 만들어보자. 이 SafeAdder 클래스는 add 함수를 여러 스레드가 동시에 호출하더라도 손실되는 연산 없이 더하기 연산이 수행되도록 만든 클래스이다. *물론 add 함수에 @Synchronized를 붙이면 간단하..

    [Kotlin] @JvmName 사용해 바이트코드로 컴파일 될 때 이름 바꾸기

    코틀린 파일의 최상위에 선언된 함수가 컴파일 될 때 일어나는 일 코틀린에서는 .kt 파일을 만든 다음 최상위에 함수를 선언하는 것이 허용된다. 예를 들어 다음과 같이 main 패키지 안에 선언된 Main.kt파일 내부에 printHello 함수가 선언되어 있다고 해보자. 우리가 이를 바이트 코드로 컴파일 하면 다음과 같이 MainKt.class 파일이 생성되며, 이 MainKt 클래스 내부에는 printHello 함수가 정적 함수로 선언된다. 따라서 우리는 이 함수를 자바 파일에서 다음과 같이 사용할 수 있다. import main.MainKt; public class Test { public static void main(String[] args) { MainKt.printHello(); } } 위 코..

    Kotlin과 Java의 Primitive Type 다루는 방법 차이 알아보기

    Java의 Primitive Type, Boxed Type과 한계 Java에서는 Primitive Type(원시 타입)과 Boxed Type(박스형 타입)의 변수를 구분해 코드를 작성하였다. Boxed Type은 Class로 원시 타입을 감싸는 형태로 만들어졌다. Java Primitive Type Java Boxed Type byte Byte short Short int Integer long Long float Float double Double char Character boolean Boolean 이는 초기에 매우 효과적이었는데, 원시 타입을 사용할 수 있는 곳에 원시 타입을 사용해 코드를 만들면 메모리가 많이 절약될 수 있었기 때문이다. 하지만 이는 시간이 지날수록 비효율적이어진다. 같은 목적을..