환경 설정이 매우매우 어려웠다.
또한 패키지, 클래스, 파일에 대한 관계가 복잡하다.
패키지 속 클래스와 파일..인듯? (정확하지 않음)
변수는 val, var 키워드를 통해 선언할 수 있다. val로 선언하면 변수를 더 이상 바꿀 수 없는 "읽기 전용 변수"가 된다. var로 선언하면 값을 바꿀 수 있다.
val은 상수개념인듯하다.
다음은 변수 선언 예시다.
val username: String = "Kildong"
선언 키워드, 변수이름, 자료형, 값 순서다. 그런데!! 코틀린은 자료형을 지정하지 않고 ("Kildong")을 보고나면 알아서 자료형을 지정 가능하다. 한마디로 '자료형을 추론한다.'고 한다.
하지만 자료형을 지정하지 않은 변수는 반드시 자료형을 추정할 값을 지정해야한다.
val은 상수, var은 변수라고 편하게.. 생각해야겠다.
또한 ctrl+shift+p를 동시에 누르면 어떤 자료형으로 추정하였는지 보여준다.
.
.
.
코틀린은 참조형 자료형을 사용한다.
기본형 자료형이란 가공되지 않은 순수한 자료형이고,
참조형 자료형은 객체를 생성하고 동적 메모리 영역에 데이터를 둔 다음 이것을 참조하는 자료형을 말한다.
코틀린은 "참조형 자료형"만을 사용한다. (스택에 주소값을 가지고 그것을 참조하는 방식인 듯 하다. c언어의 포인터의 개념인듯..?)
실제로 참조형은 기본형보다 느리지만 코틀린에서는 자동으로 최적화를 수행하므로 기본형과 속도가 같다.
.
.
.
정수 자료형
보통은 int형으로 추론되므로 작은 범위의 수를 명시하기 위해선 직접 입력해주어야 한다.
실수 자료형
보통은 double형으로 추론되므로 float로 지정하기 위해선 명시해주어야한다. 또는 실수 옆에 F를 붙이면 된다.
부동소수점을 표현하기 위해
val exp02 = 3.14E-2 (왼쪽으로 소수점 2칸 이동 --> 0.0314)
val exp03 = 3.14E2 (오른쪽으로 2칸)
+부호는 생략이 가능하다.
문자 자료형
Char이다. 이는 작은따옴표로 감싼다. 알파벳 하나, 글자 하나가 문자다. 아스키코드로 저장된다.
만약 정숫값을 변환하여 문자로 바꾸기 위해선 toChar() 함수를 사용한다. (65를 A로 바꾸기 위해서)
문자열 자료형
이는 String이고, 문자를 배열에 저장하는 자료형이다.
.
.
.
null을 할당하기 위해선 자료형 뒤에 물음표 기호를 넣어주면 된다.
var str1 : String? = "hello"
str1 = null
.
.
문자열의 길이를 구하기 위해 length를 사용한다. 그런데..
null을 허용하면 위와 같이 length를 사용할 수 없다.
세이프콜을 추가하여 코드가 실행된다. str을 검사하였는데, str속에 아무것도 들어있지 않아 null을 출력한다.
non-null 단정 기호는 null이 아님을 단정하므로 null 검사를 무시한다. 하지만 도중에 NPE를 발생시킨다.
엘비스 연산자 (?:)는 변수가 null인지 검사하여 null이 아니라면 왼쪽 식을 수행하고 null이면 오른쪽 식을 수행한다. 즉 str1->?: 을 보고 null이기 때문에 -1을 출력한다.
.
코틀린에서는 서로 다른 자료형을 비교하거나 연산할 수 없다.
자료형 변환
코틀린에서는 자료형을 변환하기 위해서는 자료형 변환 함수를 사용해야한다.
또한 자료형이 서로 다른 값을 연산한다면 자료형이 표현할 수 있는 범위가 큰 자료형으로 자동 형 변환하여 연산된다.
자료형 비교
자료형을 비교할 때 단순히 값만 비교할 때는 이중등호(==)를 사용하고, 참조 주소까지 비교하기 위해서는 삼중등호(===)를 사용한다.
어떤 값이 정수일 수도 있고 실수일 수도 있다면 스마트 캐스트를 활용하면 편리하다. 대표적인 자료형은 Number형이다.
is 키워드를 사용해 자료형이 같으면 true, 다르면 false를 반환한다.
Any형은 코틀린의 최상위 기본 클래스로 어떤 자료형이라도 될 수 있는 특수한 자료형이다.
x를 Any로 선언하고 string값을 대입해주었다.
int 자료형을 Long형으로 변환하였다.
자료형을 검사하는 함수를 만들어 사용하였다. 또한 함수의 인자를 Any형으로 함으로써 함수 내부에서 String, Int형으로 변환될 수 있다.
기본 연산자와 논리 연산자는 C언어와 똑같기 때문에 생략