본문 바로가기
Study/APP

Kotlin 기본 문법

1. 함수

우선 코틀린에서의 함수는 java와는 다르게 fun으로 시작한다. 이 부분은 파이썬이랑 유사한 것 같다. 함수를 선언하고 아무것도 return 하지 않을 수 있는데 그러기 위해 함수 뒤에 :Unit을 붙여줘야 한다. c언어로 따지면 void와 같은 기능인 것이다. 물론 Unit이 없어도 된다. 

함수에 인자가 없을 경우에는 위와 같이 해도 되지만, 인자가 있는 경우에는 다른 언어들과는 달리 변수 : type 순으로 정의를 해줘야 한다. 그리고 인자를 다 받고 나서는 return값의 형태도 정의해줘야 한다. 

2. val vs var

val은 변하지 않는 값이다. 자바에서 final과 같은 것으로 보면 된다. var은 js에서 썼던 var과 똑같다. 변할 수 있는 변수이다. 코틀린은 똑똑해서 변수를 설정할 때 type을 알아서 이해하는 편이다. 그래서 type을 따로 적어주지 않아도 된다. 하지만 val, var는 구분을 해줘야 한다. 그리고 혹시나 선언하지 않을 변수라면 var a : String처럼 type을 대신 넣어줘야 한다. 

3. String Template

파이썬에서의 formatting, js에서의 $와 비슷한 역할을 해주는 친구라고 생각하면 편하다. string 중간에 내가 원하는 데이터를 넣고 싶을 때 ${변수}로 넣어주면 원하는 string으로 출력을 해 줄 수 있다. 

4. 조건식(if)

if문은 모든 언어에 기본적으로 들어가 있다. 그렇기 때문에 어렵지 않게 if 문을 Kotlin에서도 쓸 수 있다. 하지만 여기서 하나 더 배워야 하는 점은 when이라는 것이다. c언어로 따지면, switch와 비슷한 문법이다. 

사용은 위와 같이 한다. 변수와 타입을 함수 인자 안에 넣어주고, 숫자가 무엇인지 when 해 줄 변수를 when 인자 안에 넣어준다. 그리고 그 변수가 0인지, 1인지, 2 인지에 따라 println 하는 문구가 달라진다. switch에서 제약이 더 없어진 문법이라 편한 감이 있다. 또한, java와 js에 있는 삼항 연산자가 없는 대신에 조금 더 직관적인 return문을 if문을 통해 구현할 수 있다. 

두 개의 함수는 똑같은 의미를 가지고 있다. 하지만, 굳이 함수 안에 해주지 않아도, if else문을 통해 조건에 맞게 return을 해 줄 수 있다. 

when을 사용해 위와 같이 범위를 지정할 수 있고, 범위를 벗어나는 친구는 else를 통해 처리해줄 수 있다. 

when을 통해 조건에 따라 변수도 설정해 줄 수 있다. 

코틀린과 자바의 차이를 이해하기 위해 Expression과 Statement의 차이를 이해할 필요가 있다.

Expression은 반드시 return값이 있어야 한다. 값을 만들어 주는 함수나 문구면 Expression이라고 부를 수 있다. Kotlin에서는 모든 함수들이 반환 값이 있기 때문에 Expression이다. return 값을 지정을 안 해줬더라도, Unit을 return 하기 때문에 Expression이라고 볼 수 있다. 하지만, Java에서는 void라는 return 문구가 없는 친구가 존재한다. 그렇기 때문에 Java는 함수 중에 Statement가 존재할 수 있다. 또한 Java에서는 if문은 Statement이지만, Kotlin에서는 Expression이다.

Statement는 return문 없이 단순히 print를 해주거나, 값을 반환하지 않는 문장이라고 생각하는 게 편하다. 그냥 Expression인지 아닌지를 판별하고 아니면 Statement라고 생각해주는 게 편하다.

 

5. Array vs List

Kotlin에서의 array와 list는 서로 다르다. 

 

Array ( var 배열 이름 = arrayof(값 1, 값 2, 값 3) )

  • 같은 자료형을 가진 값들을 하나로 나타낸 것
  • 초기화와 동시에 크기가 정해짐
  • 메모리 공간에 연속적으로 저장됨
  • 인덱스를 통하여 값에 접근, 이로 인해 검색이 용이함
  • 배열에서 값을 삭제하더라도 배열의 크기가 줄어들지 않음(정적임)
  • 배열의 크기가 정해진 이후 배열의 크기를 재조정할 수 없음

List ( var 리스트 이름 = listof(값 1, 값 2, 값 3) )

  • 순서가 있는 element들의 집합
  • 동적 타입, 크기가 정해져 있지 않음
  • 포인터를 통해 값에 접근
  • 메모리 재사용이 용이
  • 검색 성능이 좋지 않음
  • 빈 요소를 허용하지 않음

