발단 오브젝트가 함수형 인터페이스면 접두어로 인터페이스 파입을 가진 람다를 생성할 수 있다하여 따라해봄. @FunctionalInterface interface FunctionalInterface { fun apply() } fun main() { val f = FunctionalInterface { println() } // error?? } 그런데 생성이 안되고 에러가 발생함.. 뭐지?? 함수형 인터페이스를 잘못 선언했나 해서 기존에 있는 클래스를 가지고 다시 시도해봄. fun main() { val r = Runnable { println("run!") } r.run() // run! } 이건 잘됨;;; 뭐지?? 그래서 Runnable을 코틀린으로 가져와 다시 시도해봄 @FunctionalInter..
중첩 클래스 클래스 안에 또 다른 클래스를 중첩해서 사용할 수 있다. 중첩된 클래스는 외부 클래스의 멤버를 접근할 수 없다. 자바의 정적 중첩 클래스와 느낌이 비슷하다...? class Outer { private val outerMember = 10 fun outerFunc() = println("outer function call!!") class Nested { // 외부 클래스 접근 불가 // pinrtln(outerMember) // outerFunc() fun nestedFunc() = print("nested function call!!") } } fun main() { // 자바의 중첩 스태틱 클래스와 같다 Outer.Nested().nestedFunc() // nested function..
제네릭 클래스나 메서드 내부에서 사용할 타입을 외부에서 지정하는 방법이다. 원하는 자료형이 입력되지 않았을때 컴파일 타임에 에러를 발생시켜 안정성을 높일수 있다. 자바에서의 제네릭 코틀린의 제네릭을 알아보기 전에 자바에서의 제네릭 사용법부터 알아보자. 제네릭 선언 // 제네릭 클래스 public class GenericJava { private T value; // 제네릭 메서드 public static void genericMethod(T t) { System.out.println(t); } public static void main(String[] args) { // String으로 지정 GenericJava genericJava = new GenericJava(); genericJava.value ..
데이터 클래스 자바에서 TO나 VO와 같이 아무런 동작은 하지않고 오로지 데이터를 나르는 역할을 하는 클래스가 존재함. 위의 클래스들은 IDE를 통해 만들거나 외부 라이브러리(lombok)로 컴파일 타임에 만든다. 코틀린에서는 외부 라이브러리를 사용하지 않고 data class라는 클래스를 제공한다. import java.time.LocalDateTime data class Person(val name: String, val age: Int, val birthDay: LocalDateTime) 데이터 클래스는 아래와 같은 멤버를 컴파일 타임에 자동으로 생성한다. 1. equals(), hashCode() 2. toString() - Person(name=park jin, age=31, birthDay=2..
object 자바에서 객체를 생성시 클래스를 정의한후 new키워드를 이용해 객체를 생성해야한다. 코틀린도 위와 같지만 object키워드를 사용하면 바로 객체를 생성할 수 있다. 일반 객체처럼 .(dot)을 이용해서 프로퍼티 및 메서드에 접근 가능하다. 클래스와 다르게 생성자(constructor)가 존재하지 않는다. object Person { val name = "park jin" var age = 31 fun printInfo() { println("name : $name, age: $age") } } fun main() { Person.printInfo() // name : park jin, age: 31 Person.age = 0 //Person.name = "" // error Person.pr..
확장 코틀린의 확장 기능을 통해 기존 클래스의 함수(메서드) 및 프로퍼티를 확장 정의하여 사용할 수 있다. 확장 불가 클래스(final) 또는 짧은 범위에서 특정 클래스의 기능을 추가/수정할 경우 유용하다. 호출 시점에 부가 비용이 발생하지 않는다. 확장 함수 (Extension function) [확장 하려는 대상 클래스].함수명() 형식으로 정의한다. 코틀린의 최상위 객체인 Any에 확장 함수를 정의하면 모든 객체에서 사용 가능하다. 확장 함수의 경우 내부에서만 사용할수 있는 private, protected 멤버에는 접근하지 못한다. 확장 함수와 클래스 멤버 함수의 이름이 같은경우 멤버 함수의 우선순위가 더 높기때문에 클래스 내의 멤버 함수가 호출 된다. class Person(val name: S..