Kotlin

java -> kotlin

hooneats 2022. 9. 25. 14:20
728x90
코틀린을 공부하다보니 내가 자바코드를 굉장히 불안전하게 사용하고 있었음을 느끼게되었다.
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 까지의 범위 객체를 생성한다.

코틀린에는 객체간 연산이 직접 가능한 연산자오버로딩 이란것이 있다.

728x90