Kotlin - Kotlin이란?

이동수·2024년 8월 18일

Kotlin

목록 보기
1/33
post-thumbnail

코틀린 도입

  • 2017.5.18에 구글이 안드로이드 공식 언어로 코틀린을 추가
  • 안드로이드 스튜디오 3.0부터 코틀린이 기본적으로 지원시작함

하이브리드 언어 = oop + 함수형 프로그래밍


정적 타입 언어(Statically Typed Language) - Kotlin

  • 컴파일 시점에 변수,필드,메서드,함수타입을 verifivation함
  • type inference를 컴파일 시점에 지원한다
    • val a = 5 (컴파일시 int타입을 추론해 a에 대입)
    • c, c++, c#, java, haskell, scala

동적타입언어(dynamically typed Language)

  • 컴파일 시점이 아닌 runtime(실행)시 타입이 확정
  • perl, ruby, python, javascript, java

정적 타입 언어 장점

Performance, Correctness, Refactoring

  • 컴파일시 타입들이 결정되므로 런타임시 따로 체크할 필요가 없어 동적타입언어보다 성능이 좋다
  • 컴파일시 프로그램의 정확성을 검증하므로 실행 시 오류, 중단의 가능성이 적음
  • 정적타입언어는 IDE에서 리팩토링을 지원하므로 안전한 코드완성 기능을 제공해 개발 생산성 향상에도 유리

Kotlin 장점

  1. 간결함
  • 자바에서는 data class를 만들려면 getters,setters를 만들고 equals(), hashCode(), toString(), copy() 등을 재정의 해줘야 하는데 코틀린에서는 data class Customer(val name: String, val email: String)으로 끝.
  • 람다도 java언어보다 짧다.
    • val positiveNumbers = list.filter { it > 0 }
  • object를 통해 싱글톤 지원
    object a {
    	val	a = "ss"
    }
  1. 안전함
  • null
    • null포인트 가능성을 줄여줌

    • null을 넣어서 null포인트 처리 x

      var a: String
      a = null //컴파일 에러
      val a: String? = null
      print(a.length()) //컴파일 에러 - null일수도 있으니
  1. 자바와 100% 호환
  2. 강력한 tool 사용가능

코틀린 특징[mutli/cross platform]

하이브리드 언어 = oop + 함수형 프로그래밍

KMP

  • 네이티브 프로그맹의 유연성과 이점을 유지하면서 다양한 플랫폼에 같은 코드를 적용하여 유지 관리하는데 소요되는 시간을 줄임
  • server, android, ios, desktop, web

나는 크로스 플랫폼이 아니라 네이티브 개발자이다

코틀린이 원하는 세상 - 멀티 플랫폼 세상

코틀린 with IOT

  • 코틀린 코드를 vm없이실행할 수 있는 네이티브 바이너리로 컴파일 하는 기술 (임베디드(IOT) 플랫폼)
  • 코틀린 컴파일러 및 코틀린 표준 라이브러리의 기본 구현을 위한 LLVM 기반 기술 제공

코틀린 For Data Science

  • 데이터 엔지니어링, 데이터 분석, 머신 러닝, 시각화 제공
  • 데이터 분석 도구인 jupyter & apche zeppelin 지원

코틀린 Frameworks for Server-side Development with Kotlin

  • JEE(J2EE)를 Kotlin으로 구현
  • Kotlin 지원 프레임워크
    • 스프링 & 스프링부트 (우리는 스프링 왕국 ㅠㅠ)
    • Ktor
    • Javalin
    • DSL Html

Kotlin for JavaScript

  • JavaScript code를 Kotlin으로 개발 가능
  • 다양한 JavaScript Library 사용 가능 (react 등)
  • Html코드도 Kotlin 방식으로 코딩 가능 (Kotlin DSL)

Intellij

ultimate

  • 풀스택용
  • 한달뒤면 못씀
  • 웹 및 엔터프라이즈 개발용

community

  • jvm 및 Android 개발

기본 프로젝트 구조

한 프로젝트는 여러개의 모듈이있고 그안에는 리소스파일,폴더,파일들이 있다(물리적구조)

패키지(논리적구조)

  • 서비스 도메인 youtube.com 이면 ->com.youtube.dongsuproject
    기능별 세분화 ->com.youtube.dongsuproject.gogo
    기능별 세분화 ->com.youtube.dongsuproject.back

package 안적으면 디폴트 패키지로 적용
코틀린 - 폴더구조와 패키지명을 일치시키지 않아도됨 (패키지 이름만 같으면됨)
패키지안에서는 변수, 함수 ,클래스 그냥 다 공유가능( 패키지 다르면 못씀 )
그럴땐 import해서 써야함
코틀린은 클래스명과 파일명이 일치하지 않아도됨
하나의 파일에 여러개 클래스 넣어도 됨


식(Expression)과 문장(Statement)

Kotlin 표현식

kotlin에서 표현식(expression)은 변수, 연산자로 구성되어 단일 값을 리턴하는 코딩표현을 의미

