[Kotlin(μ½”ν‹€λ¦°)] 문법 총 정리

2023. 12. 12. 01:15γ†κ°œλ… 정리 μž‘μ—…μ‹€/Kotlin

728x90
λ°˜μ‘ν˜•

 

 

카카였페이 | 마음 놓고 κΈˆμœ΅ν•˜λ‹€

μ—¬κΈ°λ₯Ό 눌러 링크λ₯Ό ν™•μΈν•˜μ„Έμš”.

qr.kakaopay.com

 

 

 

 

 

μ½”ν‹€λ¦° μ™„λ²½ κ°€μ΄λ“œ

COUPANG

www.coupang.com

 

"이 ν¬μŠ€νŒ…μ€ 쿠팑 νŒŒνŠΈλ„ˆμŠ€ ν™œλ™μ˜ μΌν™˜μœΌλ‘œ, 이에 λ”°λ₯Έ μΌμ •μ•‘μ˜ 수수료λ₯Ό μ œκ³΅λ°›μŠ΅λ‹ˆλ‹€."

 




 

 

 

πŸš€ Kotlin 문법 총 정리

    πŸ”½ λ“€μ–΄κ°€κΈ°

        πŸ“¦ μ†Œκ°œ

μ•ˆλ…•ν•˜μ„Έμš”?

Andloid(μ•ˆλ“œλ‘œμ΄λ“œ), Spring Boot(μŠ€ν”„λ§ λΆ€νŠΈ)λ₯Ό μ΄μš©ν•΄μ„œ κ°œλ°œν•  λ•Œ, Java(μžλ°”)λ₯Ό μ‚¬μš©ν•  μˆ˜λ„ μžˆμ§€λ§Œ, JetBrainsμ—μ„œ λ§Œλ“  Kotlin(μ½”ν‹€λ¦°)을 μ‚¬μš©ν•΄μ„œ κ°œλ°œμ„ ν•  μˆ˜λ„ μžˆμ–΄μš”.

유λͺ… μœ λ‹ˆμ½˜ 기업듀은 이미 μŠ€ν”„λ§ λΆ€νŠΈ 등을 κ°œλ°œν•  λ•Œ, μžλ°”κ°€ μ•„λ‹Œ μ½”ν‹€λ¦°μœΌλ‘œ κ°œλ°œν•˜κ³  있고, μ•ˆλ“œλ‘œμ΄λ“œ μ§„μ˜κ³Ό μŠ€ν”„λ§ λΆ€νŠΈ μ§„μ˜μ˜ 개발자라면 κ³΅λΆ€ν•˜λ©΄ μ’‹λ‹€κ³  생각이 λ˜μ–΄ 코틀린을 곡뢀해 보렀고 ν•΄μš”.

이번 글은 μ½”ν‹€λ¦°μ˜ κΈ°λ³Έ 문법과 νŠΉμ§•μ„ νŒŒμ•…ν•˜κ³ , μ‚¬μš©ν•  수 μžˆλ„λ‘ 정리해 보도둝 ν•  κ±°μ—μš”.

μ°Έκ³ ν•œ κ°•μ˜λŠ” μ•„λž˜ κ°•μ˜μ—μš”.

 

[무료] Kotlin 문법 총 정리 - 1μ‹œκ°„ - μΈν”„λŸ° | κ°•μ˜

1μ‹œκ°„ μ•ˆμ— ν•™μŠ΅ν•  수 μžˆλŠ” μ½”ν‹€λ¦° 문법 총 정리 κ°•μ˜μž…λ‹ˆλ‹€., λ°”μœ μ—¬λŸ¬λΆ„μ—κ²Œ λ”±!1μ‹œκ°„ λ§Œμ— μ •λ¦¬ν•˜λŠ” μ½”ν‹€λ¦° 문법 ⭐ μ–΄λ €μš΄ μ½”ν‹€λ¦°,λΉ λ₯΄κ²Œ μ •λ¦¬ν•©λ‹ˆλ‹€ πŸ“Œ λ³Έ κ°•μ˜λŠ” μœ νŠœλΈŒμ—μ„œ 인기 μžˆλŠ” 원

www.inflearn.com


ν•΄λ‹Ή κ°•μ˜λŠ” μ•ˆλ“œλ‘œμ΄λ“œ κΈ°μ€€μœΌλ‘œ μ„€λͺ…ν•˜λŠ” κ°•μ˜μ΄μ§€λ§Œ, μ£Όλ‹ˆλŠ” 코프링(kotlin + spring boot)λ₯Ό μœ„ν•œ 기쀀을 작고 진행해 보렀고 ν•΄μš”.

λ”°λΌμ„œ κ°•μ˜μ—μ„œλŠ” IDEλ₯Ό μ•ˆλ“œλ‘œμ΄λ“œ μŠ€νŠœλ””μ˜€λ₯Ό μ‚¬μš©ν•˜μ§€λ§Œ, μ£Όλ‹ˆλŠ” InteliJ(μΈν…”λ¦¬μ œμ΄)λ₯Ό μ΄μš©ν•΄μ„œ 곡뢀해 보도둝 ν• κ±°μ—μš”.

참고둜 코틀린을 곡뢀할 λ•Œ, μžλ°”λ₯Ό μ•„λŠ” μƒνƒœμ—μ„œ 비ꡐ해 κ°€λ©΄μ„œ κ³΅λΆ€ν•˜λŠ” 것이 κ°€μž₯ 쒋은 방법이라고 μƒκ°ν•΄μš”.
코틀린을 κ³΅λΆ€ν•˜μ‹œκ³ μž ν•œλ‹€λ©΄ μžλ°”λ₯Ό κΌ­ 곡뢀해 μ£Όμ„Έμš”.

 

 

Java의 정석: 기초편 μ„ΈνŠΈ

COUPANG

www.coupang.com

 

 

 

Java의 정석:μ΅œμ‹  Java 8.0 포함

COUPANG

www.coupang.com


이번 글은 μžλ°”λ₯Ό μ•„μ‹ λ‹€λŠ” κ°€μ •ν•˜μ— μž‘μ„± λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

 

 

 

        πŸ“¦ Java, Kotlin, TypeScript μ–Έμ–΄λ“€μ˜ νŠΉμ§•

μ£Όλ‹ˆκ°€ 코틀린을 μ‚¬μš©ν•  수 있게 되면 λŒ€ν‘œμ μœΌλ‘œ μžλ°”, μ½”ν‹€λ¦°, TypeScriptλ₯Ό μ‚¬μš©ν•  수 있게 λΌμš”.
(JavaScript도 ν•  쀄 μ•Œμ§€λ§Œ, 비ꡐ λŒ€μƒμ—μ„œ μ œμ™Έ.) κ·Έλ ‡λ‹€λ©΄ 이 세가지 μ–Έμ–΄μ˜ νŠΉμ§•μ€ μ–΄λ–€ 것듀이 μžˆμ„κΉŒμš”?

βœ… 차이점

πŸ“ μ–Έμ–΄ 및 μƒνƒœκ³„

1) μžλ°”
- μžλ°”λŠ” 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‘œ JVM(Java Virtual Machine)μ—μ„œ μ‹€ν–‰.
- μ—”ν„°ν”„λΌμ΄μ¦ˆ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 및 μ•ˆλ“œλ‘œμ΄λ“œ μ•± 개발 λ“± λ‹€μ–‘ν•œ λΆ„μ•Όμ—μ„œ μ‚¬μš© κ°€λŠ₯.

2) μ½”ν‹€λ¦°
- JetBrainsμ—μ„œ κ°œλ°œν•œ JVM 및 μ•ˆλ“œλ‘œμ΄λ“œμ—μ„œ μ‹€ν–‰λ˜λŠ” 곡식적인 μ•ˆλ“œλ‘œμ΄λ“œ μ–Έμ–΄.
- μžλ°”μ™€μ˜ 100% μƒν˜Έ μš΄μš©μ„±μ„ μ œκ³΅ν•˜λ©΄μ„œ 더 κ°„κ²°ν•˜κ³ , μ•ˆμ „ν•œ 문법 제곡.

3) TypeScript
- MS(Microsoft)μ—μ„œ κ°œλ°œν•œ JavaScript의 μƒμœ„ μ§‘ν•œ μ–Έμ–΄λ‘œ, 정적 νƒ€μž… 지원.
- λŒ€κ·œλͺ¨ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ— 주둜 μ‚¬μš©λ˜λ©°, JavaScript Runtimeμ—μ„œ μ‹€ν–‰.

 

βœ… νƒ€μž… μ‹œμŠ€ν…œ

πŸ“ μžλ°”
- μžλ°”λŠ” 정적 νƒ€μž… μ–Έμ–΄λ‘œ, 컴파일 νƒ€μž„μ— νƒ€μž… 확인.
- λͺ…μ‹œμ μœΌλ‘œ νƒ€μž… μ„ μ–Έν•΄μ•Ό 함. (단, μžλ°” 10λΆ€ν„° λ„μž…λœ '둜컬 λ³€μˆ˜ νƒ€μž… μΆ”λ‘ 'μ΄λΌλŠ” κΈ°λŠ₯을 쑴재. μ΄λŠ” var ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•Œ μ»΄νŒŒμΌλŸ¬κ°€ μš°λ³€μ˜ ν‘œν˜„μ‹μ„ 기반으둜 λ³€μˆ˜μ˜ νƒ€μž…μ„ μΆ”λ‘ ν•  수 있게 ν•˜λŠ” κΈ°λŠ₯. 이λ₯Ό 톡해 μ½”λ“œμ˜ 가독성을 ν–₯μƒμ‹œν‚€κ³  반볡 μ½”λ“œλ₯Ό 쀄일 수 μžˆλ‹€.)

πŸ“ μ½”ν‹€λ¦°
- 정적 νƒ€μž… 언어이며, μžλ°”μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ 컴파일 νƒ€μž„μ— νƒ€μž… 확인.
- νƒ€μž… 좔둠을 톡해 μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ μž‘μ„±ν•  수 μžˆλ„λ‘ 지원.

πŸ“ νƒ€μž…μŠ€ν¬λ¦½νŠΈ
- 정적 νƒ€μž… 언어이며, JavaScript의 μƒμœ„ μ§‘ν•©μ΄λ―€λ‘œ νƒ€μž…μ„ λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έν•˜μ§€ μ•Šμ•„λ„ λ˜λŠ” νŠΉμ§•.
- Optionalν•œ 정적 νƒ€μž… μ‹œμŠ€ν…œμ„ μ œκ³΅ν•˜μ—¬ νƒ€μž… μΆ”λ‘ κ°€λŠ₯.

 

βœ… 문법 및 νŠΉμ§•

πŸ“ μžλ°”
- μƒλ‹Ήνžˆ λͺ…μ‹œμ μ΄κ³ , λ¬Έμž₯을 많이 μ μ–΄μ€˜μ•Ό ν•˜λŠ” μ–Έμ–΄.

- Null μ•ˆμ •μ„±μ„ 보μž₯ν•˜κΈ° μœ„ν•œ μΆ”κ°€ λ…Έλ ₯ ν•„μš”.
- λͺ¨λ“  λ³€μˆ˜κ°€ Null이 될 수 μžˆλ‹€.
- μžλ°”λŠ” λͺ…μ‹œμ  ν˜• λ³€ν™˜ μ‚¬μš©.
- μžλ°”λŠ” Null 병합 μ—°μ‚°μž ??λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠμŒ.

πŸ“ μ½”ν‹€λ¦°
- ν‘œν˜„λ ₯이 ν’κ΅¬ν•˜κ³ , κ°„κ²°ν•œ 문법 제곡.
- Null μ•ˆμ •μ„±, ν™•μž₯ ν•¨μˆ˜, 데이터 클래슀 λ“±μ˜ νŠΉμ§•
- 기본적으둜 λ³€μˆ˜κ°€ Null 값을 받을 수 μžˆλŠ”μ§€ μ—¬λΆ€λ₯Ό λͺ…μ‹œμ μœΌλ‘œ 지정해야 함. ?(λ¬ΌμŒν‘œ)λ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜κ°€ Null을 받을 수 μžˆμŒμ„ ν‘œμ‹œ.
- as ν‚€μ›Œλ“œλ₯Ό ν†΅ν•œ νƒ€μž… κ°•μ œ λ³€ν™˜ μˆ˜ν–‰ κ°€λŠ₯.
- Null 병합 μ—°μ‚°μž ?: λ₯Ό μ‚¬μš©ν•˜μ—¬ Null κ°’ λŒ€μ²΄ κ°€λŠ₯.

πŸ“ νƒ€μž…μŠ€ν¬λ¦½νŠΈ
- JavaScript의 ν™•μž₯으둜, ES6+의 μƒˆλ‘œμš΄ κΈ°λŠ₯κ³Ό 정적 νƒ€μž… μ‚¬μš© κ°€λŠ₯.
- 클래슀, μΈν„°νŽ˜μ΄μŠ€, μ œλ„€λ¦­ λ“±κ³Ό 같은 객체지ν–₯ 및 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° 지원.
- JavaScriptμ™€μ˜ ν˜Έν™˜μ„± μœ μ§€λ₯Ό μœ„ν•΄ 기본적으둜 λͺ¨λ“  λ³€μˆ˜κ°€ Null이 될수 μžˆμœΌλ‚˜, λ³€μˆ˜λ₯Ό λͺ…μ‹œμ μœΌλ‘œ νƒ€μž… μ§€μ •ν•˜μ—¬ Null을 받을 수 μžˆμŒμ„ ν‘œμ‹œν•  μˆ˜λ„ 있음. μ½”ν‹€λ¦°κ³Ό 같이 ?(λ¬ΌμŒν‘œ)λ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€μˆ˜κ°€ Null을 받을 수 μžˆμŒμ„ ν‘œμ‹œν•˜κ±°λ‚˜, λ³€μˆ˜ νƒ€μž…μ— | null = nullκ³Ό 같이 μ„ μ–Έ.
- as ν˜Ήμ€ <Type> ꡬ문을 μ΄μš©ν•˜μ—¬ νƒ€μž… κ°•μ œ λ³€ν™˜ μˆ˜ν–‰ κ°€λŠ₯.
- Null 병합 μ—°μ‚°μž ?? λ₯Ό μ‚¬μš©ν•˜μ—¬ Null κ°’ λŒ€μ²΄ κ°€λŠ₯.

 

