Kotlin 문법 기초 다지기

BlackHan·2023년 11월 19일
0

Kotlin 배우기

목록 보기
2/2
post-custom-banner

오늘은 코틀린 기초 1일 차이다.
내가 듣기로 한 강의는 인프런의 '코틀린 3강으로 끝내기 feat 안드로이드 개발'이다. 작업은 안드로이드 스튜디오로 진행되었다.

오늘 배운 내용을 정리한다.

함수 형태

함수의 형태부터 알아본다. fun은 function의 약자이며, Java와는 다르게 변수명을 타입보다 먼저 썼다. 그리고 return 타입은 파라미터 다음에 콜론과 함께 작성한다.
타입을 작성하지 않아도 타입을 추론해 주는 것은 파이썬과 유사하다고 느껴졌다. 출력 결과는 아래와 같다.

var는 value의 약자로, 변하지 않는 값을 의미하며, 주소의 값이 변하지 않음을 말한다. var는 variable의 약자로 = 변할 수 있는 값을 말한다.

${ }를 사용하면 변수 값을 넣어줄 수 있다


조건식

대개 Java와 유사한 형태를 띠었다. 여기서 차이를 발견하자면, 코틀린에서는 삼항 연산자가 없다는 것이다. when도 굉장히 유사하며, a -> b를 이용하여 a라면 b라는 결과를 배출한다.코틀린에서는 범위를 '..' 을 으로 표현하기도 한다. 1 .. 100을 쓰면 1부터 100까지를 의미한다.


Expression vs Statement

Expression은 값을 반환하는 코드를 의미한다. 예를 들어, 산술 연산 (a + b), 함수 호출 (fun add(a: Int, b: Int) = a + b), 변수 할당 (val sum = a + b) 등이 식이다.
Statement는 어떤 동작을 수행하거나 결과를 반환하지 않는 코드를 의미한다. 예를 들어, 반복문 (for, while), 조건문 (if-else 문), 함수 정의 등이 문이다.

코틀린에서 모든 함수는 Expression으로 사용이 된다는것을 알고있자..


Array와 List

둘의 차이점부터 알아보자. Array는 정적인 크기를 가지고, List는 동적으로 크기를 조절할 수 있다. 또한 배열은 특정 데이터 유형으로 제한되어 저장할 수 있으며, 리스트는 제네릭등 다양한 유형을 저장할 수 있다.
그리고 리스트는 MutableList와 ImmutableList가 있으며, Mutable은 변경 가능한 객체를 말하고 대표적으로 ArrayList가 있다.위처럼 배열에 값을 저장하는 방식은 val array = arrayOf(1,2,3)처럼 선언한다.여기서 array는array[0]=3처럼 값을 변경 가능하지만, list는 ImmutableList이기 때문에 값을 조회하는 것 만 가능하고 변경이 불가능하다.
ArrayList는 MutableList이기 때문에 add와 값 변경이 가능하다.

❓. 여기서 의문은 arrayList를 val로 선언했는데 add를 하면 var로 되어햐하는게 아닌가 ?
=> 참조값이 변하는 것이 아니기에, val로 선언하는게 맞다. 쉽게 말해 add를 한다고 arrayList의 주소가 변하는 것이 아니다. 실제로 arrayList = arrayListOf()로 다시 값을 받아오려고 한다면 오류가 발생한다.


반복문

반복문 또한 Java와 굉장히 유사하다. 주로 쓰는 표현 중엔
for((index, name0 in students.withIndex()) 처럼 index와 name을 동시에 표현할 수도 있다. 그리고 반복문에서도 1..4 같은 표현을 자주 이용한다.결과는 아래와 같다.
for 반복문 중에 for(num in 1..10 step 2) 처럼 사용할 수도 있는데, 이는 1부터 10까지 2씩 증가하는 것을 의미한다.
for(num in 10 down to 1)도 있다. 이것은 10부터 1로 줄어드는 것을 의미하며,
1 until 100도 있다. 1..100 표현과의 차이는 100을 포함하지 않는 것이다.
while은 아래처럼 쓰이며, Java와 거의 유사하다.


Null

코틀린에서는 Nullable Types이 있다는 것을 여기에서 알아보았다. 변수를 nullable하게 만들고 싶을 때는 타입 이름 뒤에 물음표 ?를 추가한다. 예를 들어, String은 널이 될 수 없는 타입이고, String?은 널이 될 수 있는 타입이다.
위와 같이 nullName을 Nullable 타입으로 설정해 주면, nullName?.uppercase()쓰여야 하며, nullName이 null을 가져서 uppercase가 null포인터에러가 발생하는 것을 방지할 수 있다. 결과는 아래와 같다.
주로 자주 쓰이는 표현은 (lastName?: "No lastName)" 같은 표현이다.
이는 lastName이 null을 가질 때 뒤에있는 문구를 출력하게끔 할 수 있다. 이는 우리가 Java에서 if와 optional로 그토록 힘들게 처리하던 것을 간편하게 처리하게 해 준다. 마지막으로 아래처럼 !!를 가끔 쓰기도 하는데, 이는 null이 확실히 아니라는 의미이다. 이렇게 선언해 주면, 그 뒤에서부터는 null이 아니라고 가정을 하고 실행하기 때문에 null포인터 에러가 발생할 수도 있기에 자주 사용하는 것은 좋지않다.email?.let 자주 사용하는 표현인데 null이 아니면 진행해라. 라는 의미를 가진다.

이것으로 코틀린 1일 차를 마친다. 자바를 공부하고 난 뒤인지라, 이해하는 데 어려움은 없었다. 굉장히 자바 문법과 유사한 부분이 많았고, nullable타입의 장점도 알아가는 시간이었다. 자바의 단점을 보완하기 위해 나온 언어라는 말이 와닿았다. 다음에는 클래스를 알아보도록 한다.

profile
Slow-starter
post-custom-banner

0개의 댓글