[Kotlin] 개념

He SEO·2022년 3월 15일
0

코틀린( Kotlin )은 2011년 7월 JetBrains사가 공개한 JVM에서 동작하는 프로그래밍 언어로서, 간결하고 실용적이며 자바코드와의 상호운용성( interoperability )를 중시한 언어.

특징

대상 플랫폼

  • 언어상의 코드 (특히 웹 애플리케이션의 백엔드)
  • 안드로이드 디바이스에서 실행되는 모바일 애플리케이션

Type

Statically typed 지정 언어
자바와 마찬가지로 코틀린도 정적 타입 지정 언어.
모든 프로그래밍 구성 요소의 타입을 컴파일 시점에 알 수 있고 프로그램 안에서 객체의 필드나 메소드를 사용할 때마다 컴파일러가 타입을 검증해줌.

정적 타입 지정 언어의 장점

  • 성능 : 실행 시점에 어떤 메소드를 호출할지 알아내는 과정이 필요 없으므로 메소드 호출이 더 빠름
  • 신뢰성 : 컴파일러가 프로그램의 정확성을 검증하기 때문에 실행 시 프로그램이 오류로 중단될 가능성이 더 적어짐
  • 도구 지원 : 도구는 더 정확한 코드 완성 기능을 제공할 수 있으며, IDE의 다른 지원 기능도 동적 타입 지정 언어에 비해 더 잘 만들 수 있음

Type Inference (타입 추론)

자바와 달리 코틀린에서는 모든 변수 타입을 프로그래머가 직접 명시할 필요가 없음. 코틀린 컴파일러가 문맥으로부터 변수 타입을 자동으로 유추할 수 있기 때문에 타입 선언을 생략해도 됨.

var x = 1 //int
var y = 7.5e //Double

Nullable Type

코틀린은 null이 될 수 있는 타입을 지원하므로 컴파일 시점에 null pointer exception이 발생할 수 있는지 여부를 검사할 수 있어서 프로그램의 신뢰성을 높일 수 있음.

// **?** : null 가능 
var a: String? = null
var b: String? = "bbb"
b = null

// null 불가능
var c: String = "ccc"
c = null //compile error (Null can not be a value of a non-null type String)
var d: String = null //compile error (Null can not be a value of a non-null type String)

Functional Programming

개념

  • First-class(일급 객체)인 함수

  • 함수를 일반 값처럼 다룰 수 있음. 함수를 변수에 저장할 수 있고 인자로 다른 함수에 전달할 수 있으며, 함수에서 새로운 함수를 만들어서 반환할 수 있음.

    //함수를 변수에 저장
    val test: () -> Unit = { println("kotlin") }
    
    //함수를 인자로 다른 함수에 전달
    fun test(func: () -> Unit) {
    	func()
    }
    
    //함수에서 함수를 반환
    fun test(): () -> Unit {
    	{ println("kotlin")}
    }
  • Immutablility (불변성)

    • 함수형 프로그래밍에서는 일단 만들어지고 나면 내부 상태가 절대로 바뀌지 않는 불변객체를 사용해 프로그램을 작성함
  • Side effect 없음

    • 함수형 프로그래밍에서는 입력이 같으면 항상 같은 출력을 내고 다른 객체의 상태를 변경하지 않음

    • 함수 외부나 다른 바깥 환경과 상호작용하지 않는 pure function(순수 함수)를 사용함

      //순수 함수
      fun getSum(a: Int, b: Int) = a + b
      
      //순수하지 않은 함수
      var a = 1
      fun getSum(c: Int) = a + c

이점

  • 간결성
    • imperative code (명령형 코드)에 비해 더 간결하고 우아함
    • 순수 함수를 값처럼 활용하면 더 강력한 추상화가 가능
    • 강력해진 추상화로 코드 중복을 막을 수 있음
  • Thread safe
    • 불변 데이터 구조를 사용하고 순수 함수를 데이터 구조에 적용하면 다중 스레드 환경에서 같은 데이터를 여러 스레드가 변경할 수 없음
  • 테스트 용이
    • side effect가 없기 때문에 setup code(준비 코드)가 필요없으며 독립적인 테스트 가능

Interoperability (상호 운용성)

  • 자바의 기존 라이브러리들을 그대로 사용 가능
  • 자체 컬렉션 라이브러리를 제공하지 않고, 자바 표준 라이브러리에 의존
  • 코틀린이 제공하는 도구도 다중 언어 프로젝트를 완전히 지원
    • 코틀린과 자바의 소스 파일이 임의로 섞여 있어서 제대로 프로그램 컴파일 가능

Kotlin Code Compile

kotlinc <소스파일 또는 디렉터리> -include-runtime -d <jar name>
java -jar <jar name>

Kotlin Runtime Library

코틀린 컴파일러로 컴파일한 코드는 코틀린 런타임 라이브러리에 의존함. 이 라이브러리에는 코틀린 자체 표준 라이브러리 클래스와 자바 API의 기능을 확장한 내용이 있음. 코틀린 컴파일한 애플리케이션을 배포할 때는 런타임 라이브러리도 함께 배포해야 함.

자바의 빌드 도구인 maven, gradle, ant 등을 사용하면 애플리케이션 패키징 시 알아서 코틀린 라이브러리를 포함시켜 줌.

문법

  • 문장 끝에 세미콜론을 넣지 않아도 됨
  • new 키워드를 쓰지 않고 객체 생성
  • 타입 추론이 가능
var a = 1
var b:Int = 2

Data class

  • get / set을 별도로 생성할 필요 없음 → lombok 라이브러리 사용할 필요 없음
    • var (variable) : read / write 모두 가능. 가변.
    • val (value) : read-only. 불변. final.
/* Java인 경우 */
class User() {
	String name = "";
	
	public void setName(String name) {
		this.name = name;
	}

	public void getName() {
		return this.name;
	}
}
/* Kotlin인 경우 */
Class User() {
	var name: String = ""
}

Lambda expression 지원

  • 함수를 선언하지 않고 곧바로 식으로 전달해서 표현 가능

Stream API 지원

  • Stream은 java 8 부터 추가된 기능으로 collection, array 등의 저장 요소를 하나씩 참조하여 lambda 를 적용하여 반복적으로 처리할 수 있도록 해주는 기능
/* 기존 java */
List<String> users = Arrays.asList("p1", "p2", "p3");

int rank = 0;
for (String user : users) {
	if (user.contains("2")) rank++;
}

System.out.println("rank : " + rank);
/* Stream 방식 */
List<String> users = Arrays.asList("p1", "p2", "p3");
int rank = 0;
rank = users.stream().filter(x -> x.contains("2")).count();
System.out.println("rank : " + rank);
profile
BACKEND 개발 기록 중. 감사합니다 😘

0개의 댓글