코딩못하는사람

1. 코틀린에서 변수와 타입, 연산자를 다루는 방법 본문

Kotlin/(강의)자바 개발자를 위한 코틀린 입문 정리

1. 코틀린에서 변수와 타입, 연산자를 다루는 방법

공부절대안함 2023. 1. 1. 17:51

 

var vs val 가변 불변 발 밸

타입 선언이 필수가아님 변수: 타입

모든변수는 val로 만들고 필요시에 var로 변경하자.

명시적으로 타입을 작성하지 않아도 추론해준다.

(지금까지 팩킹 언팩킹에 대해서 생각을 안하고있었구나 내가.)

 

코틀린에서 primitive type

코틀린에서 Long과 long이 Long으로 같이 묶이지만, 상황마다 다르게 내부적으로는 primitive 타입으로 작동하게 한다.

숫자, 불리언, 문자에 대해서는 primitive타입을 알아서 사용해준다. 프로그래머가 boxing, unboxing을 신경쓰지 않도록 해준다.

 

nullable은?

코틀린에서는 null이 들어갈 수 있는 변수를 다르게 처리한다.

null이 들어갈 수 있다면, 타입?를 사용하면 됨 -> Long?

 

객체 인스턴스화 

var person = Persone("코딩못하는사람")

new를 사용하면 안된다.

 

코틀린에서 null을 다루는 방법.

 

1.코틀린에서 null체크

기존 자바에서는 NPE를 방지하기 위해 조건문으로 null 체크

nullable한 놈에 대해서는 바로 함수호출못하게끔함. 문맥상 체크하면 컴파일러가 추측해서 봐줌

java boolean -> kotiln Boolean

java Boolean -> kotlin Boolean?

startWith함수 호출예시. 

변수타입에 ? 물음표가 없으면 null이 못들어온다는 뜻이므로 null체크를 안해줘도 되는것이다.

코틀린에서는 null이 들어갈 수 있는 변수를 다르게 처리한다는 의미

 

2.Safe call과 Elvis 연산자

Safe call 널이 가능한 타입을 위한 기능.

널이 아니면 실행한다. 널이면 실행하지 않는다(그대로 null)

str.length 불가능

str?.length 가능

 

Elvis 연산자는 str?.length ?:0

앞의 연산결과가 null이면 뒤의값 사용. safe call이나, 엘비스 연산자나 코드의 양이 정말 많이 줄어들겠다.

코틀린스러운 코드

str?.startsWith("A") ? : throw ~~Exception()

Elvis연산자는 early return 코드에도 활용할 수 있다.

number ?: return 0

 

3.null아님 단언

nullable타입이지만, 아무리 생각해도 null이 될 수 없는 경우

ex) DB 처음엔 null이고 활용시에 무조건 값이 있을는 경우

null이 날 수 있어서 나는 컴파일에러를 !!로 제압할 수 있다.

str!!.startWith("A")

(혹시나 널이 들어오면 npe, 정말 널이 아닌게 확실할때만.)

 

4.플랫폼타입

코틀린이 null 관련 정보를 알 수 없는 타입 Rumtime 시 Exception이 날 수 있다

병행해서 사용이 가능한데, 

코틀린에서 자바코드를 가져다 쓸 때 null에 대해 어떻게 처리할까?

- javax.annotation 패키지

- android.support.annotation 패키지

- org.jetbrains.annotation 패키지

위 패키지들의 null관련 기능을 사용하면 코틀린이 타입을 쓰면 알  수 있다.

하지만 ex) @Nullable이 없다면?!! Kotlin에서는 이 값이 nullable인지 non-nullable인지 알 수가 없다~

 

코틀린에서 자바사용할때는 널관련정보를 꼼꼼히 체크해야한다.

Java 코드를 읽으며 널 가능성 확인해보던가 / 자바 코드 가저오는 지점을 Kotlin으로 wrapping해서 단일지점으로 만들어 대응하자.

 

TYPE
1.기본 타입

선언된 기본값을 보고 타입을 추론한다.

val number = 3 // Int

val number2 = 3L //Long , L로 간주

val number3 = 3.0f //Float

val number4 = 3.0 //Double

자바에서는 기본타입간의 변환이 암시적으로 이루어지지만

코틀린에서는 명시적으로 이루어져야 한다.

