25. 함수의 argument를 다루는 방법과 infix 함수
arguments
▷ 함수 이름이 같아도 자료형이 다르거나 파라미터의 개수가 다르면 서로 다른 함수로 사용가능
-------------------------------------------------
fun a(x:Int)
fun a(x:Int, txt:String)
fun a(x:Int, y:Int)
fun main() {
read(5)
read("'문자'")
}
fun read(x : Int) {
println("${x} is integer")
}
fun read(x : String) {
println("${x} is string")
}
▷ 파라미터를 받아야 하는 함수이지만 하지만 파라미터 없이도 동작해야 할 경우
▷ default arguments è 파라미터가 없으면 기본 지정값으로 동작
▷ named arguments è 순서와 상관없이 이름을 사용해서 할당
▷ variable number of arguments(vararg) è 같은 자료형을 개수와 상관없이 파라미터로 받고 싶을 때
-------------------------------------------------
fun main() {
deliveryItems("가방", 2) // default arg
deliveryItems("가방", 2, "회사")
deliveryItems("책", dest="울집") //named
sum(3,4,5)
}
fun deliveryItems(n : String, count: Int =1, dest:String="home") {
println("${n}을 ${count}개 받아 ${dest}에 배달")
}
fun sum(vararg nums: Int) { // vararg
var sum = 0
for ( n in nums ) {
sum += n
}
print(sum)
}
infix 함수
fun main() {
println(5 multiply 4)
print(5.multiply(4))
}
infix fun Int.multiply(x: Int): Int = this * x
// class안에서 infix를 적용시 적용할 class가 자기 자신이므로
26. nested class and inner class
class 안에 class가 존재하는 유형
코드의 가독성 및 작성 편의성이 올라갈 수 있음
Nested Class
▷ 하나의 class가 다른 class와 강하게 연관되어 있다는 의미
▷ 형태만 내부에 존재할 뿐 실질적으로 내용을 직접 공유할 수 없는 별개의 class
class Mother { class Nested {} } à Mother.Nested()
inner Class
▷ 혼자서는 객체를 만들수 없고 외부 class의 객체가 있어야 만 생성과 사용이 가능
▷ 외부 class 객체의 속성이나 함수를 사용 가능
class Outer { inner class Inner {} }
-------------------------------------------------
fun main() {
Outer.Nested().introduce()
val outer = Outer()
val inner = outer.Inner()
inner.introduce()
inner.introduceOuter()
outer.txt = "Changed Outer class"
inner.introduceOuter()
}
class Outer {
var txt = "Outer class"
class Nested {
fun introduce() {
println("Nested class")
}
}
inner class Inner {
var txt = "Inner class"
fun introduce() {
println(txt)
}
fun introduceOuter() {
println(this@Outer.txt)
}
}
}
27. Data Class와 Enum Class
특별한 기능이나 형태를 갖는 class
Data Class
▷ 데이터를 다루는 데 최적화된 class로 5가지 기능을 내부적으로 자동 생성
· equals() à 같은 내용 인지 비교
· hashCode() à 객체의 내용에서 고유한 코드를 생성
· toString()
· copy() à 아무 파라미터가 없으면 똑같은 내용으로 생성
- val a = Data(“d”,7) val b = a.copy
- val a = Data(“d”,7) val b = a.copy(“C”) è b는 Data(“C”, 7)과 같음
· componentX() à 속성을 순서대로 반환
-------------------------------------------------
fun main () {
val a = General("kotlin", 2039)
println(a == General("kotlin", 2039))
println(a.hashCode())
println(a)
val b = Data("java", 2929)
println(b == Data("java", 2929))
println(b.hashCode())
println(b)
println(b.copy())
println(b.copy("python"))
println(b.copy(id = 2020))
val list = listOf(Data("kit", 333),
Data("co", 222),
Data("sos", 111))
for ((a,b) in list) {
println("${a} , ${b}")
}
}
class General(val name: String, val id: Int)
data class Data(val name: String, val id: Int)
Enum Class
▷ enum class Color { RED, BLUE, BLACK } à 모두 enum class인 Color 객체를 생성하기 위한 선언
enum class Color (var num : Int) { RED(1), BLUE(3)
fun isRed = this === Color.RED }
-------------------------------------------------
fun main () {
var a = Gen.SING
println(a)
a = Gen.POOP
println(a.isPooping())
a = Gen.EAT
println(a.cat)
a = Gen.POOP
a.catPrint()
}
enum class Gen(val cat : String) { //name은 enum 내부에서 사용하는 거라 쓰면 애러남
SING("노래"),
EAT("먹기"),
POOP("누다. 싸다");
fun isPooping() = this == Gen.POOP
fun catPrint() {
println(this.cat)
}
}
28. 변수의 고급 기술(상수, lateinit, lazy)
상수(const)
▷ const val CONST_A = 3029 // 바꿀 수 없는 상수, 기본 자료형만 가능(String 가능)
▷ 변수는 실행 시 변환에 따른 성능 저하 발생. 상수는 없음
-------------------------------------------------
fun main () {
val foodCourt = FoodCourt()
foodCourt.searchPrice(FoodCourt.FOOD_CREAM)
foodCourt.searchPrice(FoodCourt.FOOD_SIDE)
}
class FoodCourt {
fun searchPrice(foodName: String) {
val price = when(foodName){
FOOD_CREAM -> 10000
FOOD_VEGE -> 1230
FOOD_SIDE -> 500
else -> 0
}
println("${foodName}은 ${price}입니다.")
}
companion object {
const val FOOD_CREAM = "크림파스타"
const val FOOD_VEGE = "김치류"
const val FOOD_SIDE = "멸치류"
}
}
lateinit
▷ 일단 변수만 선언하고 나중에 초기값(객체)을 할당
▷ 초기값 할당 전까지 변수를 사용할 수 없음(애러 발생)
· 초기화 확인을 위해서 à ::a.isInitialized
▷ 기본 자료형에는 사용할수 없음(String class는 가능)
▷ lateinit var 변수의 제한 사항
-------------------------------------------------
fun main () {
val a = LateInitSam()
println(a.getLateInitText())
a.txt = "새로 할당한 값"
println(a.getLateInitText())
}
class LateInitSam {
lateinit var txt : String
fun getLateInitText() : String {
if (::txt.isInitialized) {
return txt
} else {
return "기본값"
}
}
}
lazy
▷ 일정 시간 기다린 후에 초기화를 수행
· val a : Int by lazy {7} println(a) // 7초 후에 초기화
▷ 코드의 실행 시간을 최적화 하는 코드
· 람다함수로 초기화가 진행되므로 val a : Int by lazy { println(a) 7 } 위와 같은 결과
-------------------------------------------------
fun main () {
val a : Int by lazy{
println("초기화를 합니다.")
5 }
println("코드를 시작합니다.")
println(a)
println(a)
}
29. 비트연산
▷ 맨 앞 비트는 부호로 사용
▷ 부호 비트를 제외한 모든 비트를 좌측으로 이동
· shl(shift left), shr(shift right)
▷ 부호를 포함 모든 비트를 우축으로 이동
· ushr(unsigned shift right)
▷ 연산자 : and, or, xor(같으면 0, 다르면 1)
-------------------------------------------------
fun main () {
var binary : Int = 0b10000
binary = binary or(1 shl 2) //1이라는 값을 좌측으로 2번 밀음(100)
println(binary.toString(2)) //2진수형의 문자열로 출력
var result = binary and(1 shl 4)
println(result.toString(2))
println(result shr 4)
binary = binary and((1 shl 4).inv())
println(binary.toString(2))
println((binary xor(0b10100)).toString(2))
}
30. 코루틴을 통한 비동기 처리
▷ 여러 코드를 동시에 진행 할 때 à import kotlinx.coroutines.*
· delay(milisecond:Long) // 밀리초 단위로 루틴을 잠시 대시 기키는 함수
· Job.join() // Job의 실행이 끝날때까지 대기하는 함수
· Deferred.await() // Defferred의 실행이 끝날때까지 대기하는 함수
· 위 3개는 coroutine내부, runBlocking 같은 루틴의 대기가 가능한 구문 안에서만 동작 가능
-------------------------------------------------
fun main () {
runBlocking {
val a = launch{
for (i in 1..5){
println(i)
delay(10)
}
}
val b = async {
"async 종료"
}
println("async 대기")
println(b.await())
println("launch 대기")
a.join()
println("launch 종료")
}
}
▷ cancel() // 취소
-------------------------------------------------
fun main () {
runBlocking {
val a = launch{
for (i in 1..5){
println(i)
delay(10)
}
}
val b = async {
"async 종료"
}
println("async 대기")
println(b.await())
println("launch 취소")
a.cancel()
println("launch 종료")
}
}
▷ withTimeoutOrNull() 제한 시간내 종료 안되면 null
-------------------------------------------------
import kotlinx.coroutines.*
fun main () {
runBlocking {
var result = withTimeoutOrNull(50) {
for (i in 1..15){
println(i)
delay(10)
}
"Finish"
}
println(result)
}
}
'kotlin' 카테고리의 다른 글
kotlin OOB basic (0) | 2023.02.06 |
---|---|
kotlin data type (0) | 2023.02.06 |
Kotlin null 처리 (0) | 2023.01.14 |
Kotlin String (0) | 2023.01.14 |
Kotlin List (0) | 2023.01.14 |