6. 02 Kotlin 개발 철학
실용성
• 다른 언어에서 채택 후 검증된 해법과 기능 사용
• 특정 프로그래밍 스타일이나 패러다임을 강제하
지 않음
• IDE의 활용 강조 (간결한 코드패턴 제안)
간결성
• 불필요한 준비 코드를 적게
• 의도 파악이 쉬운 구문 구조 제공
• 코드 작성과 읽는 시간을 최대한 줄이자
안전성
• 적은 비용으로 높은 안정성을 달성
• 컴파일 시점에 최대한의 오류 가능성 발견
상호운용성
• 기존 라이브러리 그대로 사용 가능
• 다중 언어 프로젝트를 완전 지원
• 기존 라이브러리를 최대한 활용하며 기능 확장
8. 03 Kotlin 환경
Ant, Maven, Gradle, Kobalt, javascript 빌드 지원(intellij)
Build tool
기존 자바 프로젝트들이 사용하던 프레임워크 등 그대로 사용 가능
예) Spring, Netty, Guava, Log4j, Gson 등
Library
IntelliJ, Eclipse, Android Studio 에서 코틀린 플러그인 제공
Command Line Compiler 제공
IDE
jdk 1.6 ~ 1.8 지원
Jdk
코틀린은 2011년 7월 최초 개발 발표가 있었고 jetbrains회사에서 개발을 하였습니다.
kotlin이라는 이름은 러시아의 작은 섬이름을 따왔다고 하는데 자바처럼 섬이름으로 하고자 그렇게 정했다고 합니다.
기존 자바와 100% 호환되는 자바를 대신할 언어를 찾다가 개발이 시작 되었습니다.
javascript는 1.1부터 지원하고 코틀린 프로젝트를 jvm없이 실행되는 바이너리로 컴파일이 가능 합니다.
작년 5월 구글 io에서 안드로이드 공식언어로 채택되면서 많은 관심을 받고있는 언어입니다.
코틀린의 개발철학 4가지 실용성 간결성 안전성 상호운용성 입니다
실용성의 예를들면 ~
코틀린으로 작성한 코드를 빌드하여 js파일로 만들어서 사용 가능 합니다.
코틀린 컴파일러와 자바 컴파일러가 각각 코틀린 파일과 자바파일을 클래스로 만들고
여러jar와 kotlin runtime jar를 포함하여 배포가 됩니다. 크기가 900kb정도 입니다.
세미콜론을 사용하여도 되고 생략하여도 되지만 IDE에서는 생략을 추천합니다.
val 을 변경하려 하지만 불가, var는 같은 타입으로 변경 되지만 다른 타입으로 변경 불가
아래쪽에 보시면 명시적으로 타입이 지정 가능합니다.
fun1- 일반적인 함수형태로 파라미터, 리턴타입, 함수구현부를 가집니다.
fun2- 중괄호가 사라지고 식이 함수의 본문이 됩니다.
fun3- return 타입이 생략이 가능합니다.
fun4- 함수내부에 함수정의가 가능합니다.
Class1- 중괄호가 없이 바로 생성이 가능합니다.
Class2- 중괄호를 가지는 기본적인 형태의 클래스 입니다.
Class3- 클래스 선언시 constructor 키워드를 사용하여 default 생성자를 만들 수 있고
Class4- constructor 키워드를 생략한 모습 입니다.
Class5- 의 경우 open 키워드를 사용하여 final속성을 제거하여 상속이 가능한 상태 입니다.
Class6- open 키워드가 사용된 Class5를 상속하여 아래와 같이 부모의 변수에 접근한 모습입니다.
인터페이스1과 인터페이스2가 동일한 fun2라는 함수명을 가지고 있는데
두가지 인터페이스를 다중 상속하여도 어떤 부모의 함수를 실행할지 선택이 가능 합니다.
인터페이스1과 인터페이스2가 동일한 fun2라는 함수명을 가지고 있는데
두가지 인터페이스를 다중 상속하여도 어떤 부모의 함수를 실행할지 선택이 가능 합니다.
자바와 다르게 if, when(자바에서는 switch), try/catch 제어구조가 식이라 값을 가집니다
따라서 아래 예제로 보면 식이기에 연산이 가능한 것을 볼 수 있습니다.
자바 switch에선 불가능했던 객체비교가 가능하고
when 또한 if와 마찬가지로 식으로 값을 가집니다.
중괄호를 사용하여 로직이 있을경우 마지막 줄이 값으로 return 됩니다.
notnull 변수에는 절대 null이 들어갈 수 없게 컴파일러에서 잡아주고
함수 파라미터 또한 null값이 들어올 수 없게 잡아줍니다.
?.을 safe calls라고 부르는데 객체가 null이면 메소드call을 하지않고 null을 return 합니다.
?:는 엘비스 연산자라고 부르고 연산자 왼쪽의 값이 null이면 지정된 값을 return 합니다.
예제를 보시면 100일떄는 정상적으로 call chain이 수행되어 103 이라는 값이 나왔고
null일때는 엘비스 연산자에 의해 100이라는 값이 나온 것을 볼 수 있습니다.
notnull 변수에는 절대 null이 들어갈 수 없게 컴파일러에서 잡아주고
함수 파라미터 또한 null값이 들어올 수 없게 잡아줍니다.
특정 객체에 임의의 메소드를 확장하여 멤버 메소드처럼 호출 가능합니다.
문자열의 중간부를 구하는 함수를 임의로 구현하여
문자열.확장함수 형식으로 사용이 가능합니다. 제네릭 타입도 지원하여 다양하게 확장이 가능합니다.
뿐만 아니라 ++, += 등 연산식은 모두 가능 합니다.
포인트라는 객체에 operator 키워드를 사용한 plus 함수를 구현하여
객체간 + 연산이 가능한 모습입니다.
jdk1.8부터 지원하는 람다를 1.6에서도 사용할 수 있고
함수타입이 사용 가능하여 함수를 인자로 사용이 가능 합니다.
파라미터와 리턴타입을 정의해서 인자로 받는 print함수를 만들고
같은 형식의 함수 sum과 minus의 레퍼런스를 인자로 넘기는 식으로 사용이 가능 합니다.
문자열 내부에서 변수 사용과 연산이 가능합니다. if 또한 식이므로 바로 사용 가능합니다.
~~~ / 자바의 경우 이렇게 오버로딩 함수들을 전부 구현하거나,
메소드 호출시 null로 빈 파라미터를 채워서 호출 해야되는 번거로움이 있습니다.
data 키워드를 class앞에 붙이면 간단하게 vo를 만들어 줍니다.
디컴파일된 class를 보면
vo 사용시 기본적으로 구현해 주어야 할 메소드들을 자동으로 작성해 줍니다.
data 키워드를 class앞에 붙이면 간단하게 vo를 만들어 줍니다.
디컴파일된 class를 보면
vo 사용시 기본적으로 구현해 주어야 할 메소드들을 자동으로 작성해 줍니다.
인터페이스 Expr을 구현하는 클래스 num과 sum이 있는데
is 로 타입검사와 동시에 자동으로 캐스팅되어
해당하는 객체의 멤버가 사용 가능한 모습 입니다.
// 자바의 경우 instanceof로 검사하고 별도의 캐스팅을 거친후에 사용하는 번거로움이 있었습니다.
@Metadata = 코틀린 컴파일러가 class 파일 생성시 나타남. 컴파일러와 리플랙션이 사용