βœ… 비동기 ν”„λ‘œκ·Έλž˜λ°

πŸ“ μžλ°”
- μžλ°”μ—μ„œλŠ” 기본적으둜 μŠ€λ ˆλ“œμ™€ 락을 μ‚¬μš©ν•˜μ—¬ 비동기 ν”„λ‘œκ·Έλž˜λ° 지원.

- μžλ°” 5λΆ€ν„°λŠ” java.util.concurrent νŒ¨ν‚€μ§€λ₯Ό 톡해 λ”μš± 고차원적인 비동기 κΈ°λŠ₯ μ‚¬μš© κ°€λŠ₯.

πŸ“ μ½”ν‹€λ¦°
- 코루틴을 톡해 비동기 μ½”λ“œ μž‘μ„±.
- 코루틴은 비동기 μ½”λ“œλ₯Ό κ°„κ²°ν•˜κ²Œ μž‘μ„±ν•˜κ³ , 관리할 수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” κΈ°λŠ₯.

πŸ“ νƒ€μž…μŠ€ν¬λ¦½νŠΈ
- JavaScript의 비동기 νŒ¨ν„΄μ„ ν™œμš©ν•˜λ©°, Promise와 async/await을 톡해 비동기 μ½”λ“œ μž‘μ„±.

 

βœ… 곡톡점

πŸ“ μžλ°”μ™€ μ½”ν‹€λ¦°
- μžλ°”μ™€ μ½”ν‹€λ¦° λͺ¨λ‘ JVMμ—μ„œ μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ— μžλ°”μ™€ μ½”ν‹€λ¦° μ½”λ“œ 혼용 κ°€λŠ₯.

 

βœ… μƒν˜Έ μš΄μš©μ„±

πŸ“ μžλ°”μ™€ μ½”ν‹€λ¦°
- 코틀린은 100% μžλ°”μ™€ μƒν˜Έ 운용이 κ°€λŠ₯ν•˜λ©°, μžλ°” μ½”λ“œλ₯Ό μ½”ν‹€λ¦°μœΌλ‘œ λ³€ν™˜ν•˜κ±°λ‚˜, μ½”ν‹€λ¦° μ½”λ“œλ₯Ό μžλ°”λ‘œ λ³€ν™˜ κ°€λŠ₯.

πŸ“ νƒ€μž…μŠ€ν¬λ¦½νŠΈ
- TypeScriptλŠ” JavaScript와 μ™„λ²½ν•œ μƒν˜Έ 운용이 κ°€λŠ₯ν•˜λ©°, κΈ°μ‘΄ JavaScript μ½”λ“œλ₯Ό TypeScript둜 ν™•μž₯ν•˜λŠ” λ°©μ‹μœΌλ‘œ μ‚¬μš© κ°€λŠ₯.

 

βœ… λͺ¨λ˜ν•œ νŠΉμ§• 지원

πŸ“ μžλ°”μ™€ μ½”ν‹€λ¦°
- μžλ°”μ™€ 코틀린은 μ΅œμ‹  λ²„μ „μ—μ„œ κ³„μ†ν•΄μ„œ λͺ¨λ˜ν•œ κΈ°λŠ₯ λ„μž… 쀑.

 

 

 

 

 

 

    πŸ”½ Project

        πŸ“¦ 초기 ꡬ성


졜초 μΈν…”λ¦¬μ œμ΄λ₯Ό 켜고, μƒˆ ν”„λ‘œμ νŠΈλ₯Ό λˆŒλŸ¬μ€λ‹ˆλ‹€.



그리고 μœ„μ™€ 같이 Path(μœ„μΉ˜)와 이름을 μ •ν•˜κ³ , μ–Έμ–΄λŠ” μ½”ν‹€λ¦°μœΌλ‘œ μ„ νƒν•œ λ’€ JDK Version을 μ£Όλ‹ˆλŠ” 11둜 μž‘μ•„ μ£Όμ—ˆμ–΄μš”.
μ΄λ ‡κ²Œ ν•œ λ’€ 생성 λ²„νŠΌμ„ 클릭해 μ£Όμ—ˆμ–΄μš”.



그럼 μœ„μ™€ 같이 Project(ν”„λ‘œμ νŠΈ)κ°€ λ§Œλ“€μ–΄μ§„ κ±Έ μ•Œ 수 μžˆμ–΄μš”.
ν˜„μž¬λŠ” 아무 νŒŒμΌλ„ μ—†λŠ”κ±Έ μ•Œ 수 μžˆμ–΄μš”.


μœ„μ™€ 같이 Class(클래슀) File(파일)을 ν•˜λ‚˜ λ§Œλ“€μ–΄ μ€„κ²Œμš”.



μ£Όλ‹ˆλŠ” μœ„μ™€ 같이 Main.kt λΌλŠ” νŒŒμΌμ„ λ§Œλ“€μ–΄ μ£Όμ—ˆμ–΄μš”.



μœ„μ™€ 같이 빈 Main.kt 파일이 λ§Œλ“€μ–΄ μ‘Œμ–΄μš”.


main()


μžλ°”λ„ main()이 μžˆλ“― 코틀린도 λ§ˆμ°¬κ°€μ§€μ—μš”.
μœ„μ™€ 같이 main()을 λ§Œλ“€κ³ , Hello Juny!!λ₯Ό 좜λ ₯ν•˜λ„λ‘ ν•΄ λ³΄μ•˜μ–΄μš”.

참고둜 μžλ°”μ™€ λΉ„κ΅ν–ˆμ„ λ•Œ, print() λ¬Έ 뒀에 ;(μ„Έλ―Έμ½œλ‘ )을 넣지 μ•Šμ•„λ„ λœλ‹€λŠ” 것이 νŠΉμ§•μ΄μ—μš”.

싀행은 1 μ˜†μ— μž¬μƒ ν‘œμ‹œλ₯Ό λˆ„λ₯΄λ©΄ λΌμš”.


μœ„μ™€ 같이 μ‹€ν–‰ν•  수 μžˆμ–΄μš”


μœ„μ™€ 같이 잘 처리된걸 확인할 수 μžˆμ–΄μš”.

이제 λΆ€ν„°λŠ” μΈν…”λ¦¬μ œμ΄μ—μ„œ Mac κΈ°μ€€ μ‹€ν–‰ν•  λ•Œ, 

 


이 두 κΈ°λŠ₯을 μ΄μš©ν•΄μ„œ 기동할 수 μžˆμ–΄μš”.



 

 

 

 

    πŸ”½ 기초 문법

        πŸ“¦ print, println

μ΄λ²ˆμ—λŠ” Console(μ½˜μ†”) 좜λ ₯에 λŒ€ν•΄ μ•Œμ•„λ³Όκ²Œμš”.


src/main/kotlin/Main.kt


μœ„μ™€ 같이 print(), println()을 μ‚¬μš©ν•  수 μžˆμ–΄μš”.





        πŸ“¦ Variable

μ΄λ²ˆμ—λŠ” μ½”ν‹€λ¦°μ˜ λ³€μˆ˜μ— λŒ€ν•΄ μ•Œμ•„λ³Όκ²Œμš”.

μ½”ν‹€λ¦°μ—μ„œ λ³€μˆ˜λ₯Ό μ„ μ–Έν•  λ•ŒλŠ” var(Variable) λΌλŠ” Keyword(ν‚€μ›Œλ“œ)λ₯Ό μ‚¬μš©ν•΄ μ£Όμ–΄μ•Ό ν•΄μš”.
JavaScript, TypeScript의 경우 var ν˜Ήμ€ let ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•΄μš”.

src/main/kotlin/Main.kt

 


코틀린은 μžλ°”μ™€ λ‹€λ₯΄κ²Œ Type(νƒ€μž…)을 μΆ”λ‘ ν•˜λŠ” κΈ°λŠ₯을 가지고 있기 λ•Œλ¬Έμ—
μžλ°”μ™€ 같이 μžλ£Œν˜• νƒ€μž…μ„ μ„ μ–Έν•˜μ§€ μ•Šμ•„λ„ λΌμš”.

λ¬Όλ‘  μ΅œμ‹  λ²„μ „μ˜ μžλ°” μ—­μ‹œ νƒ€μž… 좔둠이 κ°€λŠ₯ν•΄μš”.

λ§Œμ•½ μžλ£Œν˜• νƒ€μž…μ„ μ§€μ •ν•˜κ³  μ‹Άλ‹€λ©΄ μ•„λž˜μ™€ 같이 ν•˜λ©΄ λΌμš”.

src/main/kotlin/Main.kt

 


μœ„μ™€ 같이 μžλ£Œν˜•μ„ λ³€μˆ˜λͺ… 뒀에 μ“°λŠ” 문법은 TypeScript와 μœ μ‚¬ν•΄μš”.

코틀린은 λͺ¨λ“  μžλ£Œν˜• νƒ€μž…μ΄ Wrapper(래퍼) νƒ€μž…μ„ 가지고 μžˆμ–΄μš”.
μžλ°”λŠ” μ†Œλ¬Έμžλ‘œ int, double 등을 λͺ…μ‹œν•΄μ„œ μ›μ‹œν˜• νƒ€μž…μ„ 지정할 μˆ˜λ„ μžˆλŠ”λ°,
코틀린은 λͺ¨λ‘ 래퍼 νƒ€μž…μœΌλ‘œ 지정해주어야 ν•΄μš”.

즉, μžλ°”μ—μ„œ μ œκ³΅λ˜λŠ” λͺ¨λ“  μžλ£Œν˜• νƒ€μž…λ“€μ΄ μ΄λ ‡κ²Œ 래퍼 클래슀 νƒ€μž…μœΌλ‘œ μ΄μš©ν•  수 μžˆλŠ” κ±°μ—μš”.


 

 

        πŸ“¦ Constant

μ΄λ²ˆμ—” μ½”ν‹€λ¦°μ˜ Constant(μƒμˆ˜)에 λŒ€ν•΄ μ•Œμ•„λ³Όκ²Œμš”.
μ½”ν‹€λ¦°μ—μ„œ μƒμˆ˜λŠ” val(Value) μ΄λΌλŠ” ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•΄μ•Όν•΄μš”.

src/main/kotlin/Main.kt

 



λ³€μˆ˜μ˜ 경우 값을 재 λŒ€μž…ν•˜μ—¬ λ‹€μ‹œ 값을 담을 수 μžˆλŠ” κ·Έλ¦‡μ΄μ§€λ§Œ, μƒμˆ˜μ˜ 경우 값을 재 λŒ€μž…ν•  수 μ—†λŠ” κ·Έλ¦‡μ΄μ—μš”.
κ·Έλž˜μ„œ μœ„μ™€ 같이 Compile(컴파일) κ³Όμ •μ—μ„œ Errorκ°€ λ‚˜λŠ”κ±Έ μ•Œ 수 μžˆμ–΄μš”.

μžλ°”μ—μ„œλŠ” μƒμˆ˜λ‘œ μ„ μ–Έν•  λ•Œ, final ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜κ³ , JavaScript, TypeScript 같은 κ²½μš°μ—λŠ” constent ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•΄μš”.



 

        πŸ“¦ Top Level Constent Const

μ΄λ²ˆμ—λŠ” const에 λŒ€ν•΄ μ•Œμ•„λ³Όκ²Œμš”.
constλŠ” 컴파일 νƒ€μž„ μƒμˆ˜μ—μš”.

μžλ°”μ—μ„œλŠ” 클래슀 선언이 ν•„μš”ν•˜κ³ , κ·Έ μ•ˆμ— Main(메인) Method(λ©”μ„œλ“œ) μ•ˆμ—μ„œ μ—¬λŸ¬κ°€μ§€ 코딩을 ν•΄μ£Όμ–΄μ•Ό ν–ˆμ–΄μš”.
즉, 클래슀 μ•ˆμ— μ„ μ–Έλœ ν•¨μˆ˜ λ©”μ„œλ“œλ§Œμ„ μ‚¬μš©ν•  수 μžˆμ—ˆμ–΄μš”.

코틀린은 λ©”μ„œλ“œκ°€ μ•„λ‹Œ ν•¨μˆ˜λ„ μ„ μ–Έν•΄μ„œ μ‚¬μš©ν•  수 μžˆμ–΄μš”.
즉, 클래슀λ₯Ό κΌ­ λ§Œλ“€μ–΄μ„œ κ·Έ μ•ˆμ— ν•¨μˆ˜λ₯Ό μ„ μ–Έν•  ν•„μš”κ°€ μ—†λ‹€λŠ” κ²ƒμ΄μ—μš”.

src/main/kotlin/Main.kt

728x90


