inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Hướng dẫn dành cho người mới bắt đầu sử dụng Java và Kotlin

Bài 2. Cách xử lý null trong Kotlin

코틀린으로 한번 래핑 (수정)

876

kyu

10 câu hỏi đã được viết

7

코틀린에서 자바코드를 사용할 때 플랫폼 타입 사용에 유의하여야한다고 하셨습니다.

팁으로 자바 코드를 널 가능성을 확인하는 코드를 삽입하던지 아니면 코틀린으로 한번 래핑하라고 하셨는데 여기서 코틀린으로 한번 래핑하라는게 무슨 의미인지 잘 모르겠습니다

4강입니다

 

수업질문 java oop kotlin

Câu trả lời 2

13

lannstark

안녕하세요! 아무거나123님~~~ 정말 좋은 질문 이십니다~~ 😊😊 휴일에도 공부하시고 크으~ 대단하십니다!!! 바로 한 번 답변 드려보도록 할게요!!

 

다음과 같은 Java 코드가 있습니다!

public class JavaContext {

  public String getValue(String key) {
    if ("A".equals(key) || "B".equals(key)) {
      return "OK";
    }
    return null;
  }

}

key에 어떤 값이 들어오는지에 따라 null이 아닌 문자열을 반환하기도, null인 문자열을 반환하기도 합니다!

 

이 JavaContext의 getValue 함수를 코틀린에서 사용한다고 해볼게요!!!

그런데 우리의 프로젝트는 정말정말 size가 커서 JavaContext를 많이많이 사용해야 합니다! 자 우선 간단히 3군데의 Kotlin 코드에서 JavaContext의 getValue 함수를 가져다 사용한다고 해볼게요!!

class A(private val javaContext: JavaContext) {
  fun logic1() {
    val str: String = javaContext.getValue("A")
    // ... 생략
  }
}

class B(private val javaContext: JavaContext) {
  // logic2, 위와 비슷하다.
}

class C(private val javaContext : JavaContext) {
  // logic3, 위와 비슷하다.
}

대략 이런 느낌일겁니다! 자 이 코드의 문제가 무엇일까요?!

 

정답은, JavaContext의 의존성이 지나치게 퍼져 있다는 것입니다. 바꿔 말하면, JavaContext를 사용하는 클래스가 너무 많아요! JavaContext는 Java 라이브러리이고, 지금은 A나 B일 때 non-null String을 반환하지만, 버전이 변경되면서 또 어떻게 될지는 모르죠! 즉, JavaContext 라는 클래스 변경에 우리의 프로젝트는 매우 취약한 상태입니다.

그림으로 나타내면 다음과 같죠!

image

그림에서와 같이, JavaContext에 변경이 일어날 경우, A / B / C 클래스 모두 수정을 해야 하고, 만약 사용하는 사용처가 늘어날수록 영향범위는 커져서 NPE와 같이 예상치 못한 이슈가 뻥뻥 터질 수 있습니다!

 

그래서 우리는 wrapping을 해야 합니다!! wrapping이란 대상 클래스를 한 번더 감싸는 건데요! 코드로 한 번 보여드릴게요!

JavaContext라는 클래스를 Kotlin 코드로 감싸겠습니다. 그리고 여기서 우리가 원하는대로 안전하게 null 여부를 제어할 수 있죠. 예를 들면 null인 경우 예외를 낼 수도 있을겁니다.

class JavaContextWrapper(private val javaContext: JavaContext) {
  fun getValue(key: String): String {
    return javaContext.getValue(key)
      ?: throw IllegalArgumentException("key=${key}는 null을 반환했습니다.")
  }
}

네, 이제 JavaContextWrapper에서는 확실한 String을 줍니다!! (구현에 따라서는 String?을 줄 수도 있겠죠!!)

그럼 이제 A / B / C Class에서는 JavaContext를 직접 사용하지 않고, JavaContextWrapper를 사용합니다! 하나만 예를 들어볼게요!

class A(private val wrapper: JavaContextWrapper) {
  fun logic1() {
    val str = wrapper.getValue("A") // 확실한 String 타입
    // ... 생략
  }
}

 

전체적인 구조 역시 바뀝니다.

image이렇게 되면, JavaContext라는 외부 라이브러리가 어떻게 바뀌건, A / B / C 클래스는 아무런 걱정없이 JavaContext의 기능을 사용할 수 있고요! JavaContext의 null 관련 정책이 변경되더라도 JavaContextWrapper만 수정하면 되기 때문에 무척 편하죠~ 😊

 

그래서 결국 wrapping을 한다라는 의미는 Java의 플랫폼 타입과 직접적으로 맞닿는 우리의 Kotlin 코드를 최소한으로 하여, 영향범위를 최소화하고, 예상치 못한 일이 발생했을 때 대응해야 하는 cost를 최소로 한다 라는 의미입니다!!

 

제 답변이 도움이 되었다면 좋겠네요~!! 혹시라도 더 궁금하신 내용 있으시면 편하게 질문 부탁드리겠습니다!

감사합니다!! 🙏🙏

 

0

progress0407

와... 정말 열정적으로 알려주시는 모습에 감동했습니다 ㅠㅠ ...

코틀린을 애매하게 아는 상태인데, 수강할 지 고민 중이었는데.. 수강하러 갑니다 ㅎㅎ

1

kyu

설명을 너무 친절하고 자세히 알려주셔서 엄청 잘 이해되었습니다.

정말 감사합니다 ! ^^

수업노트

0

52

1

싱글톤과 스프링

0

71

2

get() = 3

0

49

2

강사님

0

74

1

강의 복습하면서 생긴 질문

1

93

1

Kotlin과 Java의 현업에서의 활용

0

121

2

data class와 자바의 Lombok을 이용한 DTO 클래스 차이 질문

0

72

1

코틀린에서 상속 시, 주의점에 대한 질문

1

95

3

내용 이해 질문

0

56

1

자바와 코틀린의 함수형 프로그래밍,

1

91

1

플랫폼 타입 설명 문의

2

73

2

널 아님 단언 관련 질문

0

83

1

강의 중 질문

0

79

2

범위 비교 질문

1

91

2

타입캐스팅 궁금한점 질문드립니다.

1

239

2

코틀린 val 질문

0

166

2

완강 후 Kotlin 이런저런 질문 드려봅니다!

3

408

2

확장함수 스타일 질문

0

138

2

확장 프로퍼티 질문

1

156

1

update 함수를 만든다는게 어떤 의미인지 예시가 궁금합니다!

1

283

1

java class의 NotNull 어노테이션 인식

1

260

1

[16강] 확장함수 관련 질문입니다!

1

130

2

리턴타입 사용시 any를 사용해도 괜찮은가요?

1

138

1

안녕하세요 scope function 에 receiver 가 없는 경우

1

168

1