[KOTLIN] 코틀린! 자바랑 뭐가달라?

RuiN·2023년 9월 11일
0

Kotlin

목록 보기
1/3
post-thumbnail

드디어 코틀린 시작!

오늘 자기계발을 위해서 코틀린 관련 강의를 수강하기 시작했습니다.
1년전에 자바,스프링 관련 강의를 시작으로 한번의 강의도 듣지 않았는데, 초심을 되찾기 위해 큰맘(?) 먹고 결제했습니다..😊


그래서 주제가 뭔데?

그래서 앞으로 매일 공부하면서 알고있는것 들이나, 여러분과 공유하고싶은 지식을 포스팅할겁니다. 공부도 하고! 글도 쓰고! 아주 훌륭하다고 생각합니다.

주로 코틀린관련해서 포스팅할 예정이며, 개인프로젝트도 진행하면서 배운것들을 포스팅 할거에요!


코틀린은 자바랑 뭐가달라?

이게 바로 주제입니다.
강의 자료에도 나와있는 정보이지만, 제가 스스로 정리하면서 다시한번 공부한다는 느낌으로 가봅시다!

Checked Exception [ 체크드 익셉션 ]

  1. 자바의 Exception 계층과 차이점이 있습니다.
    • Throwable : 예외 계층의 상위클래스
    • Error : 시스템에 비정상적인 상황이 발생. 예측이 어렵고 기본적으로 복구가 불가능 함
      - e.g. OutOfMemoryError, StackOverflowError, etc
    • Exception : 시스템에서 포착 가능하여(try-catch) 복구 가능. 예외 처리 강제
      - IOException, FileNotFoundException, etc
      - @Transactional 에서 해당 예외가 발생하면 기본적으론 롤백이 동작하지 않음
      - rollbackFor를 사용해야함
    • RuntimeException : 런타임시에 발생하는 예외. 예외 처리를 강제하지 않음
      - e.g. NullPointerException, ArrayIndexOutOfBoundsException, etc

자바에서 체크드 익셉션의 경우에는 try-catch로 감싸거나 throw로 예의를 전파해야합니다.

try {
Thread.sleep(1);
} catch (InterruptedException e) {
// 예외 처리
}

하지만, 대부분의 소스들은 catch 안에서 아무런 처리를 하지 않습니다.

try {
log.append(message)
} catch(IOException e) {
// Do nothing 흔하게 볼 수 있는 코드
}
try {
File file = FileUtils.get(filename);
// ...
} catch (FileNotFoundException e) {
// 파일이 없는데 어떤 처리를 하지?
}
try {
return objectMapper.readValue(json, clazz);
} catch (IOException e) {
// 단순 에러 로그 출력
logger.error(e.getMessage(), e);
}

코틀린은 체크드 익셉션을 강제하지 않습니다.

Thread.sleep(1);
// 물론 원하는 경우에는 try-catch 가능
try {
Thread.sleep(1)
} catch (e: Exception) {
// 예외 처리
}

정적 멤버

자바에서는 static 키워드로 정적멤버를 선언합니다.

pubic class JavaClass {

  static int i = 0;
  
  public static void staticMethod() {
  // ...
  }
}

하지만 코틀린에서는, compainon object 로 대체합니다.

class KotlinClass {

  companion object {
    val i: Int = 0
    fun function() {
    // ...
    }
  }
  
}

삼항 연산자


// 자바의 경우에는 삼항연산자
String animalSound = "호랑이".equals(animal) ? "어흥" : "야옹";

// 코틀린의 경우에는 if-else로 대체 
val animalSound: String = if ("호랑이" == animal) "어흥" else "야옹"

확장

개발자가 임의로 객체의 함수나 프로퍼티를 확장해서 사용할 수 있다

MyStringExtensions.kt

fun String.first(): Char {
	return this[0]
}

fun String.addFirst(char: Char): String {
	return char + this.substring(0)
}

fun main() {
	println("ABCD".first()) // 출력 : A
	println("ABCD".addFirst('Z')) // 출력 : ZABCD
}

NPE [Null Pointer Exception]

  • 자바에서 가장 많이 발생하는 예외는 NullPointerException 줄여서 NPE
  • 자바의 옵셔널(Optional)은 값을 래핑하기 때문에 객체 생성에 따른 오버헤드가 발생하고, 컴파일 단계에서 Null 가능성을 검사하지 않음
  • 코틀린은 언어적 차원에서 NPE가 발생할 가능성을 제거한다
val a : String = null // 컴파일 오류
var b : String = "aabbcc"
b = null // 컴파일 오류

// Nullable 참조는 컴파일 단계에서 널 안정성을 제공

var a : String? = null
a.length // 컴파일 오류
a?.length // safe-call 정상
a!!.length // Null이 아니라고 확신하는 경우

마무리

아래에 추가적으로 차이점이 존재하지만, 나중에 공부하면서 다루게될 예정이므로 여기서는 PASS!!

  • 스마트 캐스트
  • 실드 클래스 (Jdk15 추가)
  • 위임
  • 중위 표현식
  • 연산자 오버로딩
  • 코루틴
  • etc

일단 기본적으로 차이점에 대해서 알아보았습니다.
수정해야될 정보나, 보완해야할 점이 있다면 말씀해주세요 바로 수정하겠습니다.👍👍

그럼..이만!!!

profile
어디까지 올라갈지 궁금한 하루

0개의 댓글