코틀린에서 변수를 다루는 방법
1. 변수 선언 키워드
- var : 변경 가능한 변수
//java
long number1 = 10L;
//kotlin
var number1 = 10L
- val : 변경 불가능한 변수
//java
final long number1 = 10L;
//kotlin
val number1 = 10L
변수 추론
- java 에서는 String,Long 같은 Type 을 지정해줘야하지만 kotlin 에서는 지정할 필요가 없다
- 그것을 가능하게 만드는것이 “변수 추론”
var number1 = 10L //이미 "10L" 이라는 값을 통해서 number1 이 "Long" Type 인것을 알 수 있다.
var number1: Long //값이 없을 경우 : 를 통해 number1 의 Type 을 지정해 줄 수 있다.
- 코틀린의 타입 추론은 다음과 같은 원리를 기반으로 작동합니다
- 리터럴 값: 리터럴 값 자체가 타입을 명확히 정의합니다.
- 표현식: 표현식의 결과 타입을 분석하여 추론합니다.
- 함수 반환 타입: 함수의 반환 타입을 기반으로 추론합니다.
- 컬렉션 타입: 컬렉션의 요소 타입을 통해 추론합니다.
- 람다 표현식: 람다 표현식의 파라미터와 반환 타입을 분석하여 추론합니다.
fun main() {
// 리터럴 값을 통한 타입 추론
val number = 42 // Int로 추론
val pi = 3.14159 // Double로 추론
val greeting = "Hello, World!" // String으로 추론
// 표현식을 통한 타입 추론
val sum = 10 + 20 // Int로 추론
val message = greeting + " How are you?" // String으로 추론
// 함수 호출을 통한 타입 추론
fun add(a: Int, b: Int): Int {
return a + b
}
val result = add(5, 10) // Int로 추론
// 컬렉션을 통한 타입 추론
val numbers = listOf(1, 2, 3, 4, 5) // List<Int>로 추론
val names = setOf("Alice", "Bob", "Charlie") // Set<String>으로 추론
// 람다 표현식을 통한 타입 추론
val isEven = { n: Int -> n % 2 == 0 } // (Int) -> Boolean으로 추론
}
val 과 element
- val 은 final 과 동일하게 사용됨으로써 val 로 선언하더라도 element 를 추가할 수 있다.
// final list 선언
List<String> names = new ArrayList<>();
//element 에 값 추가
names.add("JS");
// val 리스트 선언
val languages = mutableListOf<String>()
// 리스트에 "JS" 값을 추가
languages.add("JS")
!!모든 변수는 우선 val 로 만들고 꼭 필요한 경우 var 로 변경한다.!!
2. Kotlin 에서의 Primitive Type
- Java 에서는 primitive type 인 “long” 과 reference type 인 “Long” 이 있다.
- 그러나 kotlin 에서는 둘다 var, val 로 표현된다.
//java
long number1 = 10L;
Long number3 = 1_000L;
//kotlin
var number1 = 10L
val number3 = 1_000L
- kotlin 에서는 프로그래머가 boxing / unboxing 을 고려하지 않아도 되도록 Kotlin 이 알아서 처리해준다.
3. Kotlin 에서의 nullable 변수
- Kotlin 에서 null 이 변수에 들어가 수 있다면 “타입?” 를 사용해야 한다.
- “타입?” 을 선언하면 reference type 이 된다.
var number3: Long? = 1_000L //java 에서 Long
var number1: Long = 1_000L //java 에서 long
4. Kotlin 에서의 객체 인스턴스화
- Kotlin 에서 객체 인스턴스화를 할 때에는 new 를 부팅지 않아야 한다.
//java
Person person = new Person("JS");
//kotlin
val person = Person("JS")
코틀린에서 null을 다루는 방법
1. Kotlin 에서의 null 체크
//java
public boolean startsWithA1(String str) {
if (str == null) {
throw new IllegalArgumentException("null이 들어왔습니다");
}
return str.startsWith("A");
}
//kotlin
fun startsWithA1(str: String?): Boolean {
if(str == null){
throw IllegalArgumentException("null 이 들어왔습니다")
}
return str.startsWith("A");
}
//java
public Boolean startsWithA2(String str) {
if (str == null) {
return null;
}
return str.startsWith("A");
}
//kotlin
fun startsWithA2(str: String?): Boolean? {
if(str == null){
return null
}
return str.startsWith("A");
}
//java
public boolean startsWithA3(String str) {
if (str == null) {
return false;
}
return str.startsWith("A");
}
//kotlin
fun startsWithA3(str: String?): Boolean {
if(str == null){
return false
}
return str.startsWith("A");
}
2. Safe Call 과 Elvis 연산자
- Safe Call
- null 이 아니면 실행하고, null이면 실행하지 않는다(그대로 null)
val str: String? = "ABC"
str.length //불가능
str?.length //가능
- Elvis 연산자
- 앞의 연산 결과가 null이면 뒤에 값을 사용
val str: String? = "ABC"
str?.length ?: 0
위 코드를 Safe Call, Elvis 를 이용해서 수정하면
//java
public boolean startsWithA1(String str) {
if (str == null) {
throw new IllegalArgumentException("null이 들어왔습니다");
}
return str.startsWith("A");
}
//kotlin
fun startsWithA1(str: String?): Boolean {
str?.startsWith("A") ?: throw IllegalArgumentException("null이 들어왔습니다")
}
//java
public Boolean startsWithA2(String str) {
if (str == null) {
return null;
}
return str.startsWith("A");
}
//kotlin
fun startsWithA2(str: String?): Boolean? {
return str.startsWith("A");
}
//java
public boolean startsWithA3(String str) {
if (str == null) {
return false;
}
return str.startsWith("A");
}
//kotlin
fun startsWithA3(str: String?): Boolean {
return str?.startsWith("A") ?: false;
}
3. 널 아님 단언!!
- str 이 절대 널이 들어올 수 없다는 선언
- 만약에 이곳에 null 이 들어온다면 Error
fun startsWith(str: String?): Boolean{
return str!!.startsWith("A")
}
4. 플랫폼 타입
Kotlin 에서 Java 문을 사용한다면?
Java 코드를 Kotlin 에서 이해하고 사용한다.
public class Person {
private final String name;
public Person(String name) {
this.name = name;
}
@Nullable //Java 코드에서 null 허용 어노테이션 선언시
public String getName() {
return name;
}
}
fun main(){
var person = Person("JS")
startsWithA(person.name) //이곳에서 에러가 발생함
}
fun startsWithA(str: String): Boolean {
return str.startsWith("A")
}