μœ„μ™€ 같이 num μ΄λΌλŠ” μƒμˆ˜ν˜• λ³€μˆ˜λŠ” 메인 λ©”μ„œλ“œ 밖에 μ„ μ–Έν•œ κ±Έ μ•Œ 수 μžˆμ–΄μš”.
이λ₯Ό Top(탑) Level(레벨) Constent(μƒμˆ˜)라고 λΆˆλŸ¬μš”.
μžλ°”μ™€ λΉ„κ΅ν•˜μžλ©΄ Final μƒμˆ˜ λ³€μˆ˜μ™€ 같은 λŠλ‚Œμ΄μ—μš”.

src/main/kotlin/Main.kt


이 λ•Œ, const ν‚€μ›Œλ“œλ₯Ό λΆ™ν˜€ 컴파일 νƒ€μž„ μƒμˆ˜λ‘œ λ§Œλ“€μ–΄μ€„ 수 μžˆμ–΄μš”.
μ΄λ ‡κ²Œ 컴파일 νƒ€μž„ μƒμˆ˜λ‘œ μ„ μ–Έν•˜κ²Œ 되면 메인 λ©”μ„œλ“œλ³΄λ‹€ μš°μ„ μ μœΌλ‘œ 컴파일이 되게 되고,
이 값을 μ‚¬μš©ν•˜κ²Œ 되면 μ„±λŠ₯상 이점이 μžˆλŠ” μž₯점이 μžˆμ–΄μš”.

 

 

 

 

        πŸ“¦ Type conversion

μ΄λ²ˆμ—λŠ” Type conversion(ν˜• λ³€ν™˜)에 λŒ€ν•΄ 곡뢀해 λ³Όκ²Œμš”.

src/main/kotlin/Main.kt


μœ„μ™€ 같이 Integer(μ •μˆ˜) i와 Long x λ³€μˆ˜κ°€ μžˆμ„ λ•Œ, μžλ°”μ˜€λ‹€λ©΄ x λ³€μˆ˜μ— i λ³€μˆ˜κ°€ λŒ€μž…μ΄ 될 κ±°μ—μš”.

src/main/kotlin/Main.kt


ν•˜μ§€λ§Œ, μ½”ν‹€λ¦°μ˜ 경우 μš°μ™€ 같이 νƒ€μž… 뢈일치 μ—λŸ¬κ°€ λ‚˜λŠ” κ±Έ μ•Œ 수 μžˆμ–΄μš”.
νƒ€μž…μ΄ λ‹€λ₯΄λ©΄ λŒ€μž… ν•  수 μ—†μ–΄μš”.


src/main/kotlin/Main.kt


κ·Έλž˜μ„œ μœ„μ™€ 같이 toLong()을 μ„ μ–Έν•΄ Type Casting(μΊμŠ€νŒ…)을 λ°œμƒ μ‹œμΌœμ„œ ν˜• λ³€ν™˜μ„ ν•΄μ€˜μ•Ό ν•΄μš”.

kotlin/Primitives.kt


μœ„μ™€ 같이 toLong()은 Integer 값을 Long κ°’μœΌλ‘œ λ°”κΏ”μ£ΌλŠ” μΉœκ΅¬μ—μš”.

src/main/kotlin/Main.kt


참고둜 μžλ°”μ²˜λŸΌ μ΄λ ‡κ²Œ ν˜• λ³€ν™˜μ„ ν•  순 μ—†μ–΄μš”.


src/main/kotlin/Main.kt


λ°˜λŒ€λ‘œ i λ³€μˆ˜μ— xλ₯Ό λŒ€μž…ν•˜λ €κ³  해도 μœ„μ™€ 같이 ν˜• λ³€ν™˜μ„ ν•΄μ€˜μ•Ό ν•˜λŠ”κ±Έ μ•Œ 수 μžˆμ–΄μš”.

src/main/kotlin/Main.kt


λ°”λ‘œ μ΄λ ‡κ²Œ λ§μ΄μ—μš”.


src/main/kotlin/Main.kt


μœ„μ™€ 같이 λ¬Έμžμ—΄ λ³€μˆ˜ name에 μ •μˆ˜ν˜• λ³€μˆ˜ iλ₯Ό λŒ€μž…ν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒμš”?

src/main/kotlin/Main.kt


μ΄λ ‡κ²Œ toString()을 ν˜ΈμΆœν•˜λ©΄ ν˜• λ³€ν™˜ ν•  수 μžˆμ–΄μš”.

 

src/main/kotlin/Main.kt


λ°˜λŒ€λ‘œ λ¬Έμžμ—΄ 10을 μ •μˆ˜ 10으둜 λ°”κΏ€ λŒ€λŠ” μœ„μ™€ 같이 toInt()λ₯Ό μ΄μš©ν•˜λ©΄ λΌμš”.

 

 

 

 

        πŸ“¦ String

μ΄λ²ˆμ—” μ½”ν‹€λ¦°μ˜ String(λ¬Έμžμ—΄)에 λŒ€ν•΄ 곡뢀해 λ³Όκ²Œμš”.

src/main/kotlin/Main.kt


μ½”ν‹€λ¦°μ˜ toUpperCase()λŠ” deprecated λ˜μ—ˆμ–΄μš”.

src/main/kotlin/Main.kt

 

src/main/kotlin/Main.kt

 



κ·Έλž˜μ„œ μœ„μ™€ 같이 uppercase()λ₯Ό μ΄μš©ν•΄ μ£Όλ©΄ λΌμš”.


src/main/kotlin/Main.kt

 


μœ„μ™€ 같이 λ¬Έμžμ—΄μ˜ Index numberλ₯Ό μ΄μš©ν•΄μ„œ 문자λ₯Ό κ°€μ Έμ˜¬ μˆ˜λ„ μžˆμ–΄μš”.


src/main/kotlin/Main.kt

 


코틀린도 μžλ°”μ²˜λŸΌ μœ„μ™€ 같이 λ¬Έμžμ—΄μ„ κ²°ν•©ν•΄ μ€„μˆ˜ μžˆμ–΄μš”.

그런데 코틀린은 String Interpolation κΈ°λŠ₯을 μ œκ³΅ν•˜κ³  μžˆμ–΄μš”.


src/main/kotlin/Main.kt

 


μœ„μ™€ 같이 $ ν‘œμ‹œμ™€ ν•¨κ»˜ λ³€μˆ˜λͺ…을 λ„£μ–΄μ„œλ„ μ‚¬μš©ν•  수 μžˆμ–΄μš”.

μ΄λŠ” JavaScriptλ‚˜, TypeScriptμ—μ„œ μ œκ³΅ν•˜λŠ” 방법과 μœ μ‚¬ν•΄μš”.

let name = "μ£Όλ‹ˆ"
console.log(`μ €λŠ” ITλ₯Ό μ‚¬λž‘ν•˜λŠ” ${name} μž…λ‹ˆλ‹€.`)


μ΄λ ‡κ²Œ μ‚¬μš©ν•˜λŠ” 방법과 μœ μ‚¬ν•΄μš”.

λ§Œμ•½ name λ³€μˆ˜μ™€ μž…λ‹ˆλ‹€λ₯Ό 뢙이면 μ–΄λ–»κ²Œ λ κΉŒμš”?

src/main/kotlin/Main.kt


μœ„μ™€ 같이 μ–΄λ””κΉŒμ§€κ°€ λ³€μˆ˜λͺ…인지λ₯Ό μ•Œ 수 μ—†κΈ° λ•Œλ¬Έμ— λ¬Έμ œκ°€ λ°œμƒν•΄μš”.

src/main/kotlin/Main.kt

 


이럴 땐 μœ„μ™€ 같이 λ³€μˆ˜λͺ…은 μ—¬κΈ°κΉŒμ§€μ•Ό! 라고 μ•Œλ €μ£Όλ©΄ λΌμš”.



 

 

 

 

        πŸ“¦ Max, Min

μ΄λ²ˆμ—λŠ” μžλ°”μ—μ„œ 수λ₯Ό λ‹€λ£¨λŠ” κΈ°λŠ₯ 쀑에 Math Class λ“±μ—μ„œ μ œκ³΅ν–ˆλ˜ κΈ°λŠ₯듀에 λŒ€ν•΄ μ•Œμ•„λ³Όκ²Œμš”.

src/main/kotlin/Main.kt


μ΄λ ‡κ²Œ μžˆμ„ λ•Œ, i와 j 쀑에 큰 값을 μ–»κ³  μ‹ΆμœΌλ©΄ μ–΄λ–»κ²Œ ν•  수 μžˆμ„κΉŒμš”?

src/main/kotlin/Main.kt

 



kotlin/util/MathJVM.kt

 

java/lang/Math.java


μœ„μ™€ 같이 max()λ₯Ό μ‚¬μš©ν•΄μ„œ μ •μˆ˜ν˜• μΈμžκ°’ 두 개λ₯Ό λ„£μ–΄μ£Όλ©΄ Math.java의 max()κ°€ μ‚Όν•­μ—°μ‚°μžλ₯Ό μ΄μš©ν•΄ 맀개 λ³€μˆ˜κ°’μ„ λΉ„κ΅ν•˜κ³ , 큰 것을 λ°˜ν™˜ν•΄ μ£ΌλŠ”κ±Έ μ•Œ 수 μžˆμ–΄μš”.

 

 

 

 

 

        πŸ“¦ Random

μ΄λ²ˆμ—λŠ” Random에 λŒ€ν•΄ μ•Œμ•„λ³Όκ²Œμš”.

src/main/kotlin/Main.kt

 

kotlin/random/Random.kt

 

kotlin/random/Random.kt

 

kotlin/random/Random.kt

 

kotlin/random/Random.kt


μœ„μ™€ 같이 μ½”ν‹€λ¦°μ˜ Random을 μ΄μš©ν•΄μ„œ μ •μˆ˜λ‘œ 된 random 값을 얻을 수 μžˆμ–΄μš”.


src/main/kotlin/Main.kt


μœ„μ™€ 같이 0 ~ 100κΉŒμ§€λΌκ³  λ²”μœ„λ₯Ό 지정해 μ£Όλ©΄ ν•΄λ‹Ή λ²”μœ„ λ‚΄μ—μ„œ random 값을 얻을 수 μžˆμ–΄μš”.

참고둜 from μΈμžλŠ” inclusive λ°˜λ“œμ‹œ ν¬ν•¨ν•˜λŠ” 값이 되고, until μΈμžλŠ” exclusive ν¬ν•¨λ˜μ§€ μ•ŠλŠ” κ°’μ΄μ—μš”.
즉, 0 ~ 100이라고 μΈμžκ°’μ„ λ„£μ–΄μ£Όκ²Œ 되면 0 ~ 99 μ•ˆμ—μ„œμ˜ random 값이 λ§Œλ“€μ–΄μ Έ λ‚˜μ˜€κ²Œ λœλ‹΅λ‹ˆλ‹€.

 

 

 

 

src/main/kotlin/Main.kt


Duble을 μ΄μš©ν•΄μ„œλ„ random 값을 λ§Œλ“€ 수 μžˆμ–΄μš”.

μœ„μ™€ 같이 μΈμžκ°’μ„ λ„£μ–΄ μ€¬μœΌλ‹ˆ 0.0 ~ 0.09κΉŒμ§€ λ§Œλ“€μ–΄μ§€κ² λ„€μš”.

 

 

 

 

 

 

        πŸ“¦ Input Keyboard

μ΄λ²ˆμ—” Keyboard(ν‚€λ³΄λ“œ) 값을 λ°›μ•„μ˜€λŠ” 방법에 λŒ€ν•΄ μ•Œμ•„λ³Όκ²Œμš”.
코틀린은 μžλ°”μ™€ ν˜Έν™˜μ΄ κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— μžλ°”μ—μ„œ μ‚¬μš©ν•˜λŠ” Scannerλ₯Ό μ‚¬μš©ν•  μˆ˜λ„ μžˆμ–΄μš”.

src/main/kotlin/Main.kt


