Kotlin 15

[Kotlin] 멤버참조 문법과 예시, 람다의 컴파일에 대해 알아보자!

다른 글에서 람다를 알아보며 멤버참조에 대해서 짧게 알아본 적이 있다. (링크) 유용한 사용 예시는 람다함수를 인자로 넣는 것이었다. 람다를 인자로 받는 함수에 인자로 넘기려는 코드가 이미 함수로 선언된 경우 멤버 참조를 사용하여 짧은 코드로 작성할 수 있었다. 하지만 내용이 너무 빈약하여 추가로 그 원리가 무엇인지 정리하려고한다. 그래도 그 전에 다시 리마인드 해보자. 멤버 참조? 문법적으론 이중콜론 (::) 을 사용하여 멤버를 참조할 수 있다. 아래와 같은 형태이다. 클래스이름::멤버이름 멤버참조는 그 멤버를 호출하는 람다와 같은 타입이다. 멤버 참조는 프로퍼티나 메서드를 단 하나만 호출하는 함수 값을 만들어준다. 추가적인 규칙은 다음과같다. 다른 클래스의 멤버가 아니고 최상위에 선언된 함수나 프로퍼..

Kotlin 2023.01.23

[Kotlin] by lazy 의 정체와 함께, "위임 프로퍼티" 에 대해 알아보자

이 글을 쓰게 된 계기는 두 가지이다. 먼저 by lazy 의 동작방식을 제대로 알아보고 싶다는 것이다. 그리고 다른 글에서 코틀린 연산자 관례에 대해 소개하고 여러 관례를 정리하였는데 (링크) getValue 와 setValue 메서드를 정리하지 않아서 찝찝했다. (invoke 는 여기서 마지막에 추가 정리했다..) 그래서 추가로 정리하고 위임 프로퍼티에 대해 알아보려고한다. (이해한대로 쓰기 때문에 읽다가 틀린 부분이 있다면 댓글로 말씀해주시면 매우 감사입니다.) 그럼 다시 리마인드 해야할 것 들을 알아보자. 배경지식 리마인드 관례? 코틀린에서 관례라고 하는 것은 어떤 언어 기능과 미리 정해진 이름의 함수를 연결해주는 기법이다. 예를 들면 코틀린에서 흔하게 사용하던 == 로 값을 비교하는 기능은 eq..

Kotlin 2023.01.22

[Kotlin] 코틀린의 연산자 관례 정리, 어떤 클래스든 연산시켜보자!

코틀린에서 숫자가 아닌 객체에 대해서도 + - * / 등의 연산을 하는 경우를 보았을 것이다. 또한 컬렉션도 배열도 아닌 타입이 [] 로 프로퍼티에 접근한다든지 하는 것도 보았을 것이다. 예를들면 컴포즈에서 사용하는 Offset 클래스이다. (본 글이 어떤 Offset 이 어떤 클래스인지 논하는 글은 아니므로 Offset 은 x, y 라는 프로퍼티를 가지고 있고 있는 클래스라는 것에 집중한다.) 아래와 같이 Offset 끼리 연산해서 새로운 Offset 을 만드는 예시를 살펴보자 Offset(1f, 2f) + Offset(2f, 3f) 위 연산이 가능한 이유는 Offset 클래스가 plus 라는 이름의 특별한 메서드를 정의했기 때문이다. operator fun plus(other: Offset): Off..

Kotlin 2023.01.08

[Kotlin] 흥미돋는 코틀린의 타입을 정리해보자

오늘은 Kotlin in Action 을 읽고나서, 코틀린의 타입 시스템에 대해서 정리해보려고 한다. 타입은 어떤 값들이 가능한지와 그 타입에 대해 수행할 수 있는 연산의 종류를 결정하는 것이다. 코틀린으로 코딩하는데 문제가 없고 편하다고 생각했던 사람에게도 큰 도움이 되는가 물을 수 있겠지만 나는 코틀린을 쓰면서 단순히 편하다고 느꼈던 것들에 대해, 코틀린 컴파일러 개발자가 왜 이렇게 만들었는지 말해주는 설계 의도를 보며 굉장한 재미를 느끼고있다. 그래서 단순한 사용 방법보다는 키워드와 클 틀로 정리해보려고한다. (틀린 부분이나 이견이 있다면 댓글 남겨주시면 매우 감사합니다ㅎㅎ) 코틀린의 원시타입 코틀린에서는 원시타입과 래퍼타입을 구분하지 않는다! 그래서 개발자는 항상 같은 타입을 사용하게 된다. 자바..

Kotlin 2023.01.05

[Kotlin] 람다함수는 무엇이고 왜 쓰고 어떻게 쓸까?

