자바에서는 최상위에 클래스만 선언할 수 있으며, 변수나 함수는 최상위에 선언할 수 없다. => 코틀린은 가능
코틀린의 모든 변수는 객체다
변수는 값을 저장할 수 있는 메모리상의 공간
* Java 데이터 타입
int나 char같이 변수의 형을 지정해주고 있는 것이 변수의 타입(data type = 자료형)
자료형은 data의 type에 따라 값이 저장될 공간의 크기와 저장 형식을 정의한 곳
- 기본형(primitive value, 원시 타입, 자료형) : boolean, char, byte, short, int, long, float, double
=> 산술 연산 가능, null로 초기화 불가, 스택 메모리에 저장되며 접근할 때 한번의 참조면 충분
- 참조형(reference type, 래퍼 클래스) : Integer
=> 기본형을 객체로 다루기 위해 사용하는 클래스들의 래퍼클래스 (Double, Float, Long, Integer, Short, Byte, Character, Boolean), 매개변수로 객체를 필요할때, 기본형 값이 아닌 객체로 저장해야 할때, 객체간 비교가 필요할때 사용
=> 산술 연산 불가능, null 처리 가능, 재너릭 타입에서 사용 가능, 하나의 인스턴스이기 떄문에 스택메모리에는 참조 값만 존재하고, 실제 값은 힙 메모리에 존재 -> 값을 필요로 할 떄 언박식 과정을 거쳐야하므로 접근 속도가 느리다
코틀린은 원시타입과 참조타입을 구분하지 않는다.
문자열 표현시 삼중따옴표(""") 로 표현할 때는 키보드로 입력한 줄 바꿈이나 들여쓰기 등이 데이터에 그대로 반영됨
코틀린에서 String 타입의 데이터에 변수나 연산식의 결과값을 포함할때 쓰는 $는 문자열 템플릿
Any 는 코틀린에서 최상위 클래스
Nothing 는 null 이나 예외를 반환하는 함수
함수의 매개변수에는 var이나 val 키워드를 사용할 수 없습니다.
val이 자동적으로 적용되며 함수 안에서 매개변수 값을 변경할 수 없습니다.
또한 매개변수에 기본값을 선언할 수 있습니다.
매개변수명을 지정하여 호출하는 것을 명명된 매개변수
컬렉션
컬렉션 타입이란 여러 개의 데이터를 표현하는 방법이며 Array, List, Set, Map 이 있습니다. 컬렉션 인터페이스를 타입으로 표현한 클래스. 컬렉션 타입 클래스
Array
배열은 Array클래스, 타입은 제네릭으로 표현 val data1 : Array<Int> = Array(3, {0})
* 제네릭 : 선언하는 곳이 아니라 이용하는 곳에서 타입을 지정하는 기법
데이터 접근은 [], 혹은 get(), set() 모두 가능
기초 타입의 배열도 있음 IntArray, BooleanArray, ByteArray,...
arrayOf() 함수를 이용하면 배열을 선언할 때 값을 할당할 수도 있다. val data1 = arrayOf<Int>(10, 20, 30)
List
순서가 있는 데이터 집합, 데이터의 중복을 허용
Set
순서가 없고 데이터의 중복을 허용하지 않음
Map
키와 값으로 이루어진 데이터 집합, 순서가 없고 키의 중복을 허용하지 않음
Map 객체의 키와 값은 Pair 객체를 이용할 수도 있고, 키 to 값 형태로도 이용 가능
val map = mapOf<String, String>(Pair("one","hello"), "two" to "world")
*list, set, map 모두 불변, 가변 2가지 타입의 클래스를 제공
조건문 반복문
다양한 유형의 조건 제시
when(data) {
is String ->
20, 30 ->
in 1..10 ->
}
조건만 명시
when {
data <= 0 ->
data > 100 ->
else ->
}
indices : 컬렉션 타입의 인덱스 값
인덱스와 실제 데이터를 함께 가져오려면 withIndex() for((index, value) in data.withIndex()) { }
모든 코틀린 컬렉션은 그에 상응하는 자바 컬렉션 인터페이스의 인스턴스다 == 코틀린의 모든 타입은 객체
(코틀린의 모든것이 객체다라는 척학에 의해 데이터 타입과 객체 타입의 일관성, 널처리를 위함)
클래스와 생성자
코틀린의 주생성자는 constructor라는 키워드로 클래스 선언부에 선언. constructor 생략 가능
class User() {}
init{} 는 주 생성자의 본문을 구현하는 용도
생성자의 매개변수를 var이나 val 키워드로 서언하면 클래스의 멤버 변수로 사용 가능하다
class User(var name : String, val count: Int) { }
클래스 내에 주 생성자가 있다면 보조 생성자는 this()구문을 이용해 주 생성자를 호출해야 합니다.
class User(name : String) {
constructor(name: String, count: Int) : this(name) { }
}
상속
클래스를 선언할때 다른 클래스를 참조해서 선언하는 것을 상속
오버라이딩 : 재정의, 상위 클래스에 선언된 변수나 함수를 같은 이름으로 하위 클래스에서 다시 선언하는 것. 상위 클래스에서 오버라이딩을 허용할 변수나 함수 선언 앞에 open 키워드를 추가해야함
접근제한자
public : 모든 클래스에서 가능
internal : 같은 모듈 내에서 가능
protected : 상속 관계의 하위 클래스에서만 가능 (최상위에서 사용 불가)
private : 클래스 내부에서만 이용
데이터 클래스
data 키워드로 선언. 자주 사용하는 데이터르르 객체로 묶어줌.
VO(value-object) 클래스를 편리하게 이용
equals
일반 클래스의 equals : 객체 자체를 비교
data 클래스의 equals : 객체의 데이터를 비교, 주 생성자에 선언한 멤버 변수의 데이터만 비교 대상이다
toString
객체 포함하는 멤버 변수의 데이터를 출력
오브젝트 클래스
익명 클래스를 만들 목적으로 사용. 선언과 동시에 객체를 생성.
타입을 따로 명시하지 않으면 Any로 설정됨
Companion object
Java의 static 대체. 멤버 변수나 함수를 클래스 접근하고자 할 때 사용.
클래스의 멤버는 객체를 생성해서 접근해야하는데, 컴패니언 클래스는 객체를 생성하지 않고서도 클래스 이름으로 특정 멤버를 사용가능.
람다 함수 : 익명 함수 정의 기법
선언과 호출
{no1 : Int, no2 : Int -> no1 + no2 } (10, 20)
함수는 소괄호를 이용해 호출해 주어야 실행됨
람다 함수의 반환값은 마지막 줄의 실행 결과
타입별칭
typealias 타입의 별칭을 선언
typealias MyFunType = (Int, Int) -> Boolean
val someFun : MyFunType = {no1, no2 -> no1 > no2 }
고차함수
코틀린에서는 함수를 매개변수로 전달받거나 반환하는 고차함수를 지원
널 안전성
객체는 데이터가 저장된 주소를 참조하므로 참조 변수
데이터가 메모리에 저장된 위치를 식별하는 것이 주소 -> 이 주소로 메모리에 접근해서 데이터를 이용
널은 객체가 주소를 가지지 못한 상태
객체가 널인 상태에서 널 포인터 예외가 발생하지 않도록 연산자를 비롯해 여러 기법을 제공함으로써 널 안정성 제공
엘비스 연산자 ?:
변슈가 널일때 대입해야 하는 값
'Android' 카테고리의 다른 글
[코틀린] apply, run, with, let, also? (1) | 2023.11.29 |
---|---|
안드로이드에서 dp란? (0) | 2023.11.23 |
Flow 개념 (0) | 2023.08.30 |
코루틴 (0) | 2023.08.30 |
Glide (0) | 2023.08.30 |