1) 일단 Hello, World 부터
- Ubuntu 22.04 에 vscode 를 설치
- Kotlin extension 을 설치
- Kotlin 컴파일&실행을 편하게 하기위해 Code Runner 설치
- Hello, world 를 출력하는 기본코드는 Copilot 에게 부탁해서 작성

실행을 해보면 짠~ Hello, World 출력

2) 변수
다른 프로그래밍 언어대비 특별하게 다른점 없었다.
var 키워드를 사용해서 변수를 선언하고, 변수명 뒤에 타입을 적어주면 된다. (곧바로 값 할당하는 경우에는 타입생략가능)
println 에서 변수명에 있는 값 출력할때 $변수명 또는 ${변수명} 으로 사용가능. $(변수명)은 안됨

val, const val 키워드를 사용하여 선언한 변수는 read only 라서 최초 값 할당한 이후에, 다시 값을 할당할 수 없다.
값을 할당하려고 하면 컴파일 에러 발생

3) 클래스
객체지향 프로그래밍언어의 필수인 클래스
java 와 퀵하게 비교했을때, 특별한 차이 없음. 멤버변수, 멤버함수처럼 사용하면 됨.
키워드 변수명: 변수타입
키워드 함수명: 리턴타입 { ... }

클래스 객채 생성시 호출되는 생성자에 대한 문법.
init 블럭의 코드가 실행되고 클래스명 옆에 생성자 통해 넘어온 파라미터에 접근가능.

생성자로 전달된 매개변수에 var 또는 val 키워드가 없으면 init 블럭에서만 접근가능.
클래스 내부 멤버함수에서 생성자 매개변수에 접근하고 싶으면 var 또는 val 키워드를 사용해야 함.
이 부분이 좀 특이한 문법으로 보이네

init 외에도 constructor 라는 세컨더리 생성자 문법이 있다.
클래스명 바로 옆에 적는게 아니라, java 의 생성자 함수같은 느낌이다.

java 의 static 과 같은 역할로써 Kotlin 에는 object 라는 키워드가 있음
아래 예시를 보면 쉽게 이해가 된다.
static 이기 때문에, 코드 전체(앱 전체)에서 1개만 생성된다. (일반 클래스 인스턴스처럼 여러개 생성불가, Singleton)

일반 클래스 내부에도 object 를 선언할수 있는데, 클래스 내부의 object 영역만 static 하게 사용된다.
아래 코드에서 Person4 의 companion object 블럭 부분은 Person4 클래스 이름으로 바로 접근가능하고,
변수나 함수도 외부에 있는 클래스 멤버함수와 구분되어, 클래스명으로 접근하는 경우에 사용되는 코드영역이다.

Kotlin 에서는 클래스를 단순히 값만 저장하는 용도로 사용하기 위한 특별한 키워드를 제공 (data)
일반클래스 객체를 바로 print 하면 toString() 함수 호출시 객체주소값이 반환되는데,
데이터 클래스 객체는 내부에 저장하고 있는 값을 출력하여 디버깅시 활용성이 좋음.
데이터 클래스도 '클래스'이기 때문에, 생성자호출(init 블럭) 가능하고 내부에 멤버함수도 가질수 있음

kotlin 에도 클래스의 상속개념이 존재함.
상속받을 클래스 이름 옆에 콜론을 적고 그 옆에 부모 클래스 이름을 적으면 된다.
부모클래스의 var 변수는 자식클래스에서 rw(읽기, 쓰기) 모두 가능하고
val 변수는 자식클래스에서 ro(읽기)만 가능하다.

멤버함수멤버함수뿐만 아니라 멤버변수도 부모 클래스와 동일한 이름을 사용한다면 override 키워드를 사용해야한다.

java 의 추상클래스와 같은 역할로 Kotlin 에는 abstract 가 존재
클래스의 멤버함수 정의만 존재하고 구현은 없는 껍대기 클래스이고,
실제 구현은 abstract 클래스를 상속(?)한 클래스에서 로직을 구현함.

java 의 interface 개념과 동일하게 Kotlin 에도 interface 가 존재
interface 는 클래스가 아니기 때문에, 'class' 라는 이름은 사용하지 않음.
인터페이스를 상속받는 클래스에서는 '생성자를 호출하지 않고' 인터페이스 이름만 지정함
인터페이스의 함수를 구현할 일반클래스에서는 동일하게 'override' 키워드를 사용하여 인터페이스에 정의된 함수로직을 구현