val sum:Int
 sum = 21 + 27
 ---
 evenOrOdd = if(randomValue % 2 == 0) "짝수" else "홀수
  • 21+27은 int값을 반환하는 표현식
  • if,when,try는 문장이 아니라 표현식
    • kotlin은 삼항연산자가 존재하지 않음(n>5 ? 9:2 ← 없음)

Kotlin 문장

프로그래밍에서 문장은 수행 할 작업을 나타내는 명령형 프로그래밍언어의 가장 작은 독립된 실행 형 요소

val sum = 21 + 27   ----> 문장
val evenOdd = if(randomValue % 2 == 0) "짝수" else "홀수“  ------> 문장
  • 21 + 27 연산을 실행하여 하나의 값(48 Single value)을 리턴하고 sum
    변수에 할당하는 독립된 명령집합이므로 21 + 27은 식이고 val
    sum=21+27전체는 문장
  • 완전한 실행단위를 구성하는 모든 것은 문장(Statement)
  • 식(Expression)은 문장(Statement)의 한 부분
  • Statement >= Expression

코틀린 간단히 둘러보기

  • 함수형 언어
    • 절차지향 - 알고리즘과 로직 중심으로 문제 해결(c, pascal)
    • 객체지향 - 클래스 중심으로 알고리즘과 로직을 모아서 처리 (c++, c#, java)
    • 함수형 - 로직의 흐름에 따라 함수의 선언과 데이터의 유기적 연계(kotlin, 스칼라)
  • 패키지 정의
    • 디렉터리와 패키지를 일치시키지 않아도 됨 ————————> ????????????????
  • 함수 정의
    • 함수는 fun 키워드로 정의
    • 함수 몸체가 식인 경우 return 생략가능. 이런경우 return type이 추론됨
      • fun sum(a: Int, b: Int) = a + b
    • 리턴값이 없으면 Unit(Object)로 리턴함. (Unit은 java에서 void 리턴 역할, Unit 생략가능)
      fun a: Unit {
      	println("aaa")
      }
  • 지역 변수 정의
    • val(value) : 읽기전용, 값 할당이 1회만 가능, java final과 유사, Assign-once변수

      val a: Int = 1 //즉시할당
      val b: = 2 //type추론
      val c: Int //컴파일 오류 - 초기화필요
      c = 3 //컴파일 오류 - 읽기전용
    • var(variable) : Mutable 변수, 값 변함, Mutable변수

  • 주석
    • // : java와 같음

    • /* */ (block comment) : java와 다르게 중첩 가능

      /*ㅁㄴㅇ
      	/* ㅁㄴㅇㅁㄴㅇㄴ*/ 
      */
  • 문자열 템플릿 ——————————> ????????????????????
    • 문자열 보간법 (String Interpolation)

      var a = 1
      val s1 = "a is $a"
      a = 2
      val s2 = "${s1.replace("is","was")}, but now is $a"
  • 조건문
    • a>b이면 a 아니면 b
    • 조건식으로 가능 (return 없애기) fun maxOf(a:Int, b: Int) = if (a>b) a else b
  • nullable : null일수도 있다는 뜻. 값이 null일수 있는 경우 타입에 nullable 마크를 명시해야함
    • 가능하면 캐션 마크로 선언하지마, null이 아니도록 프로그래밍

    • 리턴값이 정수가 아니면 null리턴 시키기.

      fun a(str:String): Int? {
      	//정수가 아닌 경우 null을 리턴
      }
    • nullable 타입의 변수를 접근할 때는 반드시 null체크를 해야함. 그렇지 않으면 컴파일 오류 발생

      val x: Int? = number
      	if(x != null){ //nullable타입 변수니까
      }
      else{
      }
  • 자동 타입 변환
    • 타입 체크만 해도 자동으로 타입 변환이 됨

      fun a(b:Any): Int? {
      	if(b is String){ //b가 String이라면? 
      		//b가 자동으로 String타입으로 변환됨
      		return b.length
      	}
      	return null
      }
  • when 표현
    • java의 switch case랑 비슷한데 다름. when은 모든게 지원됨

      when(a){
      1 ->
      "a" ->
      is Long ->
      !is Long ->
      else ->
      }
  • ranges
    • in연산자를 이용해 숫자 범위 체크

      val x = 3
      if(x in 1..10){
      }
    • range를 이용한 loop

      for(x in 1..5){
      }
  • collections
    • 컬렉션도 in으로 loop가능

      val items = listOf("a","b","c")
      for (item in items){
      	print(item)
      }
    • in으로 해당값이 collection에 포함 되나 체크 가능

      val items = setOf("a","b","c")
      when {
       "e" in items -> print("good")
       }
    • 람다식을 이용해 컬렉션에 filter, map등의 연산 가능

      items.filter { it. startsWith("a")}
      .sortedBy { it }
      .map { it.toUpperCase() }
      .forEach { println(it) }

0개의 댓글