요즘 Kotlin in Action 을 보면서 예전에 람다에 대해서 정리한 글과 합쳐서 다시 쓰려고한다. 람다란 무엇인가? 람다는 기본적으로 다른 함수에 넘길 수 있는 작은 코드 조각을 뜻한다. 즉, 값처럼 여기저기 전달할 수 있는 동작의 모음이라는 뜻이다. 실행시점에 코틀린 람다 호출에는 아무 부가 비용이 들지 않고, 프로그램의 기본 구성요소와 비슷한 성능을 낸다. 람다는 왜 쓰는가? 1. 코드를 깔끔하게 사용하기 위해 람다가 메서드가 하나뿐인 무명 객체 대신 사용할 수 있다는 사실을 떠올려본다. 안드로이드 개발하며 모두 뷰에 setOnClickListener 를 달아본적이 있을 것이다. setOnClickListener 에onClick 이라는 메서드 가 있는 OnClickListener 를 구현하여 ..

Kotlin 2023.01.01

[Kotlin] Pair , Triple 과 Destructure

Pair 와 Triple 은 코틀린에서 미리 만들어놓은 data class 이다. 둘 다 Tuples 파일에 정의되어있다. 즉 이것도 클래스임을 다시 생각하며 아래를 보자 - Pair 만들기 ( to 키워드, List.partition() ) to 키워드로 Pair 를 만드는 방법은 간단하다. 변수 사이에 to 를 넣으면 된다. val equipment = "fish net" to "catching fish" println("${equipment.first} used for ${equipment.second}") 요소끼리 타입이 같지 않아도 된다! 위 코드에서 equipment 의 타입은 Pair 이다. 안의 타입을 바꾸면 타입도 다르게 할 수 있을 것이다. 즉 아래와 같이 작성이 가능하다. fun ma..

Kotlin 2021.08.05

[Kotlin] 상속/ interface/ abstract class/ object/ data class/ enum class

- open 키워드와 상속 다른 클래스를 상속하는 방법은 현재클래스이름(생성자) : 상속클래스이름(생성자) 코틀린은 default 로 부모 클래스의 properties 와 member variables 를 private 이 아닌 이상 접근은 가능하지만 override 할 수 없다. 자식클래스가 override 할 수 있게 하려면, 부모클래스에서 open 키워드를 사용해야한다. 클래스는 물론 생성자에 있는 멤버변수 모두에 각각 open 키워드를 붙이고 하위클래스에서 override 할 수 있다. open class Aquarium constructor(open var width: Int = 20, open var height: Int = 40, open var length: Int = 100) { open..

Kotlin 2021.08.05

[Kotlin] 접근제어자 ( visibility modifiers )

- default 접근제어자 public 코틀린의 모든 default 접근제어자는 public 이다. 그래서 따로 접근제어자를 지정해주지 않는다면 class, methods, properties, member variables 등에 모두 접근이 가능하다. - 접근제어자가 붙을 수 있는 키워드들 classes, objects, interfaces, constructors, functions, properties, 그리고 그들의 setters 에 -public 클래스 밖에서도 접근할 수 있다. 위에서 언급한 것처럼 따로 지정해주지 않으면 default 로 public 이 적용된다. - internal 모듈 내에서만 접근이 가능하게 하는 접근제어자이다. 여기서 모듈이란 함께 컴파일되는 코틀린 파일들의 집합을 ..

Kotlin 2021.08.04

[Kotlin] Class (constructor, getter/setter, companion object) 기초

간략한 소개 class classs 는 object 의 청사진이다. 붕어빵틀과 붕어빵 개념? 일 것 같다. codelabs 에서는 Objects are instances of classes 라고 한다. 참고. interface Interface 는 다른 Class 가 구현해야하는 함수에 대한 specification 이다. codelabs 에서는 어항 클래스가 있고 청소 인터페이스가 있다고 했을 때, 청소는 어항말고도 가전제품, 집, 사무실 등 여러 다른 클래스에서도 쓰일 수 있기 때문에 청소를 인터페이스로 빼고 어항 클래스에서 청소 인터페이스를 구현하는 예시를 들어주었다. - 생성자 - 생성자를 클래스 옆에 constructor() 안에 함수 parameter 처럼 쓸 수 있다. ( 그래서 defaul..

Kotlin 2021.08.04

[Kotlin] lambda 와 higher-order function

- lambda 람다는 함수를 만드는 expression 이다. 함수의 이름을 정의하지 않는다. 이름 없이 함수를 사용할 수 있다. 그래서 anonymous function 이라고도 불린다. 람다는 데이터로 전달될 수 있다. var dirtyLevel = 20 val waterFilter = { dirty : Int -> dirty / 2} println(waterFilter(dirtyLevel)) 위와 같이 람다를 정의할 수 있는데 -> 왼쪽에는 parameter 가 있고 뒤에는 return 이 있다. 함수를 가지는 변수를 만들고 호출할 수도 있다. val waterFilter: (Int) -> Int = { dirty -> dirty / 2 } 위와 같이 type 도 더 명확하게 지정해줄 수 있다. ..

Kotlin 2021.08.03