목록[Study]/Kotlin (25)
기록
Java에서 Kotlin을 처음 접할때 가장 생소하고 헷갈리는 것 중 하나가 Custom Getter Setter이다. 먼저 var과 val의 차이를 생각해보면, 당연히 val은 get만 사용 가능하다. var 변수는 가져오면 get, set 둘 중 하나의 동작을 취할 수 있다. 이때 커스텀 기능은 get, set 중 원하는 동작을 개발자가 추가할 수 있다. 아래는 커스텀 set 예제 코드이다. private var productDetails = listOf() set(value) { field = value getProductDetails() } 이는 set을 부르는 순간에 getProductDetails() 를 호출하여 set할때마다 무조건 변수가 업데이트 되도록 한다. 이때 헷갈리는게 value와 ..
fun main() { val s = Solution() // println(s.solution(arrayOf("banana", "apple", "rice", "pork", "pot"), intArrayOf(3,2,2,1,1), // arrayOf("chicken", "apple", "apple", "banana", "rice", "apple", "pork", "banana", "pork", "rice", "pot", "banana", "apple", "banana") // )) println(s.solution(arrayOf("apple"), intArrayOf(10), arrayOf("banana", "banana", "banana", "banana", "banana", "banana", "banan..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/b4QHiH/btsbI2kU2Bx/suvcYR8D9Kf5bDCXcJmKR0/img.png)
@Test fun add() { val name = "홍길동" val number = "010-1111-1234" val expect = User(name, number) val actual = phoneBookImpl.add(name, number) assertEquals(expect, actual) } User 리스트에 새로운 User를 추가해주는 메소드를 테스트 하려니, 원하는 결과가 나오지 않았다. 둘의 객체 값의 주소가 다르다는 메시지이다. 뭐가 문제일까? class User (val name: String, val number: String) 일단 답을 먼저 말하면, 바로 User 클래스에서 equals 메소드를 오버라이드 하지 않았기 때문이다. data class User (val name..
import kotlinx.coroutines.launch import kotlinx.coroutines.* fun main() { val api = NamesApi() val namesJson = api.getNames(); println("----- ORIGINAL JSON NAMES:") println(api.getNames()); val names = nameFromJson(namesJson); println(); println("----- CONVERTED NAMES:") println(names); } fun nameFromJson(namesJson: List): List { return namesJson.filter { nameJson -> nameJson.lastName[0] == 'K' ..
1. 생성자 문법 class SongListAdapter : ListAdapter(SongDiffCallback()) { ... } class SongDiffCallback : DiffUtil.ItemCallback() { ... } SongListAdapter 클래스 안에 SongDiffCallback이라는 클래스가 ListAdapter 클래스의 생성자로 들어갔다. 그런데 SongListAdapter 코드 블럭 안에 SongDiffCallback가 쓰이지 않았다. 왜 들어간 것인가? ListAdapter 클래스 안에서 쓰였기 때문! 이해를 돕는 예제 코드를 첨부한다. fun main() { //val korean = Human(Korean()) val korean = KoreanPerson() kore..
'비동기'로 여러개의 루틴을 동시에 처리하는 법을 알아보자. '여러 개의 루틴'을 동시에 실행하여 결과를 내고싶다면 어떻게 해야할까? 비동기 처리를 지원하는 코루틴을 사용하게 된다. 코루틴은 메인이 되는 루틴과 별도로 진행이 가능한 루틴으로, 개발자가 루틴의 실행과 종료를 마음대로 제어할 수 있는 단위이다. 코루틴을 사용할때는 kotlin extention의 coroutines 패키지를 모두 import 해야 한다. import kotlinx.coroutines.* 코루틴은 제어범위 및 실행범위를 지정할 수 있다. 이를 코루틴의 Scope 라고 한다. 기본적으로 GlobalScope와 CoroutineScope를 지원한다. GlobalScope 프로그램의 어디서나 제어, 동작이 가능한 코루틴의 기본 범위..
비트연산 하는 법을 알아보자. 비트연산은 정수형 변수를 2진법인 비트단위로 연산할 수 있는 기능이다. 실무에서 비트연산은 거의 계산에는 사용하지 않는다. (2진법을 이용한 연산 최적화가 필요하다면 컴파일러의 기능을 사용하는 경우가 대부분이다.) 정수형의 값을 비트단위로 나누어 데이터를 좀 더 작은 단위로 담아 경제성을 높이기 위한 용도로 사용된다. 변수 하나에 여러개의 값을 담아 사용할 수 있는 것이다. 비트연산을 사용하는 부하도 무시할 수 없으므로 주로 플래그 값*을 처리하거나 네트워크 등에서 프로토콜의 데이터 양을 줄이기 위해 자주 사용된다. (* 여러개의 상태값을 0과 1로 담는 방법) 코틀린은 아직까지 모든 정수형이 부호를 포함하므로 최상위 비트를 양수, 음수를 표시하는 부호 비트로 사용하기에 이..
변수의 다양한 사용 방법에 대해 알아보자. 변수에 대한 몇가지 주의할 내용과 좀 더 다른 방법으로 사용하는 것을 알아보자. 1. 상수 val은 할당된 객체를 변경할 수 없을 뿐이지 객체 내부의 속성을 변경할 수 없는 것은 아니다. 절대 변경이 불가능한 것은 '상수'이다. 컴파일 시점에 결정되어 절대 바꿀 수 없는 값이다. 상수로 선언될 수 있는 값은 기본 자료형만 가능하며(String 클래스 포함) 런타임에 생성될 수 있는 일반적인 다른 클래스의 객체들은 담을 수 없다. 상수는 클래스의 속성이나 지역 변수 등으로는 사용할 수 없으며, 반드시 companion object 안에 선언하여 객체의 생성과 관계없이 클래스와 관계된 고정적인 값으로만 사용하게 된다. fun main() { val foodCourt..
지난 시간에 이어 좀 더 복잡한 기능의 컬렉션 함수를 알아보자. 1. associateBy 객체에서 key를 추출하여 map으로 만드는 함수 2. groupBy key가 같은 아이템끼리 배열로 묶어 map으로 만드는 함수 3. partition 아이템에 조건을 걸어 두개의 컬렉션으로 나누는 함수 두 객체를 담을 수 있는 Pair라는 클래스 객체로 반환된다. 각각의 컬렉션을 first, second로 참조하여 사용한다. 변수 이름을 괄호 안에 두개 선언해주면 각각의 변수 이름으로 Pair를 받을 수 있다. fun main() { data class Person(val name: String, val birthYear: Int) val personList = listOf(Person("유나", 1992), ..
컬렉션에 사용할 수 있는 유용한 함수들을 알아보자. 여태까지 컬렉션을 for문으로 반복하여 포함된 아이템을 하나하나 꺼내어 사용했었다. 코틀린은 함수형 언어의 특징을 갖고 있기 때문에 컬렉션 함수를 사용하여 좀 더 편리하게 컬렉션을 사용할 수 있다. 컬렉션 함수 : list나 set, map과 같은 컬렉션 또는 배열에 일반 함수 또는 람다 함수 형태를 사용하여 for문 없이도 아이템을 순회하여 참조하거나 조건을 걸고, 구조의 변경까지 가능한 여러가지 함수를 지칭한다. fun main() { val nameList = listOf("박수영", "김지수", "김다현", "신유나", "김지우") //중괄호 안에서 컬렉션에 포함된 모든 아이템을 it 변수로 순서대로 참조한다. nameList.forEach{ p..