Java(μžλ°”)의 Scannerλ₯Ό μ‚¬μš©ν•  경우 μœ„μ™€ 같이 μ„ μ–Έν•  수 μžˆλŠ”λ°, νŠΉμ΄ν•œ 점이 in을 `(grave accent - μ–΅μŒ λΆ€ν˜Έ)둜 감싼 κ±Έ λ³Ό 수 μžˆμ–΄μš”.

μ½”ν‹€λ¦°μ—μ„œλŠ” in ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•  수 μ—†κΈ° λ•Œλ¬ΈμΈλ°μš”. μ΄λ ‡κ²Œ μ‚¬μš©ν•  수 μ—†λŠ” ν‚€μ›Œλ“œλŠ” μ–΅μŒ λΆ€ν˜Έλ‘œ 감싸 μ‚¬μš©ν•΄μ£Όμ–΄μ•Ό ν•΄μš”.

 

src/main/kotlin/Main.kt


그리고, μœ„μ™€ 같이 숫자 ν˜Ήμ€ λ¬Έμžμ—΄ 등을 μž…λ ₯ 받을 수 μžˆμ–΄μš”.

 

 

 

 

        πŸ“¦ 쑰건문

μ΄λ²ˆμ—λŠ” μ½”ν‹€λ¦°μ˜ 쑰건문에 λŒ€ν•΄ μ•Œμ•„λ³Όκ²Œμš”.
졜초 ifλ¬Έ λΆ€ν„° μ•Œμ•„λ³Όκ²Œμš”.

src/main/kotlin/Main.kt


μžλ°”μ™€ λ™μΌν•˜κ²Œ if, else if, elseλ₯Ό μ‚¬μš©ν•  수 μžˆμ–΄μš”.

근데 μ½”ν‹€λ¦°μ—μ„œλŠ” when λ¬Έμ΄λΌλŠ”κ²Œ μžˆμ–΄μš”.

src/main/kotlin/Main.kt


λ°”λ‘œ μ΄λ ‡κ²Œ μ‚¬μš©ν•  수 μžˆμ–΄μš”.

when은 μžλ°”μ˜ switch λ¬Έκ³Ό λΉ„μŠ·ν•˜μ§€λ§Œ, 훨씬 κ°•λ ₯ν•œ 쑰건듀을 지정할 수 μžˆμ–΄μš”.
즉, μ½”ν‹€λ¦°μ—μ„œλŠ” switch λ¬Έ λŒ€μ‹  when 문을 μ‚¬μš©ν•΄μš”.
when을 μ‚΄νŽ΄λ³΄λ©΄ 5, 7, 9번째 쀄에 쑰건듀을 ν•˜λ‚˜μ”© 넣어쀄 수 μžˆλŠ” κ±Έ λ³Ό 수 μžˆμ–΄μš”.

λ˜ν•˜λ‚˜ νŠΉμ§•μ€ μ € λΆ„κΈ°λ¬Έμ˜ κ²°κ³Όλ₯Ό λ³€μˆ˜μ— λ‹΄μ„μˆ˜λ„ μžˆλ‹€λŠ” κ±°μ—μš”.

src/main/kotlin/Main.kt

 

src/main/kotlin/Main.kt

 


μœ„μ™€ 같이 μ½”ν‹€λ¦°μ—μ„œ 뢄기문은 ν•˜λ‚˜μ˜ 식이라고 λ³Ό 수 μžˆμ–΄μš”.
μžλ°”λŠ” λΆ„κΈ°λ¬Έ κ²°κ³Όλ₯Ό λ³€μˆ˜μ— 담을 수 μ—†μ§€λ§Œ, 코틀린은 μ‹μœΌλ‘œ 취급이 되기 λ•Œλ¬Έμ— λ³€μˆ˜μ— 값을 받을 수 μžˆμ–΄μš”.

μ΄λ²ˆμ—λŠ” μ‚Όν•­μ—°μ‚°μžμ— λŒ€ν•΄ μ•Œμ•„λ³Όκ²Œμš”.

src/main/kotlin/Main.kt


λ­”κ°€ μžλ°”μ˜ μ‚Όν•­μ—°μ‚°μžλ³΄λ‹€ 훨씬 μ§κ΄€μ μœΌλ‘œ μ•Œμ•„λ³Ό 수 μžˆλŠ”κ±Έ μ•Œ 수 μžˆμ–΄μš”.

 

 

 

 

 

        πŸ“¦ Array

μ΄λ²ˆμ—λŠ” Array(λ°°μ—΄)에 λŒ€ν•΄μ„œ μ•Œμ•„λ³Όκ²Œμš”.

src/main/kotlin/Main.kt


배열은 arrayOf()λ₯Ό μ΄μš©ν•΄μ„œ λ§Œλ“€ 수 있고, μš”μ†Œλ₯Ό 직접 넣어쀄 수 μžˆμ–΄μš”.
μžλ°”μ—μ„œλŠ” length둜 λ°°μ—΄μ˜ 크기λ₯Ό μ•Œ 수 μžˆμ—ˆμ§€λ§Œ, 코틀린은 size둜 μ•Œ 수 있고, setμ΄λ‚˜, 5번째 쀄과 같이 νŠΉμ • Indexλ²ˆμ§Έμ— μš”μ†Œλ₯Ό 넣어쀄 수 μžˆμ–΄μš”.

 

 

 

 

 

        πŸ“¦ try - catch

Exception μ²˜λ¦¬λŠ” μžλ°”μ™€ λ™μΌν•΄μš”.

src/main/kotlin/Main.kt


μ΄λŸ°μ‹μœΌλ‘œ Index numberκ°€ 2κΉŒμ§€ μžˆλŠ” λ°°μ—΄μ—μ„œ 4번째 λ°°μ—΄μ˜ 값을 κ°€μ Έμ˜€λΌκ³  ν•˜λ©΄ Out of Bounds Exception이 ν„°μ§ˆκ±°μ—μš”.

 

 

 

 

 

 

 

        πŸ“¦ List

μ΄λ²ˆμ—λŠ” List(리슀트)에 λŒ€ν•΄ 곡뢀해 λ³Όκ²Œμš”.

src/main/kotlin/Main.kt


μœ„μ™€ 같이 listOf()λ₯Ό μ΄μš©ν•΄μ„œ Listλ₯Ό λ§Œλ“€κ²Œ 되면 add()λ₯Ό μ‚¬μš©ν•  수 μ—†μ–΄μš”.
μƒμˆ˜ν˜• 리슀트 λ³€μˆ˜λ‘œ λ§Œλ“€μ–΄μ§€κΈ° λ•Œλ¬Έμ΄μ—μš”.

 

src/main/kotlin/Main.kt


μœ„μ™€ 같이 μƒˆλ‘œμš΄ 값을 λ„£κ³  μ‹Άλ‹€λ©΄ mutableListOf()λ₯Ό μ‚¬μš©ν•΄μ£Όμ–΄μ•Ό ν•΄μš”.

 

src/main/kotlin/Main.kt


μ΄λ ‡κ²Œ 리슀트 μš”μ†Œλ₯Ό μ‚­μ œν•  μˆ˜λ„ μžˆμ–΄μš”.
즉, μžλ°”μ˜ Array List와 λ™μΌν•˜λ‹€κ³  μƒκ°ν•˜λ©΄ λΌμš”.

참고둜 mutableListOfλŠ” μ œλ„€λ¦­ νƒ€μž…μ΄μ—μš”.

kotlin/collections/Collections.kt


ν•˜μ§€λ§Œ μƒλž΅μ΄ κ°€λŠ₯ν•œλ°, μ΄λŠ” νƒ€μž… 좔둠을 ν•˜κΈ° λ•Œλ¬Έμ΄μ—μš”.


kotlin/collections/Collections.kt


μ›λž˜λŠ” μœ„μ™€ 같이 μ¨μ€˜μ•Ό ν•˜μ§€λ§Œ, λ‹€ μƒλž΅ν–ˆλ‹€κ³  보면 λΌμš”.

 

 

 

 

 

        πŸ“¦ 반볡문

src/main/kotlin/Main.kt


μœ„μ˜ μ½”λ“œλŠ” itemListλΌλŠ” List λ³€μˆ˜μ— 값을 μžλ°”μ˜ ν–₯μƒλœ for(for-each)λ¬Έκ³Ό λ™μΌν•œ λ°©μ‹μœΌλ‘œ λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•  수 μžˆμ–΄μš”.

src/main/kotlin/Main.kt


μ΄λ ‡κ²Œ for-each 문으둜 λ°”κΏ”μ„œ μ‚¬μš©ν•  μˆ˜λ„ μžˆμ–΄μš”.


src/main/kotlin/Main.kt


Index numberλ₯Ό μ΄μš©ν•œ λ°˜λ³΅λ¬Έμ€ μœ„μ™€ 같이 μ‚¬μš©ν•  수 μžˆμ–΄μš”.
참고둜 μœ„μ™€ 같이 ν•˜λ©΄ 0 ~ itemList ν¬κΈ°μ—μ„œ ν•˜λ‚˜λ₯Ό λΊ€ κ°’κΉŒμ§€λ₯Ό ν¬ν•¨ν•œ μˆ˜κΉŒμ§€ λ°˜λ³΅μ„ ν•΄μš”.

 

 

src/main/kotlin/Main.kt

 


그런데, μ΄λ ‡κ²Œ ν•˜κ²Œ 되면 λ­”κ°€ 적응이 μ•ˆλ˜μ„œ κ·ΈλŸ°μ§€ λ³΅μž‘ν•΄μš”.

while 문은 μžλ°”μ™€ μ™„μ „νžˆ λ˜‘κ°™μ•„μš”.
참고둜 μžλ°”μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ break와 continue도 λ™μΌν•˜κ²Œ μ§€μ›ν•˜κ³  μžˆμ–΄μš”.

 

 

 

 

 

        πŸ“¦ Null safety

코틀린을 μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” μ—¬λŸ¬κ°€μ§€κ°€ μžˆκ² μ§€λ§Œ, λŒ€ν‘œμ μœΌλ‘œ Null safetyν•œ νŠΉμ§•μ΄ 있기 λ•Œλ¬Έμ΄μ—μš”.
λ„λŒ€μ²΄ μ–΄λ–»κ²Œ 코틀린은 Null safety ν•˜λ‹€λŠ” κ±ΈκΉŒμš”?

src/main/kotlin/Main.kt


μœ„μ™€ 같이 name λ³€μˆ˜μ— Null을 λ„£κ² λ‹€κ³  ν•΄μ£Όλ©΄ μ–΄λ–€ μžλ£Œν˜• νƒ€μž…μ˜ Null인지 μ•Œ 수 μ—†μ–΄μš”.


src/main/kotlin/Main.kt


κ·Έλž˜μ„œ μœ„μ™€ 같이 μžλ£Œν˜• νƒ€μž…μ„ λ¬Έμžμ—΄λ‘œ μ§€μ •ν•œ λ’€ Null을 λŒ€μž…ν•˜λ €κ³  ν•˜λ©΄ κ°’μœΌλ‘œ
λ¬Έμžμ—΄ νƒ€μž…μ— Null을 넣을 수 μ—†λ‹€κ³  λ‚˜μ˜€λŠ” κ±Έ μ•Œ 수 μžˆμ–΄μš”.

μ™œλƒν•˜λ©΄ μ½”ν‹€λ¦°μ—μ„œλŠ” Null을 넣을 수 μžˆλŠ” νƒ€μž…μ€ νƒ€μž… 뒀에 ?(λ¬ΌμŒν‘œ) 기호λ₯Ό λ„£μ–΄μ€˜μ•Όλ§Œ
Null을 λŒ€μž…ν•  수 있기 λ•Œλ¬Έμ΄μ—μš”.

이건 TypeScript도 λ˜‘κ°™μ΄ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯μ΄μ—μš”.

src/main/kotlin/Main.kt


이제 값도 λŒ€μž…ν•  수 있고, Null도 λ‹€μ‹œ λŒ€μž…ν•  수 있게 λ˜μ—ˆμ–΄μš”.


src/main/kotlin/Main.kt


μœ„μ™€ 같이 name2λΌλŠ” λ¬Έμžμ—΄ λ³€μˆ˜μ— λ¬ΌμŒν‘œλ₯Ό 넣지 μ•Šκ³ , 곡백값을 λ„£μ–΄ μ΄ˆκΈ°ν™” ν•œ λ’€
name2에 name 값을 λ„£μœΌλ €κ³  ν•˜λ©΄ νƒ€μž…μ΄ μΌμΉ˜ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” λ¬Έμ œκ°€ λ°œμƒν•˜λŠ” κ±Έ μ•Œ 수 μžˆμ–΄μš”.

μ΄λŠ” λ¬ΌμŒν‘œκ°€ 뢙은 μžλ£Œν˜•κ³Ό 뢙지 μ•Šμ€ μžλ£Œν˜•μ€ λ³„κ°œλ‘œ μ·¨κΈ‰ν•˜κΈ° λ•Œλ¬Έμ΄μ—μš”.

κ·Έλž˜μ„œ μœ„μ™€ 같이 ν•˜κ³  싢을 땐 name λ³€μˆ˜μ— λŒ€ν•œ Null Checkκ°€ μ„ ν–‰λ˜μ–΄μ•Ό ν•΄μš”.

src/main/kotlin/Main.kt


λ°”λ‘œ μ΄λŸ°μ‹μœΌλ‘œ Null Checkλ₯Ό κΌ­ ν•΄μ€˜μ•Ό ν•΄μš”.
μ΄λ ‡κ²Œ Null Checkλ₯Ό ν•˜κ³  λ‚œ λ’€ Null이 μ•„λ‹ˆλΌλ©΄ name λ³€μˆ˜μ˜ μžλ£Œν˜•μ΄ String Type으둜 λ³€ν™˜ν•˜κ²Œ λΌμš”.

κ·Έλž˜μ„œ name2 λ³€μˆ˜μ™€ 같은 μžλ£Œν˜• νƒ€μž…μ΄ λ˜μ—ˆκΈ° λ•Œλ¬Έμ— λŒ€μž…ν•  수 있게 λœλ‹΅λ‹ˆλ‹€.


src/main/kotlin/Main.kt


λ˜λŠ” μœ„μ™€ 같이 !(λŠλ‚Œν‘œ)λ₯Ό 두 개 λΆ™ν˜€μ£Όλ©΄ λ¬ΌμŒν‘œλ₯Ό κ°•μ œλ‘œ 떼어쀄 수 μžˆμ–΄μš”.
ν•˜μ§€λ§Œ, μœ„μ™€ 같이 ν•˜λ©΄ κ°œλ°œμžκ°€ μž„μ˜λ‘œ Null 이 μ•„λ‹ˆλΌκ³  μ„ μ–Έν–ˆκΈ° λ•Œλ¬Έμ— κ°œλ°œμžκ°€ μ±…μž„μ„ μ§€λŠ” ν˜•μ‹μ΄ λ˜μ–΄ λ²„λ €μš”.
κ·Έλž˜μ„œ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” κ±Έ μΆ”μ²œν•΄μš”.

 

또 λ‹€λ₯Έ λ°©λ²•μœΌλ‘œ if문으둜 Null Check ν•˜λŠ” 방법도 μžˆμ§€λ§Œ, 

 

src/main/kotlin/Main.kt


이런 ν˜•μ‹μœΌλ‘œλ„ μ‚¬μš©ν•  수 μžˆλŠ”λ°, 이 μ˜λ―ΈλŠ” name λ³€μˆ˜κ°€ Null이 μ•„λ‹ˆλΌλ©΄ {} μ•ˆμ˜ λ‚΄μš©μ„ 싀행해라 λΌλŠ” λͺ…λ Ήμ΄μ—μš”.

κ·Έ μ•ˆμ—μ„œλŠ” itμ΄λΌλŠ” 걸둜 μ ‘κ·Όν•  수 있게 λΌμš”.

μ΄λ ‡κ²Œ ν•˜λ©΄ if문을 톡해 Null Checkν•œ 것과 λ™μΌν•œ 효과λ₯Ό 갖을 수 μžˆμ–΄μš”.


src/main/kotlin/Main.kt

 


μœ„μ™€ 같이 name λ³€μˆ˜κ°€ Null이기 λ•Œλ¬Έμ— 9번째 쀄을 듀어가지 λͺ»ν•˜κ³ ,
name2 λ³€μˆ˜μ— μ΄ˆκΈ°ν™” 값이 κ·ΈλŒ€λ‘œ 좜λ ₯된 κ±Έ λ³Ό 수 μžˆμ–΄μš”.

 

 

 

 

 

        πŸ“¦ Function & Mathod

μ΄λ²ˆμ—” Function(ν•¨μˆ˜) ν˜Ήμ€ Method(λ©”μ„œλ“œ)에 λŒ€ν•΄ μ•Œμ•„λ³Όκ²Œμš”.
참고둜 이 λ‘˜μ˜ 차이점은 Class μ•ˆμ— μžˆλƒ? 밖에 μžˆλƒ μ°¨μ΄μ—μš”. Class μ•ˆμ— 있으면 λ©”μ„œλ“œλΌκ³  λΆ€λ₯΄κ³ , 밖에 있으면 ν•¨μˆ˜λΌκ³  λΆ€λ₯Έλ‹΅λ‹ˆλ‹€.


src/main/kotlin/Main.kt


μœ„μ™€ 같이 sumμ΄λΌλŠ” ν•¨μˆ˜λ₯Ό μ •μ˜ν•΄ μ£Όμ—ˆλŠ”λ°, μ •μˆ˜ν˜• a와 μ •μˆ˜ν˜• bλ₯Ό 맀개 λ³€μˆ˜λ‘œ λ°›λŠ” ν•¨μˆ˜μ΄κ³ ,
λ°˜ν™˜ νƒ€μž…μ€ μ •μˆ˜ νƒ€μž…μ„ λ°˜ν™˜ν•˜λŠ” κ±Έ μ•Œ 수 μžˆμ–΄μš”.

μžλ°”λž‘μ€ μƒκΈ΄κ²Œ 틀린데 이 λͺ¨μŠ΅μ€ TypeScript와 μœ μ‚¬ν•΄μš”.


참고둜 Class 밖에 μ„ μ–Έν•œ ν•¨μˆ˜λ“€μ„ Top Level Function(탑 레벨 ν•¨μˆ˜)라고 λΆ€λ₯΄λŠ”데,
이것은 μ–΄λŠ Classμ—μ„œλ‚˜ ν˜ΈμΆœν•  수 μžˆλŠ” ν•¨μˆ˜κ°€ λ˜μ–΄λ²„λ €μš”.

그리고 코틀린은 Body 연산이 ν•œ 쀄일 경우 맀우 κ°„λ‹¨ν•˜κ²Œ 쀄여 버릴 수 μžˆμ–΄μš”.

src/main/kotlin/Main.kt


μ΄λ ‡κ²Œ κ°„λ‹¨ν•˜κ²Œ ν•œ μ€„λ‘œ μž‘μ„±ν•΄ 쀄 수 μžˆμ–΄μš”.
그리고, λ°˜ν™˜ νƒ€μž…λ„ μƒλž΅ν•΄ 쀄 수 μžˆμ–΄μš”.

μ™œλƒν•˜λ©΄ a 와 bλ₯Ό λ”ν•œ 값은 μ–΄μ°¨ν”Ό μ •μˆ˜ν˜•μ΄ 될 것이기 λ•Œλ¬Έμ— (맀개 λ³€μˆ˜ νƒ€μž…μ΄ λ‘˜ λ‹€ μ •μˆ˜ν˜•)
νƒ€μž… 좔둠이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ΄μ—μš”.

src/main/kotlin/Main.kt


λ‹€λ§Œ 맀개 λ³€μˆ˜μ— μžλ£Œν˜• νƒ€μž…μ€ λ°˜λ“œμ‹œ μ„ μ–Έν•΄ μ£Όμ–΄μ•Ό ν•΄μš”.
μ•ˆ 그러면 λ°˜ν™˜ νƒ€μž…μ— λŒ€ν•œ νƒ€μž… 좔둠이 λΆˆκ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ΄μ—μš”.

λ§Œμ•½ sum()에 μΈμžκ°’μ„ ν•˜λ‚˜ 더 늘렀주고 μ‹Άλ‹€λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒμš”?
μžλ°”μ—μ„œλŠ” Overloadλ₯Ό 톡해 μΈμžκ°’μ„ ν•˜λ‚˜ 더 λ°›κ² λ‹€κ³  ν•΄μ€¬μœΌλ©΄ λ κ±°μ—μš”.

src/main/kotlin/Main.kt


ν•˜μ§€λ§Œ μ½”ν‹€λ¦°μ—μ„œλŠ” μœ„μ™€ 같이 맀개 λ³€μˆ˜μ˜ Default Value(κΈ°λ³Έ κ°’)을 μ„ μ–Έν•΄ μ£Όλ©΄
ꡳ이 μΈμžκ°’μœΌλ‘œ ν•˜λ‚˜ 더 넣지 μ•Šμ•„λ„ μ‚¬μš©ν•  수 μžˆμ–΄μš”.


μΈμžκ°’μ„ μ„Έ 개λ₯Ό λ‹€ λ„£λŠ”λ‹€λ©΄ 맀개 λ³€μˆ˜ κΈ°λ³Έ 값은 λ¬΄μ‹œκ°€ λ κ±°μ—μš”.

src/main/kotlin/Main.kt




μ΄λ ‡κ²Œ μ½”ν‹€λ¦°μ˜ Overload κΈ°λŠ₯은 ν•¨μˆ˜λ‚˜,
λ©”μ„œλ“œλ₯Ό μ—¬λŸ¬ 개 λ§Œλ“œλŠ” 것이 μ•„λ‹ˆλΌ 맀개 λ³€μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ μ²˜λ¦¬ν•΄ 쀄 수 μžˆλŠ” κ±°μ—μš”.


src/main/kotlin/Main.kt


그리고, μΈμžκ°’μœΌλ‘œ λ“€μ–΄κ°€λŠ” 값이 μ–΄λŠ 맀개 λ³€μˆ˜μ™€ Mapping 되게 ν•  것인지λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έν•΄ 쀄 μˆ˜λ„ μžˆμ–΄μš”.

 

 

src/main/kotlin/Main.kt


μžλ°”μ—μ„œλŠ” 인자 κ°’μ˜ μˆœμ„œλ₯Ό 틀리면 λ¬Έμ œκ°€ λ°œμƒν•˜λŠ”λ°, 코틀린은 μœ„μ™€ 같이 λͺ…μ‹œμ μœΌλ‘œ μΈμžκ°’μ„ 지정할 수 있기 λ•Œλ¬Έμ—
λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έν–ˆμ„ λ•ŒλŠ” μˆœμ„œλ₯Ό 맞좜 ν•„μš”λŠ” μ—†μ–΄μš”.

 

 

 

 

 

 

        πŸ“¦ Class

μ΄λ²ˆμ—λŠ” μ½”ν‹€λ¦°μ˜ Class(클래슀) κ°œλ…μ— λŒ€ν•΄ μ•Œμ•„λ³Όκ²Œμš”.

src/main/kotlin/Main.kt


μœ„μ™€ 같이 Person μ΄λΌλŠ” 클래슀λ₯Ό λ§Œλ“€κ³ , Member Variable(멀버 λ³€μˆ˜)λ₯Ό μ„ μ–Έν•΄ μ£Όμ—ˆλŠ”λ°, μ΄λŠ” μžλ°”μŠ€λŸ¬μš΄ 방식인 것을 μ•Œ 수 μžˆμ–΄μš”.

코틀린은 μœ„μ™€ 같이 Property(ν”„λ‘œνΌν‹°)λ₯Ό λ‹€ μ„ μ–Έν•˜λŠ” 것이 μ•„λ‹ˆλΌ κΈ°λ³Έ μƒμ„±μžλ₯Ό μ΄μš©ν•˜μ—¬ μ²˜λ¦¬ν•  수 μžˆλŠ”λ°,

src/main/kotlin/Main.kt


μœ„μ™€ 같이 마치 ν•¨μˆ˜μ—μ„œ 맀개 λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ“― κΈ°λ³Έ μƒμ„±μžμ— λ°”λ‘œ 멀버 λ³€μˆ˜λ₯Ό μ„ μ–Έν•΄μ„œ μ‚¬μš©ν•  수 μžˆμ–΄μš”.
이 방식은 TypeScript도 μœ μ‚¬ν•˜κ²Œ μ‚¬μš©ν•˜λŠ” 방법인데, Nest.ts둜 DIν•  λ•Œ μ΄λŸ°μ‹μœΌλ‘œ μƒμ„±μžμ— 멀버 λ³€μˆ˜λ₯Ό λ°”λ‘œ μ„ μ–Έν•΄ λ²„λ¦°λ‹΅λ‹ˆλ‹€.


src/main/kotlin/Main.kt

 



μ΄λ ‡κ²Œ μ‚¬μš©ν•  수 μžˆλŠ”λ°, μ—¬κΈ°μ„œ μ£Όλͺ©ν•΄μ•Ό ν•˜λŠ” 건 8λ²ˆμ§Έμ™€ 9번째 쀄에 λ³€μˆ˜ ν‚€μ›Œλ“œκ°€ 각각 λ‹€λ₯΄λ‹€λŠ” μ μ΄μ—μš”.
name λ³€μˆ˜λŠ” val (μˆ˜μ • λΆˆκ°€)이고, age λ³€μˆ˜λŠ” var(μˆ˜μ • κ°€λŠ₯)으둜 μ„ μ–Έλœ κ±Έ λ³Ό 수 μžˆμ–΄μš”.

src/main/kotlin/Main.kt


λ”°λΌμ„œ μœ„μ™€ 같이 μˆ˜μ •ν•  수 μ—†λ‹€λŠ” κ±Έ μ•Œ 수 μžˆμ–΄μš”.

 

src/main/kotlin/Main.kt


ν•˜μ§€λ§Œ, age λ³€μˆ˜λŠ” μˆ˜μ •μ΄ κ°€λŠ₯ν•œκ±Έ μ•Œ 수 μžˆμ–΄μš”.

또 ν•˜λ‚˜ νŠΉμ§•μ μΈ 것은 2번째 μ€„μ—μ„œ Person 객체λ₯Ό μƒμ„±ν•˜λŠ”λ° new μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•˜λ‹€λŠ” λΆ€λΆ„μ΄μ—μš”.

그리고 또 ν•˜λ‚˜ νŠΉμ§•μ€ μžλ°”μ™€ 같이 getter, setterλ₯Ό λ³„λ„λ‘œ λ§Œλ“€ ν•„μš” ν•„μš” 없이
val, var ν‚€μ›Œλ“œλ₯Ό μ μ ˆν•˜κ²Œ μ‚¬μš©ν•΄μ„œ getter, setter 효과λ₯Ό 얻을 수 μžˆμ–΄μš”.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 코프링(μ½”ν‹€λ¦° + μŠ€ν”„λ§ λΆ€νŠΈ)μ—μ„œλŠ” Lombok(둬볡)을 μ‚¬μš©ν•˜μ§€ μ•Šμ•„μš”.

 

 

 

 

 

 

        πŸ“¦ Data Class

μ΄λ²ˆμ—λŠ” μ½”ν‹€λ¦°μ˜ Data Class(데이터 클래슀) κ°œλ…μ— λŒ€ν•΄ μ•Œμ•„λ³Όκ²Œμš”.

데이터 클래슀λ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°λŠ” 이런 κ²½μš°μ— μ‚¬μš©ν•  수 μžˆμ–΄μš”. λ§Œμ•½ μƒμ„±μžλ₯Ό 톡해 μ–΄λ–€ 값을 μ „λ‹¬ν•˜λ˜, μ™ΈλΆ€μ—λŠ” ν•΄λ‹Ή 값을 λ…ΈμΆœ μ‹œν‚€κ³  싢지 μ•Šμ„ λ•Œμ΄λ©°, getter κΈ°λŠ₯ λ˜ν•œ μ œκ³΅ν•˜κ³  싢지 μ•Šμ„ λ•Œμ—μš”.

이럴 λ•Œ λ³€μˆ˜ μ•žμ— μžλ°”μ™€ 같이 μ ‘κ·Ό μ œμ–΄μž ν‚€μ›Œλ“œμΈ private μ΄λΌλŠ” ν‚€μ›Œλ“œλ₯Ό λΆ™ν˜€μ£Όλ©΄ λΌμš”.

πŸ’‘ μ ‘κ·Ό μ œμ–΄μžλž€?

"μ ‘κ·Ό μ œμ–΄μž"λŠ” ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ λ³€μˆ˜, λ©”μ†Œλ“œ, 클래슀 λ“±μ˜ μ ‘κ·Ό κΆŒν•œμ„ μ œμ–΄ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” μš©μ–΄μž…λ‹ˆλ‹€.
μžλ°”(Java), C++ λ“±μ˜ μ–Έμ–΄μ—μ„œ 많이 μ‚¬μš©λ©λ‹ˆλ‹€.
이 μš©μ–΄λŠ” 각 μ–Έμ–΄μ—μ„œ μ‘°κΈˆμ”© λ‹€λ₯΄κ²Œ 해석될 수 μžˆμ§€λ§Œ, μΌλ°˜μ μœΌλ‘œλŠ” λ‹€μŒκ³Ό 같은 κ°œλ…μ„ ν¬ν•¨ν•©λ‹ˆλ‹€.

  1. public (곡개): μ–΄λ–€ ν΄λž˜μŠ€λ“  μ ‘κ·Όν•  수 μžˆλŠ” κ°€μž₯ 넓은 λ²”μœ„μ˜ μ œμ–΄μžμž…λ‹ˆλ‹€.
  2. protected (보호): κ°™μ€ νŒ¨ν‚€μ§€μ— μ†ν•œ ν΄λž˜μŠ€μ™€ ν•΄λ‹Ή 클래슀λ₯Ό 상속받은 ν΄λž˜μŠ€μ—μ„œλ§Œ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  3. default (아무 μ œμ–΄μž μ—†μŒ λ˜λŠ” νŒ¨ν‚€μ§€ μ œμ–΄μž): κ°™μ€ νŒ¨ν‚€μ§€ λ‚΄μ—μ„œλ§Œ 접근이 κ°€λŠ₯ν•©λ‹ˆλ‹€.
  4. private (λΉ„κ³΅κ°œ): κ°™μ€ 클래슀 λ‚΄μ—μ„œλ§Œ 접근이 κ°€λŠ₯ν•˜λ©°, μ™ΈλΆ€ ν΄λž˜μŠ€λ‚˜ κ°μ²΄μ—μ„œλŠ” μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ μ ‘κ·Ό μ œμ–΄μžλ₯Ό μ‚¬μš©ν•˜μ—¬ 객체 지ν–₯ ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 정보 은닉 및 μΊ‘μŠν™”λ₯Ό κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

src/main/kotlin/Main.kt


μ΄λ ‡κ²Œ private ν‚€μ›Œλ“œλ₯Ό λΆ™μ΄κ²Œ 되면 μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•˜μ§€ λͺ»ν•˜λŠ” κ±Έ μ•Œ 수 있고,
이λ₯Ό 톡해 κΈ°λ³Έ μ ‘κ·Ό μ œμ–΄μžκ°€ public μ΄λΌλŠ” 것도 μ•Œ 수 μžˆμ–΄μš”.

 

 

 

 

        πŸ“¦ Getter, Setter

μ½”ν‹€λ¦°μ—μ„œ getter(κ²Œν„°)와 setter(μ„Έν„°)λŠ” μ–΄λ–»κ²Œ μ‚¬μš©ν•  수 μžˆμ„κΉŒμš”?

src/main/kotlin/Main.kt


예제λ₯Ό μœ„ν•΄ λ˜λ‹€λ₯Έ Johnμ΄λΌλŠ” 객체λ₯Ό λ§Œλ“€κ±°μ—μš”.
두 κ°μ²΄λŠ” 이름도 λ‚˜μ΄λ„ λ˜‘κ°™μ€ μƒνƒœμ΄μ§€λ§Œ, λ‹€λ₯Έ κ°μ²΄μ—μš”.

src/main/kotlin/Main.kt


두 객체λ₯Ό λ™μΌμ„±μœΌλ‘œ 비ꡐ해 보고 κ²°κ³Όλ₯Ό 좜λ ₯ν•΄ λ³΄μ•˜μ–΄μš”.


κ²°κ³ΌλŠ” λ‹€λ₯Έ 것을 μ•Œ 수 μžˆμ–΄μš”.

즉, λ‹€λ₯Έ Memory μ£Όμ†Œμ— λ™μΌν•œ 값이 μ €μž₯λ˜μ–΄ μžˆλ‹€λŠ” κ±Έ μ•Œ 수 μžˆμ–΄μš”.



πŸ’‘ 동등성 비ꡐ와 동일성 비ꡐ
객체 지ν–₯ μ–Έμ–΄μ—μ„œλŠ” 동등성(Identity)κ³Ό 동일성(Equality) λΉ„κ΅λΌλŠ” κ°œλ…μ΄ λ‚˜μ˜΅λ‹ˆλ‹€.

λ¨Όμ € 동일성 λΉ„κ΅λž€? 두 객체가 μ™„μ „νžˆ 같은 경우λ₯Ό 이야기 ν•˜λŠ”λ°, μ‰½κ²Œ μ΄μ•ΌκΈ°ν•˜λ©΄ Memory에 μ €μž₯된 객체 두 객체가 λͺ¨λ‘ λ™μΌν•œ Memory μ£Όμ†Œμ— μ €μž₯λ˜μ–΄ μžˆλŠ”μ§€λ₯Ό λΉ„κ΅ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

이 λ•Œ, μ‘°κ±΄μ ˆμ—μ„œ == μ—°μ‚°μžλ₯Ό 톡해 비ꡐ ν•  수 있고, int, doubleκ³Ό 같은 primitive(μ›μ‹œν˜•) νƒ€μž…μ€ 객체λ₯Ό 갖지 μ•ŠκΈ° λ•Œλ¬Έμ— 동등성 비ꡐλ₯Ό ν–ˆμ„ λ•Œ, 값이 같을 경우 trueκ°€ λ°˜ν™˜λ©λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ 동등성 λΉ„κ΅λŠ” λ¬΄μ—‡μΌκΉŒμš”? 동등성은 두 객체에 μ €μž₯된 값이 같은 경우λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.
즉, λ³€μˆ˜κ°€ μ°Έμ‘°ν•˜κ³  μžˆλŠ” Memory μ£Όμ†Œκ°€ μ„œλ‘œ λ‹€λ₯΄λ”라도 ν•΄λ‹Ή λ‚΄μš©μ΄ κ°™μœΌλ©΄ 두 λ³€μˆ˜λŠ” λ™λ“±ν•˜λ‹€λΌκ³  이야기 ν•  수 μžˆμ–΄μš”.

Java(μžλ°”)μ—μ„œλŠ” 동등성 비ꡐλ₯Ό μœ„ν•΄ equals()λ₯Ό μ΄μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.


λ§Œμ•½ μ΄λ¦„μ΄λ‚˜, λ‚˜μ΄κ°€ λ™μΌν•˜λ©΄ 같은 μ‚¬λžŒμœΌλ‘œ μ²˜λ¦¬ν•˜κ³  싢을 땐 μ–΄λ–»κ²Œ ν•  수 μžˆμ„κΉŒμš”?

λ§Œμ•½ μžλ°”μ˜€λ‹€λ©΄ equals()λ₯Ό μ΄μš©ν•΄μ„œ 동등성 비ꡐλ₯Ό μ΄μš©ν•˜κ³ , hashCode() Overrideλ₯Ό 톡해 κ΅¬ν˜„ν•  수 μžˆμ„ κ±°μ—μš”.


src/main/kotlin/Main.kt


λ¬Όλ‘  코틀린도 μœ„μ™€ 같이 equals()와 hashCode()λ₯Ό Overrideν•΄μ„œ μ΄μš©ν•  μˆ˜λ„ μžˆμ–΄μš”.

ν•˜.지.만 코틀린이라면 λ­”κ°€ λ‹€λ₯Έ 게 있겠죠?


src/main/kotlin/Main.kt


μ΄λ ‡κ²Œ data class둜 λͺ…μ‹œν•΄ μ£Όλ©΄


μœ„μ™€ 같이 같은 Memory μ£Όμ†Œμ— 객체가 μ €μž₯되고, 두 κ°μ²΄λŠ” λ™μΌν•œ κ°μ²΄μž„μ„ μ•Œ 수 μžˆμ–΄μš”.

그리고 좜λ ₯ν•  λ•Œ, μœ„μ—μ„œλŠ” 객체 좜λ ₯으둜 Memory μ£Όμ†Œκ°€ 좜λ ₯된 반면

μ΄λ²ˆμ—λŠ” 객체 μ•ˆμ˜ κ°’κΉŒμ§€ 좜λ ₯λ˜λŠ” κ±Έ 확인할 수 μžˆμ–΄μš”.

이λ₯Ό 톡해 toString() Override도 ν•„μš” μ—†μ–΄μš”.

λ§Œμ•½ 일반 ν΄λž˜μŠ€μ—μ„œ μƒμ„±μžμ— 맀개 λ³€μˆ˜λ‘œ 값을 λ°›κ³  λλ‚˜λŠ” 것이 μ•„λ‹Œ

μ–΄λ–€ Logic(둜직)을 λ„£μ–΄ μ£Όκ³  μ‹Άλ‹€λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒμš”?

src/main/kotlin/Main.kt

μ΄λ ‡κ²Œ init {}을 μ΄μš©ν•΄μ„œ λ‘œμ§μ„ λ„£μ–΄μ£Όλ©΄ μ²˜λ¦¬ν•  수 μžˆμ–΄μš”.


 

src/main/kotlin/Main.kt

μœ„μ™€ 같이 Person ν΄λž˜μŠ€μ— hobbyλΌλŠ” 멀버 λ³€μˆ˜λ₯Ό λ§Œλ“€κ³ , changeHobby()λ₯Ό 톡해 ν•΄λ‹Ή μ·¨λ―Έλ₯Ό λ³€κ²½ν•˜λŠ” λ©”μ„œλ“œλ₯Ό λ§Œλ“€μ—ˆμ„ λ•Œ, μ™ΈλΆ€μ—μ„œ μ·¨λ―Έλ₯Ό λ°”κΏ€ 수 μžˆμ–΄μš”.


src/main/kotlin/Main.kt


μœ„μ™€ 같이 main()μ—μ„œ john 객체의 hobbyλ₯Ό λ°”κΏ€ 수 μžˆλŠ” κ±Έ μ•Œ 수 μžˆμ–΄μš”.
λ§Œμ•½ μ΄λ ‡κ²Œ λ°–μ—μ„œ μž„μ˜λ‘œ μ²˜λ¦¬λ˜λŠ” κ±Έ λ§‰μœΌλ €λ©΄ μ–΄λ–»κ²Œ ν•  수 μžˆμ„κΉŒμš”?

ν˜„μž¬ hobby λ³€μˆ˜λŠ” μ™ΈλΆ€μ—μ„œ 접근이 κ°€λŠ₯ν•œ μƒνƒœμ—μš”.

src/main/kotlin/Main.kt


그런데 μœ„μ™€ 같이 private set을 λΆ™ν˜€μ€˜ 버리면

src/main/kotlin/Main.kt


μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•˜μ§€ λͺ»ν•˜κ²Œ setter κΈ°λŠ₯을 막아버린 κ±Έ μ•Œ 수 μžˆμ–΄μš”.


src/main/kotlin/Main.kt


κ²Œν„°λ₯Ό μ΄μš©ν•˜κ³  μ‹Άλ‹€λ©΄ μœ„ 19번째 쀄과 같이 μ΄μš©ν•  수 μžˆλŠ”λ°,
λ³€μˆ˜μ— μ ‘κ·Όν•˜κΈ° μœ„ν•΄μ„œλŠ” $fieldλ₯Ό μ΄μš©ν•΄μ„œ μ ‘κ·Όν•΄μ£Όμ–΄μ•Ό ν•΄μš”.


src/main/kotlin/Main.kt

 


μ΄λ ‡κ²Œ 멀버 λ³€μˆ˜μ— 값을 κ°€μ Έμ˜¬ 수 μžˆλŠ” κ±Έ 확인할 수 μžˆμ–΄μš”.

 

 

 

 

 

 

        πŸ“¦ Extends

객체 지ν–₯ μ–Έμ–΄μ˜ μ€‘μš”ν•œ λΆ€λΆ„ 쀑 ν•˜λ‚˜μΈ Extends(상속)에 λŒ€ν•΄μ„œ 코틀린은 μ–΄λ–€μ‹μœΌλ‘œ μ΄μš©ν•  수 μžˆμ„κΉŒμš”?

src/main/kotlin/Main.kt


μœ„μ™€ 같이 강아지와 고양이 ν΄λž˜μŠ€λŠ” moveλΌλŠ” 행동을 ν•  수 있게 μ •μ˜ν•΄ μ£Όκ³  μ‹Άμ–΄μš”.

근데 각각의 클래슀이긴 ν•˜μ§€λ§Œ, move()λŠ” λ™μΌν•œ 것을 μ•Œ 수 μžˆμ–΄μš”.

src/main/kotlin/Main.kt


μ΄λ ‡κ²Œ Abstract(좔상) 클래슀 Animal을 λ§Œλ“€κ³ , λ©”μ„œλ“œλ₯Ό κ·Έ μ•ˆμ— λ„£μ–΄μ£Όμ—ˆμ–΄μš”.
그런 λ’€ 각 ν΄λž˜μŠ€μ—μ„œ Animal을 μƒμ†λ°›κ²Œ ν•˜μ˜€λŠ”λ°, μ€‘μš”ν•œ 것은 () μ†Œκ΄„ν˜Έκ°€ λΆ™μ—ˆλ‹€λŠ” κ²ƒμ΄μ—μš”.
μ΄λŠ” κΈ°λ³Έ μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜κ² λ‹€λŠ” 의미이기 λ•Œλ¬Έμ— λ°˜λ“œμ‹œ λΆ™ν˜€μ£Όμ–΄μ•Ό ν•΄μš”.

 

src/main/kotlin/Main.kt


이 λ•Œ, 상속 받은 클래슀의 λ©”μ„œλ“œλ₯Ό Override ν•˜λ €κ³  ν•˜λ©΄ μ•ˆλ˜λŠ” κ±Έ μ•Œ 수 μžˆμ–΄μš”.
μžλ°”λŠ” 기본적으둜 λͺ¨λ“  게 λ‹€ λœλ‹€! 의 κ°œλ…μœΌλ‘œ λ§Œλ“€μ–΄μ§„ 언어인데, μ½”ν‹€λ¦°μ˜ κ²½μš°μ—λŠ” λ°˜λŒ€λ‘œ λͺ¨λ“ κ²Œ λ‹€ μ•ˆλΌ! λΌλŠ” κ°œλ…μœΌλ‘œ λ§Œλ“€μ–΄μ§„ μ–Έμ–΄μ—μš”.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— Overrideλ₯Ό ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ•„λž˜μ™€ 같이 ν•΄μ£Όμ–΄μ•Ό ν•΄μš”.

src/main/kotlin/Main.kt


μ΄λ ‡κ²Œ λΆ€λͺ¨ 클래슀 λ©”μ„œλ“œμ— open μ΄λΌλŠ” ν‚€μ›Œλ“œλ₯Ό μ„ μ–Έν•΄μ€˜μ•Ό λΉ„λ‘œμ†Œ Overrideλ₯Ό ν•˜μ—¬ μ΄μš©ν•  수 μžˆμ–΄μš”.


src/main/kotlin/Main.kt


μ—¬κΈ°μ„œ μ°Έκ³ ν•  점은 좔상 ν΄λž˜μŠ€λŠ” μƒμ†μ˜ μž¬λ£Œκ°€ 되기 λ•Œλ¬Έμ— 상속이 기본적으둜 λ˜λŠ” νŠΉμ§•μ΄ μžˆμ–΄μš”.

그리고 μžλ°”μ™€ λ°˜λŒ€λ‘œ 일반 ν΄λž˜μŠ€λŠ” 상속을 ν•  수 μ—†κ²Œ λ˜μ–΄ μžˆμ–΄μš”.

κ·Έλž˜μ„œ ν•΄λ‹Ή 일반 클래슀 μ•žμ— openμ΄λΌλŠ” ν‚€μ›Œλ“œλ₯Ό 달아주어야 ν•΄μš”.


src/main/kotlin/Main.kt

 


μ΄λ ‡κ²Œ μ‚¬μš©ν•  수 μžˆλŠ”κ±Έ μ•Œ 수 μžˆμ–΄μš”.


 

 

 

 

        πŸ“¦ Interface

객체 지ν–₯의 또 λ‹€λ₯Έ 꽃! Interface(μΈν„°νŽ˜μ΄μŠ€)에 λŒ€ν•΄ μ•Œμ•„λ³Όκ²Œμš”.

src/main/kotlin/Main.kt


μΈν„°νŽ˜μ΄μŠ€ Drwable에 draw()λ₯Ό μ„ μ–Έν•΄μ£Όκ³ , 이λ₯Ό κ΅¬ν˜„ν•  κ΅¬ν˜„μ²΄μ— μœ„μ™€ 같이 μ„ μ–Έν•΄ μ£Όμ—ˆμ–΄μš”.
참고둜 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ„ μ–Έν•  λ•ŒλŠ” μƒμ„±μžκ°€ μ—†κΈ° λ•Œλ¬Έμ— μ†Œκ΄„ν˜Έλ₯Ό 넣지 μ•Šμ•„μš”.

src/main/kotlin/Main.kt


그리고 μœ„μ™€ 같이 draw()λ₯Ό Override ν•΄μ£Όλ©΄ ErrorλŠ” μ‚¬λΌμ§€κ²Œ λ κ±°μ—μš”.

src/main/kotlin/Main.kt

 

src/main/kotlin/Main.kt

 

 

μ΄λ ‡κ²Œ μ½”ν‹€λ¦°μ—μ„œλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“€κ³ , κ΅¬ν˜„μ²΄λ₯Ό λ§Œλ“€μ–΄ μ΄μš©ν•  수 μžˆμ–΄μš”.

 

 

 

 

 

 

 

        πŸ“¦ Type Check 'is'

μžλ°”μ—μ„œ Type Check(νƒ€μž… 체크)λ₯Ό μœ„ν•΄ instanceof ν˜Ήμ€ isInstanceλ₯Ό μ‚¬μš©ν•˜μ—¬ νƒ€μž… 체크λ₯Ό ν•  수 μžˆμ–΄μš”.

src/main/kotlin/Main.kt


μ½”ν‹€λ¦°μ˜ 경우 μœ„μ™€ 같이 is λΌλŠ” ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ νƒ€μž… 체크λ₯Ό ν•  수 μžˆμ–΄μš”.


6번째 뢄기문은 dog 객체가 Dog μžλ£Œν˜• νƒ€μž…μ΄λƒκ³  물은 κ±°μ—μš”.

λ§žμœΌλ‹ŒκΉŒ dog 객체의 move()와 draw()κ°€ 호좜되고, 연산을 ν•œ κ±°μ—μš”.


src/main/kotlin/Main.kt


근데 λ§Œμ•½ 3번째 쀄과 같이 cat λ³€μˆ˜μ˜ μžλ£Œν˜• νƒ€μž…μ„ Animal둜 ν•΄ 놓고, 비ꡐλ₯Ό ν•΄ 보면 μ–΄λ–»κ²Œ λ κΉŒμš”?

src/main/kotlin/Main.kt


λΆ€λͺ¨λ₯Ό μƒμ†ν•œ μžμ‹ νƒ€μž…μ΄κΈ° λ•Œλ¬Έμ— κ²°κ΅­ λ˜‘κ°™μ€ μžλ£Œν˜• νƒ€μž…μΈ 것을 μ•Œ 수 μžˆμ–΄μš”.

 

 

 

 

 

        πŸ“¦ κ°•μ œ ν˜•λ³€ν™˜ 'as'

src/main/kotlin/Main.kt


as ν‚€μ›Œλ“œλŠ” μœ„μ™€ 같이 상속 관계가 μžˆλŠ” νƒ€μž… 간에 κ°•μ œ ν˜•λ³€ν™˜μ„ ν•˜κ³ μž ν•  λ•Œ μ‚¬μš©ν•΄μš”.
κΈ°λ³Έ 데이터 νƒ€μž…μ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†λ‹€λŠ” κ±Έ 잊으면 μ•ˆλΌμš”.

λ˜ν•œ, μ‚¬μš©μž μ •μ˜ 클래슀, μΈν„°νŽ˜μ΄μŠ€ λ“±μ—μ„œλŠ” as μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜μ—¬ κ°•μ œ ν˜• λ³€ν™˜μ΄ κ°€λŠ₯ν•΄μš”.


17번째 쀄에 animal λ³€μˆ˜ νƒ€μž…μ„ Animal 좔상 ν΄λž˜μŠ€ν˜•μœΌλ‘œ 작고, Dog 객체λ₯Ό λ§Œλ“€μ–΄ λ„£μ–΄μ£Όμ—ˆμ–΄μš”.
κ·Έλ ‡λ‹€λ©΄ animal λ³€μˆ˜μ˜ κ°μ²΄λŠ” Dog 객체가 λ“€μ–΄μžˆκ² μ§€μš”?

κ·Έλž˜μ„œ 20번째 쀄에 animal λ³€μˆ˜μ˜ νƒ€μž… 체크 μ‹œ 걸리게 되고, 21번째 쀄에 ν•΄λ‹Ή 객체 νƒ€μž…μ„ Dog으둜 λ°”κΏ”μ£Όμ–΄ λ΄€μ–΄μš”.
κ·Έλ ‡κ²Œ ν•΄μ„œ λΆ€λͺ¨ νƒ€μž…μ΄ μ•„λ‹Œ μžμ‹ νƒ€μž…μœΌλ‘œ κ°•μ œ ν˜• λ³€ν™˜μ„ ν•΄ μ€€κ±°μ—μš”.

 

 

 

 

        πŸ“¦ Generic

μ΄λ²ˆμ—” Generic(μ œλ„€λ¦­)에 λŒ€ν•΄ μ•Œμ•„λ³Όκ²Œμš”.

src/main/kotlin/Main.kt


μ œλ„€λ¦­μ€ μžλ°”μ™€ λ™μΌν•΄μš”.
μœ„μ™€ 같이 Box ν΄λž˜μŠ€μ— μ œλ„€λ¦­ νƒ€μž…μœΌλ‘œ Tλ₯Ό λ°›κ² λ‹€κ³  μ„ μ–Έν•˜κ³ , 맀개 λ³€μˆ˜ value μžλ£Œν˜• νƒ€μž…μ„ T둜 μ„ μ–Έν•΄μ£Όλ©΄
μ–΄λ–€ μžλ£Œν˜• νƒ€μž…λ„ 받을 수 있게 λΌμš”.


λ˜ν•œ 2, 3번째 쀄 객체 생성 λ•Œ <>이 뢀뢄을 μƒλž΅ν–ˆλŠ”λ°, μΈμžκ°’μ„ 톡해 νƒ€μž… 좔둠이 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— μƒλž΅ν•  수 μžˆμ–΄μš”.

 

 

 

 

 

        πŸ“¦ Call Back Function (Higher-order Function)

μ΄λ²ˆμ—λŠ” Call Back Function(콜백 ν•¨μˆ˜ ν˜Ήμ€ κ³ μ°¨ν•¨μˆ˜)에 λŒ€ν•΄ μ•Œμ•„λ³Όκ²Œμš”.

src/main/kotlin/Main.kt


μ΄λ ‡κ²Œ junysFunc()이 μžˆμ„ λ•Œ, 맀개 λ³€μˆ˜λ‘œ ν•¨μˆ˜λ₯Ό 받도둝 λ§Œλ“€μ–΄ 쀄 수 μžˆμ–΄μš”.
이 λ•Œ,  ν•¨μˆ˜λŠ” 맀개 λ³€μˆ˜(Input)κ³Ό λ°˜ν™˜ νƒ€μž… (Output)을 μ •μ˜ν•΄ μ£Όλ©΄ λΌμš”.
그런데, 맀개 λ³€μˆ˜κ°€ μ—†λ‹€λ©΄ μ†Œκ΄„ν˜Έλ§Œ μ„ μ–Έν•΄ μ£Όλ©΄ 되고, 맀개 λ³€μˆ˜κ°€ μžˆλ‹€λ©΄ μ •μ˜λ₯Ό ν•΄ μ£Όμ–΄μ•Ό ν•΄μš”.

src/main/kotlin/Main.kt


μ΄λ ‡κ²Œ ν•˜λ©΄ 맀개 λ³€μˆ˜κ°€ μ—†λ‹€λŠ” μ˜λ―Έμ—μš”.

 

 

src/main/kotlin/Main.kt


이건 맀개 λ³€μˆ˜κ°€ μžˆλ‹€λŠ” μ˜λ―Έκ°€ λ κ±°μ—μš”.

src/main/kotlin/Main.kt


μœ„μ™€ 같이 ν•΄μ£Όλ©΄ 맀개 λ³€μˆ˜λ„ μ—†κ³ , λ°˜ν™˜ νƒ€μž…λ„ μ—†λ‹€λŠ” μ˜λ―Έμ—μš”.
μžλ°”μ—μ„œλŠ” Voidκ°€ λ°˜ν™˜ νƒ€μž…μ΄ μ—†λ‹€λŠ” μ˜λ―Έμ΄μ§€λ§Œ, μ—¬κΈ°μ„œλŠ” Unitμ΄λΌλŠ” ν‚€μ›Œλ“œλ₯Ό μ„ μ–Έν•΄ μ£Όμ–΄μ•Ό ν•΄μš”.


src/main/kotlin/Main.kt


μ΄λ ‡κ²Œ ν•˜κ²Œ 되면 이름이 callBackμ΄λΌλŠ” ν•¨μˆ˜μ— 맀개 λ³€μˆ˜λŠ” μ—†κ³ , λ°˜ν™˜κ°’λ„ μ—†λ‹€λŠ” μ˜λ―Έκ°€ 되고,
이 callBack ν•¨μˆ˜λ₯Ό 맀개 λ³€μˆ˜λ‘œ 전달 λ°›κ² λ‹€λŠ” μ˜λ―Έμ—μš”.

src/main/kotlin/Main.kt


μ΄λ ‡κ²Œ ν•˜λ©΄ main()μ—μ„œ junysFunc()을 ν˜ΈμΆœν•˜λŠ”λ°, {} μ•ˆμ˜ ν•¨μˆ˜λ₯Ό μΈμžκ°’μœΌλ‘œ μ „λ‹¬ν•˜κ² λ‹€λŠ” 의미이고,
8번째 μ€„μ—μ„œ ν˜ΈμΆœν•˜κ² λ‹€λŠ” μ˜λ―Έμ—μš”.

쑰금 더 μžμ„Ένžˆ μ„€λͺ…ν•΄ 보면 junysFunc()은 콜백 ν•¨μˆ˜ ν˜Ήμ€ κ³ μ°¨ ν•¨μˆ˜μΈλ°, ν•¨μˆ˜λ₯Ό 맀개 λ³€μˆ˜λ‘œ λ°›μ•„ μ‹€ν–‰λ˜λŠ” ν•¨μˆ˜λ₯Ό μ΄λ ‡κ²Œ λΆˆλŸ¬μš”.

ν•¨μˆ˜ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό 보면 callBack은 ν•¨μˆ˜λ₯Ό λ°›κΈ° μœ„ν•œ λžŒλ‹€μ‹ 맀개 λ³€μˆ˜λ‘œ ν•¨μˆ˜μ˜ λ°˜ν™˜νƒ€μž…μ€ Unit 즉, Voidμž„μ„ μ•Œ 수 μžˆμ–΄μš”.

main()μ—μ„œ junysFunc()을 ν˜ΈμΆœν•˜λŠ”λ°, junysFunc()에 λžŒλ‹€μ‹μ„ μ „λ‹¬ν•˜μ—¬ ν˜ΈμΆœν•˜κ³  μžˆμ–΄μš”.
μ—¬κΈ°μ„œ μ€‘κ΄„ν˜Έ μ•ˆμ— μžˆλŠ” Code Block(μ½”λ“œ 블둝)은 junysFunc()의 맀개 λ³€μˆ˜λ‘œ 전달될 λžŒλ‹€μ‹μ΄μ—μš”.
λžŒλ‹€μ‹ λ‚΄λΆ€μ—μ„œλŠ” "junysFunc μ‹€ν–‰" μ΄λΌλŠ” λ¬Έμžμ—΄μ„ 좜λ ₯ν•˜λŠ” κ±Έ μ•Œ 수 μžˆμ–΄μš”.

이 ν”„λ‘œκ·Έλž¨μ„ λ™μž‘μ‹œν‚€λ©΄ main()μ—μ„œ junysFunc()을 ν˜ΈμΆœν•˜κ²Œ 되고, junysFunc()μ—μ„œλŠ” μ „λ‹¬λœ λžŒλ‹€μ‹μ„ μ‹€ν–‰ν•˜μ—¬ "junysFunc μ‹€ν–‰"μ΄λΌλŠ” λ¬Έμžμ—΄μ„ 좜λ ₯ν•˜κ²Œ λœλ‹΅λ‹ˆλ‹€.




src/main/kotlin/Main.kt

 

 

μ΄λ ‡κ²Œ 보면 main()이 junysFunc()을 ν˜ΈμΆœν•  λ•Œ, λžŒλ‹€μ‹μœΌλ‘œ ν•¨μˆ˜λ₯Ό 맀개 λ³€μˆ˜λ‘œ 전달을 ν•˜λŠ”λ°,
κ·Έ 맀개 λ³€μˆ˜μ˜ ν•¨μˆ˜κ°€ λ°”λ‘œ μ‹€ν–‰λ˜λŠ”κ²Œ μ•„λ‹ˆλΌ 9번째 μ€„μ—μ„œ ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄μ€˜μ•Ό λ™μž‘ν•˜λŠ” κ±Έ μ•Œ 수 μžˆμ–΄μš”.

 

 

src/main/kotlin/Main.kt


참고둜 ν•΄λ‹Ή ν•¨μˆ˜μ˜ 맀개 λ³€μˆ˜κ°€ ν•¨μˆ˜κ°€ μ•„λ‹ˆκ³ , ν•œ κ°œκ°€ 아닐 λ•ŒλŠ” μœ„μ™€ 같이 ν•΄μ€˜μ•Ό ν•΄μš”.
ν•¨μˆ˜ν˜• 맀개 λ³€μˆ˜λŠ” λ°–μœΌλ‘œ λΉΌλ‚Ό 수 μžˆλŠ” κ±°κ³ , κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ€‘κ΄„ν˜Έ μ•ˆμ— λ„£μ–΄μ„œ 전달할 수 μžˆλŠ”κ±°μ—μš”. 

 

 

 

 

        πŸ“¦ Coroutine

μ½”ν‹€λ¦°μ˜ μ€‘μš” κ°œλ… 쀑 ν•˜λ‚˜μΈ Coroutine(코루틴)에 λŒ€ν•΄ μ•Œμ•„λ³Όκ²Œμš”.

πŸ’‘ μ½”λ£¨ν‹΄μ΄λž€?

코루틴(coroutine)은 ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ‹€ν–‰ νλ¦„μ˜ μΌμ‹œ 정지와 재개λ₯Ό κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” μΌμ’…μ˜ μ„œλΈŒλ£¨ν‹΄(subroutine)이며,
비동기 ν”„λ‘œκ·Έλž˜λ°μ—μ„œ 자주 μ‚¬μš©λ©λ‹ˆλ‹€. 코루틴은 λ£¨ν‹΄μ˜ μ‹€ν–‰ 쀑에 μΌμ‹œμ μœΌλ‘œ μ€‘λ‹¨λ˜μ–΄ λ‚˜μ€‘μ— μ€‘λ‹¨λœ 지점뢀터 계속 싀행될 수 μžˆλŠ” νŠΉμ§•μ΄ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 일반적인 ν•¨μˆ˜ ν˜ΈμΆœκ³ΌλŠ” 달리, ν•¨μˆ˜μ˜ μ‹€ν–‰ μƒνƒœκ°€ λ©”λͺ¨λ¦¬μ— μœ μ§€λ˜μ–΄ λ‹€μŒ 호좜 μ‹œμ— μ΄μ–΄μ„œ 싀행될 수 μžˆλ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

코루틴은 λ™μ‹œμ„± 및 병렬성을 λ‹€λ£¨λŠ”λ° μœ μš©ν•˜λ©°, 특히 비동기 μ½”λ“œ μž‘μ„±μ— μ ν•©ν•©λ‹ˆλ‹€. λ§Žμ€ ν”„λ‘œκ·Έλž˜λ° 언어와 ν”„λ ˆμž„μ›Œν¬μ—μ„œ 코루틴을 μ§€μ›ν•˜κ³  있으며, 예λ₯Ό λ“€λ©΄ 파이썬의 asyncio λΌμ΄λΈŒλŸ¬λ¦¬λ‚˜ Kotlin의 μ½”ν‹€λ¦° μ–Έμ–΄μ—μ„œλ„ 코루틴을 ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 언어와 λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œλŠ” 코루틴을 톡해 비동기 μž‘μ—…μ„ 보닀 효과적으둜 λ‹€λ£° 수 μžˆμŠ΅λ‹ˆλ‹€.

 

src/main/kotlin/Main.kt


μœ„μ™€ 같이 ν•¨μˆ˜ μ•žμ— suspendλΌλŠ” ν‚€μ›Œλ“œλ₯Ό 써주게 되면 ν•΄λ‹Ή ν•¨μˆ˜λŠ” 정지 ν•¨μˆ˜λΌκ³  뢈리게 λΌμš”.
정지 ν•¨μˆ˜λŠ” ν•΄λ‹Ή ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜κ³ , 끝날 λ•ŒκΉŒμ§€ λŒ€κΈ°λ₯Ό ν•΄μ€˜μ•Ό ν•œλ‹€λŠ” 의미λ₯Ό 가지고 μžˆμ–΄μš”.

 

src/main/kotlin/Main.kt


ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 뢀뢄에 μ•žμ„ 보면 μΌμ‹œμ •μ§€ ν‘œμ‹œκ°€ λ‚˜μ˜¨κ±Έ μ•Œ 수 μžˆμ–΄μš”.
정지 ν•¨μˆ˜λŠ” μ΄λ ‡κ²Œ μΌμ‹œ 정지 ν‘œμ‹œκ°€ μƒκΈ°κ²Œ λœλ‹΅λ‹ˆλ‹€. 
이 ν•¨μˆ˜λŠ” 일반적인 Main Threadμ—μ„œ μ‹€ν–‰ν•  수 μ—†λŠ” ν•¨μˆ˜μ—μš”.


src/main/kotlin/Main.kt


경고문을 보면 정지 ν•¨μˆ˜ junysFunc()을 λΆ€λ₯΄λ €λ©΄ 코루틴 ν˜Ήμ€
또 λ‹€λ₯Έ 정지 ν•¨μˆ˜μ—μ„œλ§Œ ν˜ΈμΆœν•  수 μžˆλ‹€κ³  λ‚˜μ˜€λŠ” κ±Έ μ•Œ 수 μžˆμ–΄μš”.

src/main/kotlin/Main.kt

κ·Έλž˜μ„œ main() μ•žμ—λ‹€κ°€ suspend ν‚€μ›Œλ“œλ₯Ό λΆ™μ΄λ‹ˆ 였λ₯˜κ°€ 없어진걸 확인할 수 μžˆμ–΄μš”.



코루틴을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ½”ν‹€λ¦°μ˜ 코루틴 라이브러리λ₯Ό μ΄μš©ν•΄μ•Ό ν•΄μš”.
Gradle을 톡해 μ˜μ‘΄μ„±μ„ μΆ”κ°€ν•˜κ³  μ΄μš©ν•˜κΈ° μœ„ν•΄ λ‹€μ‹œ ν”„λ‘œμ νŠΈλ₯Ό λ§Œλ“€μ–΄ μ€„κ²Œμš”.


build.gradle

λ°˜μ‘ν˜•
dependencies {
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2"
}


그리고 μœ„μ™€ 같이 μ˜μ‘΄μ„±μ„ μΆ”κ°€ν•΄ μ€λ‹ˆλ‹€.


src/main/kotlin/Main.kt


μœ„ μ½”λ“œλŠ” 코루틴을 μ‚¬μš©ν•˜μ—¬ 비동기 μ½”λ“œλ₯Ό μž‘μ„±ν•œ μ˜ˆμ œμ—μš”.

main()μ—μ„œ runBlocking()을 μ‚¬μš©ν•˜μ—¬ main()을 Blocking(블둝킹) ν•˜κ³ , κ·Έ μ•ˆμ—μ„œ launch()λ₯Ό μ‚¬μš©ν•˜μ—¬ λΉ„ λ™κΈ°μ μœΌλ‘œ junyFunc()을 ν˜ΈμΆœν•˜κ³  μžˆμ–΄μš”.

14번째 쀄은 코루틴이 끝날 λ•ŒκΉŒμ§€ λŒ€κΈ°ν•˜λŠ” λ™μ•ˆ Main μ“°λ ˆλ“œλ₯Ό Block(블락)ν•˜κΈ° μœ„ν•œ μ½”λ“œμ—μš”.

launch()λ₯Ό μ‚¬μš©ν•˜μ—¬ junyFunc()을 λΉ„λ™κΈ°μ μœΌλ‘œ ν›„μ°° ν•  λ•Œ, 블둝 λ‚΄λΆ€μ˜ μ½”λ“œλŠ” λ³„λ„μ˜ μ“°λ ˆλ“œ λ˜λŠ” Background(λ°± κ·ΈλΌμš΄λ“œ)μ—μ„œ μ‹€ν–‰ν•˜κ²Œ ν•΄μš”.

junyFunc()이 μ‹œμž‘ν•˜λ©΄μ„œ "junyFunc() μ‹œμž‘!"이 좜λ ₯되고, λžŒλ‹€μ‹μ΄ μ‹€ν–‰λ˜μ–΄ "junyFunc() 호좜!"이 좜λ ₯되게 λΌμš”.
그리고, junyFunc()이 λλ‚˜λ©΄ "junyFunc() 끝!"을 ν˜ΈμΆœν•˜κ²Œ λ κ±°μ—μš”.

이런 λ°©μ‹μœΌλ‘œ runBlocking(), launch() 그리고, suspend()λ₯Ό μ‚¬μš©ν•˜μ—¬ 비동기적 μ½”λ“œλ₯Ό μ‚¬μš©ν•  수 μžˆμ–΄μš”.


κ°•μ˜λŠ” μ•ˆλ“œλ‘œμ΄λ“œ 기반으둜 κ°•μ˜λ₯Ό ν•˜κΈ° λ•Œλ¬Έμ— μ£Όλ‹ˆκ°€ λ³€κ²½ν•œ 뢀뢄이 μžˆλŠ” 점을 μ°Έκ³ ν•΄ μ£Όμ„Έμš”.


 

 

 

 

핡심 μ½”ν‹€λ¦° ν”„λ‘œκ·Έλž˜λ°

COUPANG

www.coupang.com

"이 ν¬μŠ€νŒ…μ€ 쿠팑 νŒŒνŠΈλ„ˆμŠ€ ν™œλ™μ˜ μΌν™˜μœΌλ‘œ, 이에 λ”°λ₯Έ μΌμ •μ•‘μ˜ 수수료λ₯Ό μ œκ³΅λ°›μŠ΅λ‹ˆλ‹€."

 

 

 

 

 

🧐 참고 자료

 

[무료] Kotlin 문법 총 정리 - 1μ‹œκ°„ - μΈν”„λŸ° | κ°•μ˜

1μ‹œκ°„ μ•ˆμ— ν•™μŠ΅ν•  수 μžˆλŠ” μ½”ν‹€λ¦° 문법 총 정리 κ°•μ˜μž…λ‹ˆλ‹€., λ°”μœ μ—¬λŸ¬λΆ„μ—κ²Œ λ”±!1μ‹œκ°„ λ§Œμ— μ •λ¦¬ν•˜λŠ” μ½”ν‹€λ¦° 문법 ⭐ μ–΄λ €μš΄ μ½”ν‹€λ¦°,λΉ λ₯΄κ²Œ μ •λ¦¬ν•©λ‹ˆλ‹€ πŸ“Œ λ³Έ κ°•μ˜λŠ” μœ νŠœλΈŒμ—μ„œ 인기 μžˆλŠ” 원

www.inflearn.com

 

 

 

 

 

카카였페이 | 마음 놓고 κΈˆμœ΅ν•˜λ‹€

μ—¬κΈ°λ₯Ό 눌러 링크λ₯Ό ν™•μΈν•˜μ„Έμš”.

qr.kakaopay.com

 

 

 

728x90
λ°˜μ‘ν˜•