Languages 20

kotlin의 제네릭 타입 파라미터 (generic, property)

9.1 제네릭 타입 파라미터 제네릭스를 사용하면 타입 파라미터를 받는 타입을 정의할 수 있다 Map map의 key, value 값의 타입을 명시해 줄 수 있다 kotlin은 llistOf("Dumitry", "asdfa") 이런 리스트를 받으면 type을 string으로 알아서 추론해 준다 val readers : MutableList = mutableListOf() val readers = mutableListOf() // 위 두 선언은 동등하다9.1.1 제네릭 함수와 프로퍼티 리스트를 다루는 함수를 작성하는 경우 모든 타입의 리스트를 잘 다루고 싶다 컬렉션을 다루는 라이브러리 함수는 대부분 제네릭 함수이다 ex.slice 9.1.2 제네릭 클래스 선언 표준 자바 인터페이스인 List를 코틀린으로 정..

Languages 2020.06.03

kotlin 고차함수에서의 흐름제어 (return, @label)

8.3 고차 함수 안에서 흐름 제어 루프 안에 return 이 있는 코드를 람다로 바꿀때 일어나는 일 8.3.1 람다 안의 return 문 val people = listOf(Person("Alice", 29), Person("Bob", 31)) fun lookForAlice(people : List){ people.forEach{ if(person.name == "Alice"){ println("Found!") return } } println("Alice is not found") } 이름이 Alice인 경우에 lookForAlice 함수는 return 된다 위 예제처럼 람다 안에서 return 사용하면 람다로부터만 반환 되는게 아니라 그 람다를 호출하는 함수가 실행을 끝내고 반환된다 이런것을 non..

Languages 2020.05.27

kotlin의 inline 함수 (고차함수, synchronized)

8.2 인라인 함수 : 람다의 부가 비용 없애기 람다를 사용하는 구현은 똑같은 작업을 수행하는 일반 함수를 사용한 구현보다 덜 효율적이다 람다가 변수를 포획하면 람다 생성때마다 새로운 무명 클래스 객체 생성 반복되는 코드를 별도의 함수로 빼내기 + 효율적인 코드는 없을까? --> inline 함수! 8.2.1 인라이닝이 작동하는 방식 inline 변경자를 함수에 붙이면 컴파일러는 그 함수를 호출하는 모든 문장을 함수 본문에 해당하는 바이트 코드로 바꿔준다 inline fun synchronized(lock: Lock, action: () -> T): T{ lock.lock() try{ return action() } finally { lock.unlock() } } val l = Lock() synchr..

Languages 2020.05.26

kotlin의 고차함수 (lambda)

