코틀린이란?
JetBrain 사(IntelliJ 개발사)가 만든 JVM 언어로, 만들 게 된 계기는 자바의 발전이 느려졌고 유용한 기능이 자바에 없기 때문에 개발
코틀린의 주목적
코틀린의 주목적은 현재 자바가 사용되고 있는 몯느 용도에 적합하면서도 더 간결하고 생산적이며 안전한 대체 언어를 제공합니다.
함수형 프로그래밍
함수형 프로그래밍 패러다임은 함수를 기존 다른 값(int, boolean, float, Object 등)과 마찬가지로 다룬다는 생각에서 비롯된 패러다임
특징
- 함수를 다른 하수의 인수로 넘길 수 있음
- 지역적으로 함수를 선언할 수 있습니다.
- 변수에 저장할 수 있습니다.
- 함수가 함수를 반환할 수 있습니다.
=> 부수 효과가 없는 순수함수를 의미하며, 순수함수를 1급 객체로 간주하여 파라미터나 반환값으로 사용하며, 참조 투명성을 지킬 수 있음
기존 명령형 프로그래밍
// 1 ~ 10까지의 값이 출력
for(int i = 1 ; i < 10; i++){
System.out.println(i);
}
함수형 프로그래밍
// 1 ~ 10까지의 값이 출력
process(10, print(num));
코틀린 특징
안정성
- Null의 사용을 제할 할 수 있으며 NullPointerException 에외를 처리하기 용이
간결성과 표현력
상호운용성
다중 패러다임
코틀린 지원 기능
코루틴(Conlutine)
- ASYNC/AWAIT, future, promise, actor 등의 동시성 관련 프로그래밍 패턴 지원
- 스레드에 대해 더 쉬운 대안
- 유영한 스레드 디스패치 메커니즘
- 일시 중단 간으한 시퀀스와 이터레이터
- 채널을 사용한 메모리 공유
- 액터를 통해 메시지 저송 방식으로 상태 공유
테스트
- 테스트를 정의하거나 객체를 모킹하고 싶을 때 Junit, Testing, Mockito 같은 익숙한 자바 테스트 프레임워크중 일부를 아무런 노력을 기울이지 않고 코틀린에 적용할 수 있다.
코틀린 문법
/*변수 정의*/
val tistoryName = "창민이 개발일지"
val tistoryAge:Int = 2022
val tistoryDesc:String
var sum = 1
sum = sum + 1
sum = "hello" // Error : assigning String value to Int variable
- val 키워드: 값을 뜻하는 value에서 유래
- 새미롤론 생략 가능
- 타입을 지정해주지 않아도 자동으로 타입을 지정(타입추론)
- 초기값 생략시 타입 지정해주어야됨
- var 키워드 사용시 가변 변수로 사용 가능 (단 한번 초기화한 타입 값만 사용 가능)
코틀린 프로그램
fun main(){
val a = readLine()!!.toInt()
val b = readLine()!!.toInt()
println(a + b)
}
- !!는 널 아님 단언(not-null assertion)으로, 널 일 경우 예외 발생
자바 VS 코틀린
코틀린의 대입은 표현식(statement)이 아니라 문(statement)
- 자바와 달리 코틀린 대입은 문(statement)여서, 아무 값도 돌려주지 않는다.
- 그로 인해 코틀린에서는 a = b = c 와 같은 대입문 연쇄를 쓸 수 없다.
표현식(Expression) VS 문(statement)
표현식(Expression)
- 표현식은 값으로 평가될 수 있는 문(statement)
- 즉, 표현식이 평가되면 새로운 값을 생성하거나 기존 값을 참조
- 표현식은 리터럴, 식별자(변수, 함수 등의 이름), 연산자, 함수 호출등의 조합으로 이뤄질 수 있음
- 표현식도 문의 일종
val score = 100;
val score = 50 + 50;
val score = sum(50,50)
문(statement)
- 프로그램을 구성하는 기본 단위이자 최소 실행 단위
- 명령문이라고도 부른다.
// 변수 선언문
var x:Int
// 할당문
x = 5;
//함수 선언문
function foo() {}
// 조건문
if (x > 1){}
// 반복문
for (let i=0; i< 2; i++){}
코틀린 기본 타입
자바에서는 int의 원시타입과 String 같은 클래스 기반 참조타입사이에 명확한 구분이 있지만, 코틀린에는 똑같은 타입이 문맥에 따라 원시타입 또는 참조타입을 가리키므로 구분이 모호하다. 자바는 원시타입을 감싸는 특별한 박싱타입(Integer)이 있지만, 코틀린은 필요할때 암시적으로 박싱을 수행한다.
정수 타입
-Byte
- Short
- Int
- Long
부동수수점
- Float
- Double
char 연산
var a = 'a'
var h = 'h'
println(a + 5) // f
println(a - 5) // \
println( h - a) // 7
println(--h) // g
println(++a) // b
Boolean 과 논리 연산
val hasErrors = false;
val testPassed = true;
println(( x == 1 ) or ( y == 1 )) // true
println(( x == 0 ) || ( y == 0 )) // false
println(( x == 1 ) and ( y != 1 )) // true
println(( x == 1 ) and ( y == 1 )) // false
println(( x == 1 ) xor ( y == 1 )) // true
println(( x == 1 ) xor ( y != 1 )) // false
println( x == 1 || y / (x - 1) != 1) // true
println( x != 1 && y / (x - 1) != 1) // false
비교와 동등성
- == : 같다.
- != : 같지 않다.
- < : ~ 보다 작다
- <= : ~ 보다 작거나 같다.
- > : ~ 보다 크다
- >= : ~보다 크거나 같다.
val a = 1 // Int
val b = 2L //Long
println( a == b ) // Error : comparing Int and long
println(a.toLong() == b) // Ok : 두 타입 모두 Long 임
리스트
val squares = Array(size) { (it + 1)*(it + 1) }
// 1,4,9 ...
// 배열타입
val squares = arrayOf( 1, 4, 9, 16 )
squares.size // 4
squares.lasIndex // 3
squares[3] // 16
squares[1] // 4
// 배열 참조
val numbers = squares
numbers[0] = 1000 // 바뀐 데이터가 squares와 numbers에 공유됨
println(squares[0]) //prints 1000
// 다른 타입의 배열은 대입이 안된다.
val a = arrayOf(1, 4, 9, 16)
a = arrayOf("one", "two") // Error : can't assign Array<String> to Array<Int>
// 배열 복제
val numbers = squares.copyOf()
numbers[0] = 1000 // squares에는 영향이 없다.
squares.copyOf(2) // 뒤가 잘림 1, 4
squares.copyOf(5) // 부족한 부분에 0이 채워짐 1, 4, 9, 16, 0
// 자바는 상위 타입의 배열에서 하위 타입 배열을 대입할수 있었지만 코틀린에서는 런타임 에러 사전 방지를 위해 막아둠
Object[] objects = new String[] { "one", "two", "three" };
objects[0] = new Object() ; // ArrayStoreException 예외 발생
함수(Functions)
fun 함수명(변수): Unit{
}
// void 함수
// Unit 생략 가능
fun 함수명(변수): 리턴타입 {
return 값
}
// Ex
fun sum(a: Int, b: Int):Int {
return a + b
}
단일표현식(single-expression functions)
- 중괄호로 Block을 감싸는 대신 = 을 사용하여 함수를 정의할 수 있습니다.
fun sum(a: Int, b: Int): Int = a + b
fun sum(a: Int, b: Int) = a + b
가변 인자와 스프레드 연산자
// 가변 인자
fun sumAll(vararg n: Int): Int {
return n.sum()
}
println(sumAll(1, 2, 3, 4, 5))
// 스프레드 연산자
val list = intArrayOf(1, 2, 3, 4, 5)
println(sumAll(*list))
기본 매개변수(Default Argument)
fun sum(
a: Int = 0,
b: Int = 0
) = a + b
네임드 매개변수(Named Argument)
sum(b = 5)
지역함수
fun foo() {
fun bar() {
println("Hello, world!")
}
bar()
}
클래스
주생성자
class Member(email: String, username: String) {
val email = email
var username = username
}
class Member(val email: String, var username: String) {
}
class Member(val email: String, var username: String)
Getter/Setter
- Java와 달리 자동으로 정희해주므로, 별도의 메소드를 저의할 필요가 없음
val member = Member("devhudi@gmail.com", "hudi")
println(member.email) // Getter 사용
member.username = "devHudi" // Setter 사용
'Computer Science' 카테고리의 다른 글
Mysql 풀텍스트인덱스(Full-Text Index) (0) | 2024.05.08 |
---|---|
클로저(Closure) (0) | 2024.04.24 |
코루틴(Coroutine) (0) | 2024.04.24 |
순수함수(Pure Function) (0) | 2024.04.10 |
병렬처리(Parallel Processing) (0) | 2023.04.06 |