to변환타입()을 사용해주어야 한다. to기본타입 메서드가 다수 존재

 

코틀린의 변수는 초기값을 보고 타입을 추론하며, 기본 타입들 간의 변환은 명시적(to변환타입())으로 이루어진다.

 

2.타입 캐스팅

타입 확인 instanceof 를 is로 사용한다.

obj is Person (반대는 obj !is Person)

(Person) 같은 타입 변환은 as 로 사용한다.

val person = obj as Person obj라는 변수를 Person 타입으로 간주한다 (as 구문 안써도 인식된다)

as도 null이 가능한다면 as?로 사용해야 한다.

 

- 스마트캐스트 if 안에 들어와서 타입체크과정이 있었다면 코틀린 컴파일러가 인지해서 허용한다.

 

value as? Type 

-value가 Type이면 Type으로 캐스팅

-value가 null이면 null

ㄹ-value가 Type이 아니면 null

안전한 타입 형변환으로 생각하면 된다.

 

코틀린에서는 is, !is, as, as? 를 이용해 타입을 확인하고 캐스팅한다.

 

3.Kotlin의 특이한 타입 3가지 

Any

-Java의 Object 역할. (모든 객체의 최상의 타입)

-모든 Primitive Type의 최상의 타입도 Any이다.

- Any 자체로는 null을 포함할 수 없어 null을 포함하고 싶다면, Any?로 표현.

- Any 에 equals / hashCode / toString 존재

 

코틀린의 Any는 Java의 Object와 같은 최상위 타입이다

 

Unit

- Unit은 Java의 void와 동일한 역할. (생략 가능)

- void와 다르게 Unit은 그 자체로 타입 인자로 사용 가능하다.

- 함수형 프로그래밍에서 Unit 은 단 하나의 인스턴스만 갖는 타입을 의미. 즉, 코틀린의 Unit은 실제 존재하는 타입이라는 것을 표현

 

코틀린의 Unit은 Java의 void와 동일하다

 

Nothing (거의 사용하지 않음)

- Nothing은 함수가 정상적으로 끝나지 않았다는 사실을 표현하는 역할

- 무조건 예외를 반환하는 함수 / 무한 루프 함수 등

 

 

String interpolation 

기존 Java에서는 String.format으로 문자열 형식을 지정해주고 %d 등으로 표현했다면

문자열 속에 ${변수} 를 사용하면 값이 들어간다, $변수 중괄호 생략도 가능.

(중괄호를 사용하는 것이 가독성, 일괄 변환, 정규식 활용 측면에서 좋았다는 강사 경험 공유)

 

여러줄에 걸친 문자열을 작성해야할 때 """ 를 통해 편하게 작성할 수 있다( 알아서 indent를 생략하고 줄바꿈을 먹임).

 

문자열을 가공할때 ${변수}와 ””” ””” 를 사용하면 깔끔한 코딩이 가능하다

 

 

String indexing

java에서는 charAt을 통해 특정 문자를 가져오지만, 코틀린에서는 배열처럼 가져올 수 있다.

val str = "ABCDE"

val ch = str[1] - > B

 

문자열에서 문자를 가져올때의 Java의 배열처럼 [ ]를 사용한다

 

코틀린에서 연산자를 다루는 방법

1.단항 연산자 / 산술 연산자 -> 동일

2.비교연산자와 동등성 동일성

ㄴ but java와 다르게 객체를 비교할 때 비교연산자를 사용하면 자동으로 compareTo를 호출해준다.

 = 객체끼리 비교연산자를 사용 가능하다

java -> 동일성에 ==, 동등성에 equals를 직접호출

kotlin -> 동일성에 ===,  동등성에 == 를 호출 (==이 간접적으로 equals를 호출해준다)

 

3.논리연산자와 

&&, ||,  ! 모두 동일 , Lazy연산 수행도 동일 

4.코틀린에 있는 특이한 연산자

in / !in ->  컬렉션이나 범위에 포함되어 있거나, 포함되어 있지 않다.

a..b -> a부터 b까지의 범위 객체를 생성한다.

a[i] -> a에서 특정 index i로 값을 가져온다

a[i] = b -> a의 특정 index i 에 b를 넣는다.

 

5.연산자 오버로딩

코틀린에서는 객체마다 연산자를 직접 정의할 수 있다. ex) plus 메서드를 연산자 +로 

 

 

Comments