Primitives와 objects
1.
우선 primitive type(원시 타입)과 wrapper class(래퍼 클래스)에 대해 간단히 알아보자.
primitive type → wrapper class
객체화
예를 들어 primitive type int는 wrapper class Integer로 객체화, 즉 객체로 뤠핑된다.
객체로 포장함으로써...
장점 : null 값을 대입할 수 있고, 메소드도 호출할 수 있게 된다.
단점 : 메모리 측면에서 비효율적일 수 있다.
2.
kotlin에는 primitive types가 없고, 전부 objects로 취급된다.
NO primitives, ALL objects!!
3.
kotlin을 구현의 관점에서 바라보면, 두가지로 나눠 생각해야한다.
① 숫자 (numbers) : primitive하다. 원시 타입으로 bit가 미리 내정되어 있다.
② 숫자가 아닌 나머지 objects : cpu register의 크기가 64bit면 64로 고정된다.
위에서 primitive types가 없다고 하더니 ①은 또 뭔소리냐? 싶을 수 있다.
하지만 kotlin에서 숫자는 primitives로 취급하더라도 객체처럼 메소드를 호출할 수 있다.
∴ kotlin에는 wrapper class 가 없다.
이 캡쳐는 숫자들이 wrapping되지 않고도 method를 호출하는 모습이다.
Datatypes
1.
kotlin의 basic datatype은 모두 objects다. (그래서 method call 가능함)
ex) integer, fp, booleans, char, string, array
2.
integer types의 종류는 다음과 같다.
type | 할당되는 bits |
Long | 64 |
Int (default) | 32 |
Short | 16 |
Byte | 8 |
참고로 여기서 숫자에 bits가 할당된 모습이 primitive하다고 보면 된다.
3.
kotlin의 type casting은 explicit하다. (자동으로 바꿔지지 않고, 코드에 직접 넣어야한다.)
Byte type x를 은근슬쩍 Int type i에 대입시켜 보았더니 이런 에러가 떴다.
아래와 같이 하는 것이 올바르다.
4.
긴 숫자는 underscore _를 이용할 수 있다. (1,000,000에서 , 대신 _를 쓰는 셈이다.)
은근 친절해서 귀엽다,,
5.
string templates 라는 것이 있다.
c언어에서 printf("index =%d", i); 에서 %d 의 역할이라 생각하면 간단히 설명이 될 것 같다.
정확히는, string 내부에 외부 변수의 값을 대입하는 방식이다.
c의 %d같은 문법보다 훨씬 자유롭고 쉽다.
$(달러 기호)를 맨 앞에 붙히면 된다.
여러 syntax가 겹쳐있을 땐 중괄호(curly braces)를 써서 구분해주면 그만이다!
Variables
1.
kotlin 은 변수의 타입에 대해 type inference가 powerful해서 편하다.
type inference는 compile time에 compiler에 의해 일어난다. (statically-typed)
이후에 type을 바꿀 수는 있지만 위에서 언급한 대로 자동으로 바꿔주지는 않고 explicit하다.
2.
변수는 우선 크게 두 종류로 나뉜다. mutable 그리고 immutable!
mutable하게, 즉 변수의 값이 나중에 변할 수 있도록 선언하려면 var을 쓴다.
반대로 immutable하게, 즉 re-assign이 불가능하도록 선언은 val을 쓴다.
kotlin은 bug의 원인을 원천봉쇄하고 싶어해서, 문서마다 immutable을 추천하곤 한다.
3.
is, !is operator는 runtime때 type check를 해준다.
parameter x가 어떤 type이든 될 수 있다는 의미로 Any라고 하였다.
만약 compiler가 이 x를 string으로 type inference하였다면, 그 string x의 길이가 출력될 것이다.
integer 3은 if문 뒤를 수행하지 않았고, string "35"은 수행하여 그 길이를 출력하였음을 확인할 수 있다.
kotlin은 statically-typed language이고 explicit type casting만을 지원하지만,
(compile time에서 type이 결정된 후에는 코드에서 명시적으로 type casting 하지 않는 한, type이 자동으로 바뀌지 않고 에러)
위의 상황에서 compiler가 수행한 Any type에서 String type으로의 type inference를 smart casts라 한다.
Ranges
1.
collection은 값들이 모인 것을 표현하는 framework로, 자료구조라고 생각하면 쉽게 와닿는다.
ex) array, list, set, range, progression 등
2.
ranges는 비교가능한 값들의 범위를 포함하는 data type이다.
이때 '비교가능하다'는 것은 ordering이 되는 것을 의미하는데, 구체적으로는 compareTo()같은 메소드를 호출할 수 있는가를 말한다.
참고로 compareTo() 메소드는 comparable interface에 구현되어 있다.
3.
ranges의 생성자는 rangeTo() 이다.
또는 .. operator를 이용해도 된다.
이때 in은 contain operator다.
직관적으로 보이는 쓰임새 그대로 변수가 range에 contain 되는지 여부를 T/F로 반환한다.
Loop
1.
for문이 가장 추천된다. range를 이용해서 아래와 같이 연습해볼 수 있다.
인상깊은 점은 println을 해도 for문 안에선 줄바꿈이 안된다는 것, downTo는 앞뒤로 공백이 필요하다는 점,
default step은 1이라는 점, 1..10은 10까지 포함된다는 점이 있겠다.
syntax가 직관적인 것이 친절하게 느껴진다^_^
2.
for문 외에도 while, do while이 있고, c와 비슷하다.
3.
repeat loops라는 게 있다.
이렇게 사용하는 것이 대표적이다. 2번 반복한다.
parameter가 2와 println문으로 2개인 셈이다.
'kotlin, java, android' 카테고리의 다른 글
[Kotlin] First-class / Function types / Function literals / Lambda (0) | 2023.03.19 |
---|---|
[Kotlin] varargs(variable arguments) (0) | 2023.03.18 |
[Kotlin] function expression / function parameter / single-expression function (0) | 2023.03.18 |
[kotlin] Lists and arrays / Null safety (0) | 2023.03.12 |
[Kotlin] 기본 문법 정리 (0) | 2023.03.05 |