코틀린에서 비동기 처리로 여러개의 루틴을 동시에 처리할 수 있는 방법 메인의 동기처리와 별도로 움직이며 개발자가 제어 가능한 루틴 처리 import kotlinx.coroutines.* import 필수 코르틴은 제어범위 및 실행범위를 지정할 수 있다 -> 코루틴의 Scope Global Scope 프로그램 어디서나 제어, 동작이 가능한 기본범위 CoroutineScope 특정한 목적의 Dispatcher를 지정하여 제어 및 동작이 가능한 범위 모든 플랫폼에서 지원되는 것은 아님, 지원되는 플랫폼에 따라서 사용 Dispatchers.Default(기본적인 백그라운드 동작) Dispatchers.IO(I/O에 최적화 된 동작) Dispatchers.Main메인(UI) 스레드에서 동작 Scope에서 제어되도..
비트연산 정수형 변수를 사람이 사용하는 10진법으로 연산하는 대신 2진법인 비트 단위로 연산할 수 있는 기능 실무에서는 비트연산을 계산에는 거의 사용하지 않음 2진법을 이요한 연산 최적화가 필요하다면 컴파일러의 기능을 사용하는 경우가 대부 분 정수형의 값을 비트단위로 나누어 데이터를 좀더 작은 단위로 담아 경제성을 높이기 위한 용도로 사용함 32비트에서 5비트 따로 27비트 따로 다른 값을 넣어 사용하는 등 변수 하나에 여러개의 값을 담아 사용 주로 플래그 값(상태를 0과 1로 담음) 처리 하거나 네트워크 등에서 프로토콜의 데이터량을 줄이기 위해 사용 좌측으로 갈수록 상위 비트 우측으로 갈 수록 하위 비트 이다 최상위는 부호 비트이기때문에 데이터를 담지 않는 것이 좋다 bitwise shift opera..
기존의 var , val의 차이는 알고 있다 ( 할당된 객체를 바꿀 수 있는 지의 유무) 그러나 val에서 객내 내부의 속성을 변경 할 수 없는 것은 아니다 그러나 상수는 절대 변경 할 수 없다 상수 절대 변경할 수 없는 값 const val CONST_A = 1234 String과 같은 기본 자료형으로만 가능 클래스 객체들을 담는 것은 불가능 클래스의 속성(field)이나 함수의 지역변수로는 사용 불가능 반드시 companion object 안에서 사용하여 객체의 생성과 관계 없이 고정적인 값으로만 사용 됨 이름은 의례적으로 대문자와 언더바만 사용 const val CONST_A = 1234 예제 fun main() { val foodCourt = FoodCourt() foodCourt.searchPr..
그 외 컬렉션 함수 설명 associateBy 아이템에서 key를 추출하여 map으로 변환하는 함수 collection.associateBy { it.name } key로 사용할 name을 걸어준다 -> 자동으로 map 으로 변환하여 반환 groupBy key가 같은 아이템끼리 배열로 묶어 map 으로 만드는 함수 collection.groupBy { it.birthYear } 특정한 값이 같은 객체를 배열로 묶어 반환 partition 조건을 걸어 true, false 나눠준다 collection.partition { it.birthYear > 2002 } 두 컬렉션은 Pair라는 객체로 반환 -> frist, second 로 참조 val (over2002, under2002) = collection...
Set List와 달리 순서가 정렬되지 않으며 중복이 허용되지 않는 컬렉션 인덱스로 위치를 지정하여 객체를 참조할 수 없음 sampleSet.contains("A")로 존재하는지 확인하는지로만 사용 Set, MutableSet 존재 객체의 추가, 삭제 여부에따라 사용 add(Data) remove(데이터) 예제 fun main() { val a = mutableSetOf("귤", "바나나", "키위") for (item in a) { println("${item}") } a.add("자몽") println(a) a.remove("바나나") println(a) println(a.contains("귤")) } Map Map 은 객체를 넣을 때 그 객체를 찾아낼 수 있는 Key를 쌍으로 넣어줄 수 있는 컬렉션..
특별한 기능이나 형태의 클래스 Data Class 데이터를 다루는데 최적화된 class로 '5가지'기능을 내부적으로 자동으로 생성해준다 내용의 동일성을 판단하는 equals()의 자동 구현 객체의 내용에서 고유한 코드를 생성하는 hashcode()의 자동구현 포함된 속성을 보기쉽게 나타내는 toString()의 자동구현 객체를 복사하여 똑같은 내용의 새 객채를 만드는 copy()의 자동 구현 아무 패러미터가 없으면 똑같은 내용으로 생성 val a = Data("A",7) val b = a.copy() 패러미터가 있다면 해당 패러티머를 교체하여 생성 val a = Data("A",7) val b = a.copy("B") b ->Data("B",7) 로 생성 속성을 순서대로 반환하는 componenetX(..
코틀린도 함수의 overloading 지원됨 : 같은 Scope 안에서 같은 이름의 함수를 여러개 만들 수 있는 것 ex) fun same (x: Int) fun same (x: Int, text: String) fun same (x: Int, y: Int) 다만 패러미터 이름만 같은 경우는 오버로딩 할 수 없다. overloading 예시 패러미터의 형식에 맞게 자동으로 함수가 매칭되는 것을 확인 할 수 있다 fun main() { read(7) read("감사합니다") } fun read(x: Int) { println("숫자 $x 입니다") } fun read(x: String) { println(x) } 디폴트 매개 변수 (default arguments) 별다른 패러미터가 없을떄도 기본값으로 동..
nullable 변수에서 null을 처리하는 법 nullable 변수 var sample: String? = null But null상태로 속성이나 함수를 쓰려고 하면 -> null pointer exception 발생 (null 인 객체를 참조하면 발생하는 오류) var sample: String? = null if (sample != null) println(sample.toUpperCase()) 위와 같은 null Check 필요 ?. null safe operator sample?.toUpperCase() 참조연산자를 실행하기 전에 먼저 객체가 null 인지 확인부터 하고 객체가 null이라면 뒤의 구문을 실행하지 않는 연산자 이다. ?: elvis operator sample?:"default"..
클래스의 다형성 음료수로 비유를 해보면 콜라를 콜라 자체로 볼 수도 있지만 기호에 따른 음료 라고 볼 수 도 있다. 콜라를 음료 특성으로 만드는 것이 다형성이라고 할 수 있다. //Cola의 기능까지 모두 사용 가능 //타입 추론으로 Cola 자료형은 생략 가능 var b: Cola = Cola() 업 캐스팅(Up-Casting) //Drink의 기능만 사용 //Up-Casting : 상위 자료형에 담는다 var a: Drink = Cola() 다운 캐스팅(Down-Casting) 업 캐스팅 된 것을 하위 자료형으로 변환 시키는 것 as 변수를 호환되는 자료형으로 변환해주는 캐스팅 연산자 var a: Drink = Cola() //이후로는 a는 cola로 작동, 반환도 가능 a as Cola var b ..
Object 기존의 Class 객체는 단지 인스턴스 객체를 만들기 위한 '틀' 이기 때문에 내부에 있는 속성이나 함수를 사용하려면 var a = Person("박서준",1992) 와 같은 생성자를 통해 실제가 되는 인스턴스 객체를 만들어야 했었음 여러개의 인스턴스가 필요하지 않으며, 단하나의 객체만으로 공통적인 속성과 함수를 사용해야 하는 코드에서는 굳이 Class를 쓸 필요 없이 Object 를 사용하면 된다. Singleton Pattern 싱글턴 패턴 클래스의 인스턴스를 단 하나만 만들어 사용하도록 하는 코딩 아키텍쳐 패턴 코틀린은 이 싱글턴 패턴을 언어차원에서 지원한다. fun main() { //참조 연산자 사용하지 않고 직접 쓴다 println(Counter.count) Counter.coun..
람다함수의 특별한 경우 람다함수도 여러 구문의 사용이 가능 val c: (String) -> Unit = { str -> println("$str 람다함수") } val c: (String) -> Unit = { str -> println("$str 람다함수") println("여러 구문을") println("사용 가능 합니다")} val calculate:(Int, Int) -> Int = {a,b -> println(a) println(b) //구문의 마지막 a+b을 Int 값으로 반환 a+b 파라미터가 없는 람다 함수 -> 실행할 구문들만 나열하면 됨 val a:() -> Unit = { println("패러미터가 없어요") } 패러미터가 하나 뿐이라면 it 사용 val c: (String) -> ..
물리적 구조 프로젝트 코틀린으로 개발을 할때 관련된 모든것을 담는 하나의 큰 틀 모듈 하나의 프로젝트는 여러개의모듈로 이루어 진다(기능 단위) 직접만들기 라이브러리 모듈 붙이기 모듈안에는 다수의 파일이 들어갈 수 있음 코틀린 코드 파일 뿐만아니라 모듈과 관련된 설정 및 리소스 파일도 포함 될 수 있음 논리적 구조 패키지 개발시의 소스 코드의 '소속'을 지정하기 위한 논리적 단위 코드내에서 사용하는 이름이 용도의 내용이 충돌하지 않도록 패키지 이름을 짓는다 com.youtube.example com.youtube.example.base com.youtube.example.kotlin com.youtube.example.android package com.youtube.example fun main() { ..