[Kotlin] 코틀린에서 변수와 타입, 연산자
1. 코를린에서 변수를 다루는 방법
1 - 1. 변수 선언 키워드 - var 과 val의 차이점
Java
long number1 = 10L;
final long number2 = 10L;
Long number3 = 1_000L;
Person person = new Person("김지수");
Java에서 long과 final long 의 차이점은 변수가 가변인가, 불변인가의 차이점이 있습니다.
Kotlin
fun main() {
var number1 = 10L
val number2 = 20L
number1 = 20L
number2 = 20L // error
}
var 키워드는 가변으로 새로운 값을 할당할 수 있지만 val 키워드는 불변으로 재할당을 못한다.
1 - 2. 코틀린에서의 Primitive Type
코틀린에서는 refference Type의 연산의 경우 내부적으로 Primitive Type으로 변환해준다.
프로그래머가 boxing/ unboxing을 고려하지 않아도 되도록 코틀린이 알아서 처리 해준다.
1 - 3. 코틀린에서의 null 타입 변수
var number3: Long? = 10L
number3 = null
위와 같이 ?를 통해 널이 들어갈 수 있는 변수라고 선언해줘야한다.
1 - 4. 코틀린에서의 객체 인스턴스화
var person = Person("김지수")
코틀린에서는 객체 인스턴스화 할 시 new 키워드를 붙이지 않는다.
2. 코틀린에서 null을 다루는 방법
2 - 1. Safe Call 과 Elvis 연산자
// 1. safe call
val str: String? = "ABC"
str?.length
// Elvis 연산자
val str2: String? = "ABC"
str2?.length ?: 0
널이 들어갈 수 있는 타입의 변수는 safe call을 통해 사용할 수 있다.
Elvis 연산자는 자바의 삼항 연산자 같이 safe call은 해준뒤 만약 널이라면 뒤에 값을 사용하는 연산자이다.
2 - 2. 널 아닐시
val str: String? = "ABC"
str!!.startsWith("A")
2 - 3. 플랫폼 타입언어
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
@Nullable
public String getName() {
return this.name;
}
}
위는 자바 코드이다.
@Nullable 같이 널에 대해 알려준다면 코틀린이 컴파일 시점에서 널 타입을 체크해주지만 어노테이션이 없다면
컴파일 시점에서는 에러가 안나지만 런타임시에 에러가 날 수 있다.
3. 코틀린에서 타입을 다루는 방법
1. 기본 타입
Java에서 기본 타입같의 변환은 암시적으로 이루어질 수 있지만,
코틀린에서는 명시적으로 이루어져야 한다.
val number1: Int? = 3
val number2 = number1?.toLong() ?: 0L
println(number5)
toInt(), toLong() 등등 메서드를 활용한다.
2. 타입 캐스팅
fun printNameIfPerson(obj: Any) {
if (obj is Person) {
val person = obj as Person
println(person.name)
}
}
obj is Person -> Java 에서 instanceof 와 같은 의미이다.
obj as Person -> Java 에서 (Person) obj 와 같은 의미이다.(생략가능) 스마트 캐스트
타입 검사 및 null 대응 코드
// 1번 방법
fun printNameIfPerson(obj: Any) {
if (obj !is Person) {
val person = obj as Person
println(person.name)
}
}
// 2번 방법
fun printNameIfPerson(obj: Any?){
val person = obj as? Person
println(person?.ame)
}
1번 방법은 !is 를 통해 부정을 해주어서 Person 타입이 아닐때 사용을하고
2번 방법은 null 이 들어왔을때 엘비스 연산을 통해 null을 반환해준다.
2 - 3. 코틀린의 3가지 타입
ANY
자바의 Object의 역할( 모든 객체의 최상위 타입)
모든 Primitive Type의 최상위 타입도 Any이다.
Any 자체로는 null을 포함할 수 없어 null을 포함하고 싶다면 Any?로 표현
Any에 equals / hashCode / toString 존재
Unit
자바의 void와 동일한 역할
void와 다르게 그 자체로 타입 인자로 사용 가능하다.
함수형 프로그래밍에서 Unit은 단 하나의 인스턴스만 갖는 타입을 의미. 즉 코틀린의 Unit은 실제 존재하는 타입이라는것을 표현
Nothing
함수가 정상적으로 끝나지 않았다는 사실을 표현
무조건 예외를 반환하는 함수 / 무한 루프 함수 등
String interpolation / String indexing
val name = "김지수"
val age = 27
val log = "내 이름은: $name,나이: $age"
${변수}를 사용할 수 있다.
val str = """
안녕
""".trimIndent()
엔터를 생략하고 값을 가져온다.
val str = "ABC"
println(str[0])
스트링의 인덱스를 가져올 수 있다.
4. 코틀린에서 연산자를 다루는 방법
4 - 1. 단항 연산자 / 산술 연산자
단항 연산자
- ++
- --
산술 연산자
- +
- -
- *
- /
- %
산술대입 연산자
- +=
- -=
- *=
- /=
- %=
비교 연산자
- >
- <
- >=
- <=
비교 연산자 사용시 자동으로 compareTo를 호출해준다.
4 - 2. 비교 연산자와 동등성, 동일성
동등성(Equals) : 두 객체의 값이 같은가?
동일성(Identity) : 완전한 동일한 객체인가? 주소값이 같은가?
자바에서는 동일성에 ==, 동등성에 equals 를 사용
코틀린에서는 동일성에 ===를 사용 동등성에 == 를 호출한다. 동등성에 == 를 호출하면 간접적으로 equals를 호출해줌.
4 - 3. 논리 연산자 / 코틀린에 있는 특이한 연산자
- &&
- ||
- !
- in
- !in
- a..b
in 과 !in은 컬렉션이나 범위에 포함되어 있다, 포함되어 있지 않다는 뜻이다.
a..b는 a부터 b 까지의 범위 객체를 생성한다.
4 - 4. 연산자 오버로딩
data class Person(
val age: Int
) {
operator fun plus(person: Person): Person {
return Person(age + person.age)
}
}
val person1= Person(10)
val person2= Person(20)
print(person1 + person2)