8장. 고차함수 : 파라미터와 반환 값으로 람다 사용 고차 함수 람다를 인자로 받거나 반환하는 함수 고차함수를 사용해서 코드를 더 간결하게, 중복을 없애고 더 나은 추상화를 하자 인라인 함수 람다를 사용함에 따라 발생할 수 있는 성능상 부가비용을 없앰 람다 안에서 더 유연하게 흐름을 제어할 수 있다 8.1 고차 함수 정의 고차함수 : 다른 함수를 인자로 받거나 함수를 반환하는 함수 코틀린에서는 람다나 함수 참조를 사요해 함수를 값으로 표현할 수 있다 ex) filter 함수 list.filter {x > 0} 술어 함수를 인자로 받으므로 고차함수 8.1.1 함수 타입 val sum = {x : Int, y : Int -> x+y} val sum : (Int, Int) -> Int = {x, y -> x+..

Languages 2020.05.26

kotlin의 구조분해 선언과 component 함수

7.4 구조 분해 선언과 component 함수 val p = Point(10,20) val (x, y) = p print(x) print(y) 구조 분해를 사용하면 복합적인 값을 분해해서 여러 다른 변수를 한꺼번에 초기화 할 수 있다 내부에서 구조 분해 선언은 또 관례를 이용한다 // 외부 사용시 val (x, y) = p // 내부에서는 val x = p.component1() val y = p.component2() 내부 구조분해 선언 data 클래스의 주 생성자에 들어있는 프로퍼티에 대해서 자동으로 component 함수를 만들어준다 여러 값을 한꺼번에 반환할때, 모든 값이 들어갈 데이터 클래스를 정의하고 함수의 반환 타입을 그 데이터 클래스로 바꾼다 배열, 컬렉션에도 componentN 함수가 ..

Languages 2020.05.18

kotlin 의 비교 연산자 오버로딩 (equals, compareTo)

7.2 비교 연산자 오버로딩 7.2.1 동등성 연산자 ; equals == 연산자도 앞서 말한 방식 그대로 equals 함수로 컴파일 되는 것이다 data class의 경우 컴파일러가 자동으로 equals 함수를 생성해준다 직접 override 하여 코드 작성 가능 != equals 실행한 결과를 반전시켜 반환 7.2.2 순서 연산자 : compareTo Comparable interface 안에 들어있는 compareTo java 에서는 원시 타입의 경우에만 연산자로 비교 가능하다 kotlin은 연산자는 compareTo 연산자로 계산된다 compareValuesBy 두 객체와 여러 비교 함수를 인자로 받아서 앞에것부터 하나씩 비교한다 차이나면 끝 7.3 컬렉션과 범위에 대해 쓸 수 있는 관례 7.3...

Languages 2020.05.18

kotlin 산술 연산자 오버로딩 (+, - *)

7.1 산술 연산자 오버로딩 String 에 대해 + 연산자를 사용하는 것 또한 산술 연산자 오버로딩 BigInteger 클래스를 다룬다면 add 메소드를 명시적으로 호출하기 보다는 + 연산을 사용하는 편이 더 낫다? 컬렉션에서도 += 연산자를 사용하도록 할 수 있다 7.1.1 이항 산술 연산 오버로딩 data class Point(val x : Int, val y : Int){ operator fun plus(other: Point): Point { return Point(x+otherx, y+other.y) } } val p1 = Point(10,20) val p2 = Point(30,40) println(p1 + p2) 위 코드에서 + 를 써주면 plus 함수가 호출된다 plus 앞에 operato..

Languages 2020.05.18

kotlin의 null 가능성과 collection

6.3 컬렉션과 배열 6.3.1 널 가능성과 컬렉션 List? 널이 될 수 있는 값으로 이루어진 널이 될 수 있는 리스트 val validNumbers = numbers.filterNotNull() filterNotNull 함수로 null 값들을 filter 햇다고 할때, valNumbers 값은 List 값이 될 수 있다 6.3.2 읽기 전용과 변경 가능한 컬렉션 kotlin 에서 컬렉션안의 데이터에 접근하는 인터페이스와, 컬렉션 안의 데이터를 변경하는 인터페이스를 분리 접근하는 인터페이스 : kotlin.collections.Collection size, iterator, contains 등의 메소드 변경하는 인터페이스 : kotlin.collections.MutableCollection Mutabl..

Languages 2020.05.07

kotlin의 원시타입 (int, boolean, any)

6.2 코틀린의 원시 타입 6.2.1 원시 타입 : Int, Boolean java 원시타입 int 등 값이 직접 들어간다 참조타입 String 등 메모리 상의 객체 위치가 들어간다 참조 타입이 필요한 경우, wrapper type을 이용해서 원시 타입을 감싸서 사용한다 kotlin 원시타입, 참조 타입을 구분하지 않는다 숫자 타입 등 원시타입의 값에 대해 메소드를 호출할 수 있다 6.2.2 널이 될 수 있는 원시 타입 : Int?, Boolean? java 에서 kotlin 변수 사용 널이 될 수 있는 코틀린 타입은 자바 원시 타입으로 표현할 수 없다 자바의 래퍼 타입으로 컴파일된다 제네릭 클래스 래퍼타입을 사용 val listOfInts = listOf(1,2,3) 래퍼인 Integer 타입으로 이뤄..

Languages 2020.05.07

kotlin의 null 가능성 (?. ?: !!)

6.1 널 가능성 NPE : null pointer exception 코틀린은 Nullability로 NPE를 피할 수 있게 해준다 6.1.1 널이 될 수 있는 타입 코틀린은 java와 다르게 null 이 될 수 있는 타입을 명시적으로 지원한다 모든 타입은 기본적으로 널이 될 수 없는 타입이다 ?가 붙어야 널이 될 수 있다 널이 될 수 있는 타입의 변수인 경우 수행할 수 있는 연산이 제한된다 변수.메소드() 형식이 제한된다 ?. !! 등을 써줘야 한다 널이 될 수 있는 값을 널이 될 수 없는 타입의 변수에 대입할 수 없다 널이 될 수 있는 타입의 값을 널이 될 수 없는 타입의 파라미터를 받는 함수에 전달할 수 없다 null과 널이 될 수 있는 변수를 비교한 다음에는 위의 제한 되는 부분들이 모두 풀리고 ..

Languages 2020.05.07