흔히 파이썬에서 쓰는 list를 코틀린의 List로 생각하면 편하다. 물론 인덱스 검색이 용이하지 않다는 점이 다르지만 말이다. 코틀린에서 부르는 List는 immutable list이다. 다시 말해 리스트 안의 내용을 수정할 수 없다는 것이다. 그렇기 때문에 코틀린에서는 arraylist라는 것을 제공한다.

 

ArrayList (var 리스트 이름 = arrayListOf <type>() )

  • array의 유용한 성질을 가져와 만들어진 list
  • 포인터를 사용하여 값을 추가/삭제할 수 있음
  • array의 장점인 인덱스를 사용한 원소 접근도 가능

파이썬과 다른 점이 많다. 다양한 자료구조를 제공해준다. 단순히 추가하는 것이 아니라, 검색을 위해 사용하려면 array를 사용하는 것이 좋고 추가나 삭제와 같은 기능들이 필요하다면 list를 사용해 주는 것이 편하다. 하지만 이 모든 것을 다 해야 한다면 arraylist를 사용해야 한다.

 

6. 반복문

for문은 파이썬과 비슷하다. 

arraylist를 만들어 놓고 for문을 돌리면서 출력하면 된다. 

이렇게 범위를..으로 써 줄 수 있다는 점은 파이썬과 다른 점이다. 

또한 step을 통해 for문에 들어갈 숫자들의 범위를 정해줄 수도 있다. 

step의 반대로 downTo도 사용해줄 수 있다. 

while문은 파이썬의 문법과 똑같다. 신기한 점은 인덱스를 가져오는 것을 for문에서 지원해준다는 점이다. 

이렇게 for문 안에 index와 name을 설정해줄 수 있다. 

6. Nullable / Nonnull

 

코틀린은 자바와 다르게 null을 변수로 설정하여 프로그램을 짤 수 있다. 그렇다고 아무 변수나 null로 설정할 수 있는 것이 아니라, null 인 친구에게는?를 붙여 null임을 알려줘야 한다. 

위와 같이 변수의 type뒤에?를 붙여 주면 이 변수는 null이 될 수 있다고 알려주는 것이다. 그래서 Nullable변수를 설정해줬다면, 코드를 작성할 때 Null이 들어올 수 있기 때문에 항상?를 통해 null인지 아닌지를 판별해줘야 한다.



그리고 null일 경우에 if문과 비슷한 문법을 통해 어떻게 해야 하는지를 정해줄 수 있다. 위는 엘비스라고 부른다. 이렇게 null로 변수를 설정할 수 있지만, 항상 Null인지 아닌지를 check 한 다음 코드를 짜줘야 한다. 

 

7. class

자바에서 배웠던 class를 코틀린 식으로 다시 복습해보자. 우선 자바에서 class를 선언하려면 public class라고 정의를 해줘야 했다. 하지만 코틀린은 함수를 선언하는 것과 같이 class classname으로 선언을 해줄 수 있다. 

위와 같이 간단하게 class를 설정해주고, 안에 함수와 프로퍼티를 사용하여 메인 함수에서 가져온 뒤에 자유롭게 사용할 수 있다. 생성자도 자바보다 간편하게 쓸 수 있다. 자바에서는 생성자를 constructor로 만든 다음에 this. 변수로 초기화를 시켜줘야 사용이 가능했다. 하지만 코틀린에서는 정의해준 class 옆에 constructor를 정의해주면서 초기화 없이 사용할 수 있다.

위와 같이 constructor를 설정해주고, class를 설정해줄 때 정한 이름으로 초기화를 해주면 생성자가 이를 인식하여 정해준 이름으로 생성자들을 바꿔준다. 

class가 실행될 때 같이 실행되는 주 생성자는 Init으로 만들어 줄 수 있고, 필요에 따라 constructor를 통해 부생성자를 만들어 줄 수 있다. 대신에 부생 성자는 이미 초기화되었던 생성자를 this(변수)를 통해 받아줘야 한다.

사용할 때는 따로 정의없이 위와 같이 필요한 값만 설정해주면 부생 성자도 활용할 수 있다. 코틀린은 자바와 다르게 모든 class를 기본으로 final로 설정해주기 때문에 상속이나 overload 하려면 overload 하려는 class나 fun앞에 open을 붙여줘야 한다. 그러고 나서 만들려는 class명 뒤에 : 를 붙여 어떤 클래스를 상속받을 것인지를 정해준다. 여기서, 상속받는 class의 생성자들을 가져와서 사용할 수 도 있다. 

상속이나 overload하려는 함수들 앞에 open을 붙여주면 된다.

'Study > APP' 카테고리의 다른 글

[디자인 패턴] MVVM  (0) 2022.09.14
Kotlin 고급 문법  (0) 2021.12.09