java -> kotlin
코틀린을 공부하다보니 내가 자바코드를 굉장히 불안전하게 사용하고 있었음을 느끼게되었다.
null 을 다루지 말고, final 이라든지 @NotNull 이라든지 @Nullable 이라든지 좀 더 데이터를 정확하고 안전하게 다루어야겠다.
내용은 다음 강의를 보고 정리 하였다.
java | -> | kotlin |
long | -> | var |
final long | -> | val |
long number = 10L; | -> | var number : Long = 10L var number = 10L |
Long number = null; | -> | var number : Long? = null |
Person person = new Person("~~~"); | -> | var person = Person("~~~") |
public boolean startsWithA1(String str) { if (str == null) { throw new IllegalArgumentException(); } return str.startsWith("A"); } |
-> | fun startsWithA1(str : String?) : Boolean { if (str == null) { throw new IllegalArgumentException(); } return str.startsWith("A") } |
void printAgeIfPerson { if (obj instanceof Person) { Person person = (Person) obj; System.out.println(person.getAge()); } } |
fun printAgeIfPerson(obj : Any) { if ( obj is Person) { val persion = obj as Person //as Person 생략 가능 //->if 에서 체크했기에 (스마트캐스트) println(person.age) } } |
Safe call
var str : String ? = null
printn(str ? . length)
--> 출력 null
즉 ? . 은 safe call 로써 str 이 null 이면 str?.length 를 null 로 반환
Elvis 연산
var str : String ? = null
printn(str ? . length ? : 0)
-> 출력 0
즉 ? :가 붙으면 앞에 연산이 null 인경우 뒤쪽 출력
Early return
fun calculate(number : Long ?) Long {
number ? : return 0
// 다음로직 ~~~~
// ~~~~~
}
val person: Person? = obj as? Person
-> obj 가 null 이면 obj as? Person 전체가 null 이 된다.
or
val person = obj as? person
==> println(person?.age)
-> Safe call 로 person 이 null 이면 person?.age 전체가 null 이된다.
어떠한 경우에도 null 이 아닌경우
str !! . length -> 이는 런타임 에러를 발생시킬 수 있기에 정말 확실히 null 이 아닐때 사용
자바는 타입추론이 가능하지 않다.
코틀린은 타입추론이 가능하다.
자바는 기본타입간의 변환이 암시적으로 변경되지만,
코틀린은 기본타입간의 변환 또한 명시적으로 이루어져야 한다. -> toLong(), toDouble() 등등 을 사용해야한다.
자바는 Object 가 최상위 타입이다.
코틀린은 Any 가 최상위 타입이다.
-> Any 또한 null 이 허용되지 않기에 null 을 포함하고 싶다면 Any? 로 써야한다.
-> Any 에 equals / hashCode / toString 존재
자바는 함수의 리턴값이 없다면 void 를 사용한다.
코틀린은 함수의 리턴값이 없다면 Unit 을 사용한다.
-> 타입추론이 가능하기에 생략가능
코틀린의 Nothing 은 함수가 정상적으로 끝나지 않았다는 사실을 표현하는 역할이다.
-> 무조건 예외를 반환하는 함수 / 무한 루프 함수 등 정상적인 활동(작동)이 아니다 라는 것을 명시해줄때 쓰임
ex)
fun fail(message: String): Nothing {
// 무조건 예외를 발생시키는 함수 등 정상적이지 않은예에 사용
throw IllegalArgumentException(message)
}
자바는 문자열을 바꿔야할 때 String.format("문자열 %s" , person.getName()); 처럼쓴다.
코틀린은 "문자열 ${person.name}" 으로 쓸 수 있다.
-> 이때 {} 중괄호를 생략할 수 있다. 그러나 {} 중괄호를 붙이는게 가독성이나 일괄 변환 , 정규식 사용등에 더 좋다.
추가적으로
코틀린에서는 """~~~""".trimIndent() 큰따움표 세개로 여러줄의 문자열을 작성할 수 있다.
ex)
"""
ABC
BCD
DAS
""".trimIndent()
자바에서는 특정 문자열의 문자를 가져올때 str.charAt(1); 을 사용한다.
코틀린에서는 특정 문자열의 문자를 str[1] 로 인덱스를 활용해 가져올 수 있다.
자바에서는 객체간 비교시 obj1.compateTo(obj2) > 0 를 사용한다.
코틀린에서는 객체간 비교연산시에는 compareTo() 를 자동으로 호출한다.
ex) obj1 > obj2
자바에서는 동등성(값)에 equals 를 사용하고, 동일성(주소)에 == 를 사용한다.
코틀린에서는 동등성(값)에 == 를 사용(간접적으로 equals 호출)하고, 동일성(주소)에 === 를 사용한다.
코틀린의 in / !in 은 컬렉션이나 범위에 포함되어 있다, 포함되어 있지 않다를 의미한다.
코틀린의 a..b 의 경우 a 부터 b 까지의 범위 객체를 생성한다.
코틀린에는 객체간 연산이 직접 가능한 연산자오버로딩 이란것이 있다.