티스토리 뷰
var과 val의 차이
var은 계속 변경 가능
val은 "단 한번" 초기화 하면 그 다음부터는 절대 변경 불가능
코틀린의 null 처리
코틀린에서는 null을 사용할 수 없음.
var str:String = null ==> X
var str:String? = null ==> O
String과 String?는 다른 자료형임.
Str1?.length ? : -1
?:는 evlis 연산자로써 null이 아니면 왼쪽 null이면 오른쪽 ( 마치 삼항연산자 )
코틀린의 형변환
자바에서는 자동으로 형변환을 해주지만 코틀린에서는 형변환 메서드를 사용해야함.
var a : Int = 1
var b : Double = a // 오류!
b = a.toDouble() // OK!
기본형과 참조형의 자료형 비교 원리
값 비교 -> ==
참조 주소 비교 -> ===
var a : Int = 128
var b : Int = 128
일때 a===b 는 참일까 거짓일까?
답은 참. 왜냐면 기본 자료형(Primitive Data Type)의 경우 코틀린 컴파일러가
참조형으로 받아서 기본형으로 바꿔줌
참고로 코틀린은 무조건 참조형으로만 받음 ( 참조형 : 객체를 생성하고 heap 영역 메모리에 데이터를 둔 다음 참조하는 데이터 타입)
코틀린 꿀팁!
코틀린에서는 참조형으로 선언한 변수 값이 -128~127 사이의 값일 경우 캐시에 저장된다.
때문에 캐시에 저장되게 될 경우 참조형,일반형 타입이더라도 모두 같은 주소를 가리키게 된다.
스마트 캐스트
Number 자료형은 그 어떤 자료형도 다~ 받아줄 수 있음!!
자료형 검사
is 키워드
if( num is Int ) -> num이 Int라면 true, 아니면 false 반환
Any 자료형
Any 자료형은 코틀린 최상위 기본 클래스로써 어떤 자료형이라도 될 수 있는 특수 자료형.
이대 is를 사용하면 자료형을 검사한 자료형으로 스마트 캐스트 됌
val x: Any
x = "Hello"
if (x is String)
{
print(x.length)
}
as에 의한 스마트 캐스트
val x: String = y as String
y가 null이 아니라면 String으로 변환되어 x에 할당!
코틀린의 함수
Unit 자료형은 반환값이 없는 경우 주로 사용
fun printSum(a: Int, b: Int) : Unit
{
println("Sum of $a and $b is ${a+b}")
}
Unit과 Void의 차이점, void는 진짜 아무것도 반환 안하지만, Unit은 특수한 객체를 반환함
** 함수에서 받는쪽이 매개변수, 보내는 쪽이 인자 **
코틀린에는 가변인자(Variable Argument)라는 것이 존재
가변인자는 '인수의 개수가 변한다'라는 뜻임
매개 변수 왼쪽에 vararg라는 키워드를 붙이면 가변인자가 된다.
코틀린은 멀티 패러다임 언어다.
함수형 + 객체지향형이 합쳐진 언어다.
함수형에 대해서 알아보자.
함수형 프로그래밍은 [순수함수]를 사용하자는 것에서 부터 출발 했다.
순수 함수란
fun sum(a:Int, b:Int): Int
{
return a+b
}
위는 1. 같은 인자에 대해 항상 같은 값을 반환하며
2. 함수 외부의 어떤 상태도 바꾸지 않는다.
그렇다면 순수하지않은 함수란?
fun check()
{
val test = User.grade()
if( test != null) process(test)
}
여기서 User는 함수 외부에 있는 User 객체의 함수인 grade를 사용하고 있고,
process 함수는 조건을 만족하지 않으면 실행하지않는다.
check 함수만 봐서는 User가 어떤 객체이며, grade는 어떤 값을 반환하는지?, process 함수는 무엇을 하는지 알 수 없다.
즉, check 함수의 실행결과를 예측하기가 어렵다. 이것이 바로 순수 함수의 조건을 만족하지 못하는 함수이다.
람다식
{x,y -> x+ y}
이름이 없는 함수
일급 객체
함수형 프로그래밍에서 함수와 람다식은 일급객체로 지정한다.
일급객체의 특징
1. 일급 객체는 함수의 인자로 전달할 수 있다.
2. 일급 객체는 함수의 반환값에 사용할 수 있다.
3. 일급 객체는 변수에 담을 수 있다.
고차 함수
고차함수란 다른 함수를 인자로 사용하거나 함수를 결괏값으로 반환하는 함수를 의미한다.
:: 을 이용해 소괄호와 인자를 생략할 수 있다.
즉,
fun funcParam(a: Int, b: Int, c: (Int,Int) -> Int): Int
{
reurn c(a,b)
}
라는 함수가 있을때
val a = funcParam(3,2,sum)을 하면 에러를 발생시킨다.
sum은 람다식이 아니기 때문이다.
하지만 val a = funcParam(3,2::sum)을 하면 가능하다. 이때는 람다식을 생략 가능하다.
그럼 이런 것도 가능해진다.
fun sum(a:Int, b:Int) = a+b
** 참고 : 함수 선언시, return 타입을 명시하지않는 경우 리턴을 생략하고 =를 두어 바디를 따로 작성하지 않아도 된다.
val likeLamda = ::sum 도 가능하다! 함수를 일반 변수값 처럼 할당시켜 버린다.
print(likeLamda(6,6))
코틀린에서 함수를 호출할때 사용가능한 세가지 방법
1. 람다 생략 hello(::text)
2. 람다 포함 hello({a,b->text(a,b)})
3. 소괄호 생략 람다 포함 hello {a,b -> text(a,b)}
매개변수가 1개인 경우
람다함수 호출시에 $it의 표현
oneParam({ a-> "Hello world $a"})
==
oneParam{"Hello World $it"} 는 동일
매개변수가 2개인 경우
이때는 $it 생략 불가능
만약 사용하고 싶지 않은 매개변수가 있다면,
morePram { _, b -> "Hello world $b" } 표현 가능
_ 를 통해 대체 가능하다.
함수안에 람다식을 매개변수로 넣을 경우, 만약 함수의 마지막 매개변수가 람다식 함수라면
람다식 함수를 괄호바깥으로 빼낼 수 있다. 즉
withArgs("Arg1","Arg2") {a,b -> " Hello World $a $b " }