other_program_languages/코틀린, 안드로이드

About Kotlin

MasterOfAI 2022. 4. 2. 21:04

https://kotlinlang.org/

 

Kotlin Programming Language

 

kotlinlang.org

 

코틀린이란 JVM(Java Virtual Machine) 위에서 올라가는 2011년도에 출시한 언어

 

코틀린이 왜 필요한가? 

 - 자바는 1995년생

 - 약 20년이 흐르면서 언어 트랜드가 바뀌었다.

 - 개발 작성 패턴을 바꾸고 싶다. 

 - 2011년을 기점으로 코틀린 개발이 늘고 있다. 

 

자바와 비교해 보자 

  자바 코틀린
Null로 부터 안전한가 기본 NULL 허용
오노테이션으로 조정 가능
NULL 허용 여부 결정 가능
Null Point Exception 문제 컴파일 단계서 확인 가능
선언 타입 항상 명시 
final을 붙여 강제성 추가 기능
타임 추론 가능
가변, 불변 선언 가능
데이터 클래스 Getter/Setter 추가 필요
초기화 함수 설정 가능
Data class 선언을 통해 생략 가능 

 

변수

변수이름 쓰는 방법 

- 카멜 케이스 (testName)

- 스네이크 케이스 (test_name)

변수 형태

- var (일반적 변수, 언제든 읽거나 쓰기 가능)

- val (선언시에만 초기화 가능, 이후 읽기만 가능) - 상수형 변수 

변수 타입

  8bits 16bits 32bits 64bits
정수 Byte Short Int Long
실수     Float Double
문자   Char    
부울값 Boolean      

- 문자열 : String

 

조건문

var test = 2
if (test == 2) {
   println("success")
} else {
   println("fail")
}

var test = if (분기 조건 추가) {
   조건 만족시의 결과 값 반환
} else {
   조건 불만족시의 결과 값 반환
}

 

When -> switcd 이다. 


val test = 95
When (test){
  95->println("95")
  94->println("94")
  else->println("fail")
}

or

val test = 95
When (test) {
  in 90 .. 100 -> println("90~100")
  in 80 .. 90-> println("80~90")
  else->println("fail")
}

배열과 컬렉션


Mutable : 가변

기본 : 불변

Colletion 하위에 -> List , Set, Map 이 중요함 

 

List 

val test1 = listOf<String>("1","2") //listOf 는 불변
println(test1.size) 

val test2 = mutableListOf<String>("1","2") //mutableListOf 는 가변 
test2.remove("1")
test2.add("3")
println(test2)

  Map

val test1 = mapOf<String, String>(
  "1" to "bug", "2" to "must be removed"
)

println(test1.get("1") //"bug"


val test2 = mutableMapOf<String>(
  "1" to "bug", "2" to "must be removed"
)
test2.put("3","!")
println(test2.get("1")) // "bug"

Set - 집합, list 와 비슷해 보이지만, 삽입 순서를 보장하지 않는다. 집합간의 교집합, 여집합 등을 구할때 용이하다. 

val test1 = setOf<Int>(1,2,3,4,5)
println(test1.size) //5

val test2 = mutableSetOf<Int>(1,2,3,4,5)
test2.add(10)
println(test2.contains(10)) //true

 

반복문

//for

var test = listOf(1,2,3)
for (index in test) {
   println(index)
}


//while 

var test = 3
while (test != 0) {
   test = test -1
}

 

 

함수 

//함수 구현

fun sum(a:int, b:int):int = {
   return a+b
}

//줄여 쓰기 1단계

fun sum(a:int,b:int):int = a+b

//줄여 쓰기 2단계

fun sum(a:int, b:int) = a+b

클래스 

//init을 사용한 초기화 방식

class Dog(name:String, age:Int) {
   var name: String
   var age: Int
   
   init {
      this.name = name
      this.age = age
   }
}
   
// constructor() 를 사용한 초기화 방식

class Dog(name:String, age:Int) {
   var name: String
   var age: Int
   
   constructor(name:String, age:Int) {
      this.name = name
      this.age = age
   }
}

classs 종류

Data class : 데이터 전달 용도로 활용 가능

Enum: 타입 구분 용도로 활용 가능. i.e. 성별 남녀

Abstract : 추상 클래스

Interface : Abstract와 비슷한 용도. 다수의 interface 상속 가능

 

접근 제한

Public: 전체 접근 가능

Private : 하당 .kt 파일 내에서 접근 가능

Internal : 같은 모듈 내리면 접근 가능

Proteted : Private + ㅏ상속받은 클래스 접근 가능

 

람다 함수 고차 함수 

 

람다 함수

익명함수라고도함 -> 익명이란 이름이 없다는 것

인터페이스 함수를 간단하게 구현하기 위한 장치 

 

고차 함수

함수를 인자로 받거나, 함수를 결과로 변환하는 함수 

 

 

//람다 함수, 고차 함수 

fun sweet(x: (int,int)->int, value:int):int { 
   return x(value,value+1)
}

fun main() {
   val candy = {x:int, y:int->x+y}
   val chocolate = {x:Int, y:Int->x*y}
   print(sweet(candy,2).toString()+"\n")
   print(sweet(chocolate,2))
}

 

list/collection 에서 처리 축출 삭제시 람다 함수를 자주 사용할 것이다. 

람다함수, 고차함수를 남용하는 것은, 나중에 코드 이해하는데 시간이 소요되어, 왠만하면 안쓴느 것을 추천한다.