java 의 접근제한자 개념이 Kotlin 에도 동일하게 존재
| 접근제한자 | 제한범위 |
| private | 다른 파일에서 접근불가 |
| internal | 같은 모듈의 파일에서만 접근가능 (다른모듈에서 접근불가) |
| protected | 기본적으로 private 와 동일. 단, 자식 클래스에서 접근가능 |
| public | 접근에 아무런 제한 없음. 모든 파일에서 접근가능. |
Java 의 여러 타입을 수용할수 있는 제네릭 개념이 Kotlin 에도 존재.
Java 와 차이점 없음. 동일하게 사용하면 됨.

클래스는 역시 뭐가 많구만...

4) 조건문
if, else if, else 로 구성되는 조건문도 특별한 부분 없음.
근데, 조건문의 결과를 곧바로 변수에 대입가능. (아래 예시에서 even, odd 를 result 에 할당하는 부분 참고)
조건문의 if절 또는 if else, else 절의 마지막 값이 변수에 저장된다.

Kotlin 에는 range expression (숫자1..숫자2) 이 있는데, 이 부분 직관적이고 편해보임
논리식의 not 은 느낌표를 사용하면 됨 (!)

When 은 다른 프로그래밍 언어의 Switch ~ case 와 유사한데, 더 직관적임.
if~ else 에서 마지막 값을 변수에 바로 할당한것처럼 when 도 동일하게 가능.


5) 배열과 컬렉션
배열은 선언할때 크기를 미리 정해야하고, 이후에 배열 크기 변경불가
컬렉션은 동적으로 크기 변경 가능 (Mutable 인경우에만 크기 변경가능)

배열[인덱스] = 값 또는 배열.set(인덱스, 값) 으로 배열의 값 변경가능

리스트 컬렉션에 값 추가/삭제 및 크기 조회하기

이외에도 Kotlin 의 컬렉션(자료구조)에는 set, map 이 존재.
set 은 동일한 값이 존재하지 않도록 하는(중복을 허용하지 않는) 컬렉션
map 은 키-값 형태로 값을 저장할수 있도록 지원하는 컬렉션
컬렉션은 수정가능한 Mutable 과 수정불가능한 Immutable 이 존재.
Immutable 은 Mutable 이라는 키워드를 제외한 컬렉션 이름을 사용하면 된다.

6) 반복문
다른 프로그래밍 언어와 동일하게 for 반복문, while 반복문(do-while 포함)을 모두 지원한다.
for loop, while loop 내부에서 순환을 멈추거나 계속하고자 할때 break, continue 사용한다.
Kotlin 의 차별점이라면 loop 에 사용할수 있는 몇가지 표현이 존재한다. (until, downTo, step)

7) 함수
Kotlin 의 함수사용법 역시 다른 프로그래밍 언어대비 특별한 부분은 없다.
다른언어들이 지원하는 named argument, default parameter 값 설정하는 방법을 모두 제공한다.

일단 함수까지 살펴봤을때 다른 언어대비 아주 특별한 차이는 못느꼈다. 키워드나 표현방식만 조금 차이날뿐.
이후에 null값처리, 지연초기화, 스코프함수 부분이 Kotlin 만의 특별한 부분일것 같다.
※ 코파일럿이 알아서 샘플코드를 척척 작성해주니(auto completion) 너무 편하다...

'안드로이드 앱' 카테고리의 다른 글
| 안드로이드 젯팩 컴포즈 (ch22~25) - Slot API, 모디파이어(Modifier), Row/Column 레이아웃 (0) | 2025.11.26 |
|---|---|
| 안드로이드 젯팩 컴포즈 (ch18~21) - 컴포저블 개념, 상태 및 재구성 (0) | 2025.11.26 |
| 안드로이드 젯팩 컴포즈 스터디 시작. (0) | 2025.11.23 |
| 안드로이드 앱 개발에 필요한 모든 것 (목차) (0) | 2025.11.22 |
| 안드로이드 앱 3개 따라만들기 (0) | 2025.11.22 |