DevLog 😢

[Kotlin] μ½”ν‹€λ¦°μ˜ λ³€μˆ˜μ™€ νƒ€μž… λ³Έλ¬Έ

✏️/Kotlin

[Kotlin] μ½”ν‹€λ¦°μ˜ λ³€μˆ˜μ™€ νƒ€μž…

dolmeng2 2023. 2. 22. 19:04

πŸ’‘ν•΅μ‹¬λ§Œ κ³¨λΌλ°°μš°λŠ” μ½”ν‹€λ¦° ν”„λ‘œκ·Έλž˜λ° 정리

: 기본적으둜 μžλ°”μ™€ κ²ΉμΉ˜λŠ” 뢀뢄을 μ œμ™Έν•˜κ³ , κ°„λ‹¨ν•œ λ¬Έλ²•λ“€λ§Œ μ •λ¦¬ν•˜κ³ μž ν•œλ‹€. 😎

 


βœ”οΈ μ½”ν‹€λ¦°μ˜ νŠΉμ§•

- JVMμ—μ„œ μ‹€ν–‰λ˜κΈ° λ•Œλ¬Έμ— μžλ°”μ™€ ν˜Έν™˜μ„±μ΄ λ†’λ‹€. 
- μ •μ  νƒ€μž… μ–Έμ–΄μ΄κΈ° λ•Œλ¬Έμ—, λͺ¨λ“  νƒ€μž…은 μ»΄νŒŒμΌ μ‹œμ μ—μ„œ μ•Œ μˆ˜ μžˆλ‹€. 
νƒ€μž… μΆ”λ‘  κΈ°λŠ₯을 톡해 λ³€μˆ˜ μ„ μ–Έ μ‹œ λ³€μˆ˜μ˜ νƒ€μž…μ„ λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•˜μ§€ μ•Šμ•„λ„ μ²˜λ¦¬ν•  수 μžˆλ‹€.
- κ°μ²΄μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ„ μ§€μ›ν•œλ‹€.
- ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ μ§€μ›ν•˜κΈ° λ•Œλ¬Έμ—, λ‹€μ–‘ν•œ ν•¨μˆ˜μ™€ λžŒλ‹€μ‹μ„ μ§€μ›ν•œλ‹€.
  - μ§€μ—­ ν•¨μˆ˜ (ν•¨μˆ˜ λ‚΄λΆ€μ— λ‹€λ₯Έ ν•¨μˆ˜ μ„ μ–Έ)
  - λ©€λ²„ ν•¨μˆ˜ (클래슀 λ‚΄λΆ€μ— ν•¨μˆ˜λ₯Ό μ„ μ–Έ = μžλ°”μ˜ λ©”μ„œλ“œ)
  - μ œλ„€λ¦­ ν•¨μˆ˜ (ν•¨μˆ˜μ— μ œλ„€λ¦­ νƒ€μž… μ‚¬μš©)
  - κ³ μ°¨ ν•¨μˆ˜ (λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό μΈμžλ‘œ λ°›μ•„ μ‹€ν–‰)
  - μž¬κ·€ ν•¨μˆ˜ (μž¬κ·€ ν˜ΈμΆœ μ΅œμ ν™”)
  - ν™•μž₯ ν•¨μˆ˜ (κΈ°μ‘΄ ν΄λž«μ˜ κΈ°λŠ₯을 μΆ”κ°€)
- λ¬Έλ²•κ³Ό μ½”λ“œκ°€ κ°„κ²°ν•˜λ©°, ν΄λž˜μŠ€μ˜ Getter / Setterλ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•  μˆ˜ μžˆλ‹€.
NPEλ₯Ό μ»€λ²„ν•œλ‹€. λ³€μˆ˜ νƒ€μž… 끝에 ?을 λΆ™μ—¬μ„œ Null νƒ€μž…μž„μ„ κ°„λ‹¨ν•˜κ²Œ μ•Œλ €μ€„ 수 μžˆλ‹€.




βœ”οΈ μ½”ν‹€λ¦° μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λΉŒλ“œ 절차

.kt  
-> (μ½”ν‹€λ¦° 컴파일러)   
-> *.class   
-> *.jar  
(μ΄λ•Œ, μ‚¬μš©μžκ°€ --include-runtime을 ν™œμš©ν•˜μ—¬ μ½”ν‹€λ¦°μ˜ λŸ°νƒ€μž„ 라이브러리λ₯Ό 우리의 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‚΄λΆ€λ‘œ ν¬ν•¨μ‹œν‚¬ 수 μžˆλ‹€. ν•˜μ§€ μ•ŠμœΌλ©΄, λ³„λ„μ˜ μ½”ν‹€λ¦° λŸ°νƒ€μž„ λΌμ΄λΈŒλŸ¬λ¦¬λ₯Ό λ°°ν¬ν•˜μ—¬ μ‚¬μš©ν•˜λ„둝 ν•œλ‹€.)  
-> JVM (java)
-> μ‹€ν–‰



βœ”οΈ κΈ°λ³Έ 문법

- κΈ°λ³Έμ μœΌλ‘œ ν•¨μˆ˜ μ„ μ–Έ μ‹œ fun ν‚€μ›Œλ“œλ₯Ό μ•žμ— λΆ™μΈλ‹€.
  - ν•¨μˆ˜λŠ” μ†ŒμŠ€ μ½”λ“œ νŒŒμΌμ˜ μ–΄λ””λ“  λ°”λ‘œ μ •μ˜κ°€ κ°€λŠ₯ν•˜λ‹€.
  - ν•¨μˆ˜ λ‚΄λΆ€μ˜ λ§€κ°œλ³€μˆ˜λ‚˜ μ§€μ—­λ³€μˆ˜ νƒ€μž…은, μ΄λ¦„ λ‹€μŒμ— μ½œλ‘ (:)을 μΆ”κ°€ν•œ λ’€ μ§€μ •ν•œλ‹€.
  - ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’ νƒ€μž…은 ν•¨μˆ˜ μ •μ˜ λ¬Έμž₯ λμ— μ½œλ‘ μ„ μΆ”κ°€ν•œ ν›„ μ§€μ •ν•œλ‹€. λ°˜ν™˜κ°’이 μ—†λ‹€λ©΄ Unit νƒ€μž…μœΌλ‘œ μ •μ˜ν•œλ‹€.

// λ°˜ν™˜κ°’μ΄ String ν˜•μ΄κ³ , μΈμžκ°€ Intν˜•μΈ λ©”μ„œλ“œ 예제
fun test(option: Int) : String {
    return if (option == 1) "μ•ˆλ…•ν•˜μ„Έμš”" else "μ•ˆλ…•νžˆ κ³„μ„Έμš”"
}


- μ½”ν‹€λ¦° ν‘œμ€€μ—μ„œλŠ” JDK ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬ λ©”μ„œλ“œ, ν΄λž˜μŠ€μ— λŒ€ν•œ λž˜νΌ ν΄λž˜μŠ€λ₯Ό μ œκ³΅ν•œλ‹€.
  - ex) `System.out.println()` -> `println()`
- λ¬Έμž₯의 μ œμΌ λμ— μ„Έλ―Έμ½œλ‘ μ„ μƒλž΅ν•΄λ„ λ˜μ§€λ§Œ, λ‘ κ°œ μ΄μƒμ˜ ν‘œν˜„식을 ν•œ μ€„λ‘œ μ‚¬μš©ν•  λ•ŒλŠ” λΆ™μ—¬μ•Ό ν•œλ‹€.
ν•¨μˆ˜μ˜ μ‹€ν–‰ μ½”λ“œκ°€ ν•˜λ‚˜μ˜ ν‘œν˜„식이라면, μ€‘κ΄„ν˜Έμ™€ λ°˜ν™˜κ°’ νƒ€μž…을 μƒλž΅ν•  μˆ˜ μžˆλ‹€! 

// λ‹€μŒκ³Ό 같이 예제λ₯Ό μˆ˜μ •ν•  수 μžˆλ‹€.
fun test(option: Int) =
        if (option == 1) "μ•ˆλ…•ν•˜μ„Έμš”" else "μ•ˆλ…•νžˆ κ³„μ„Έμš”"


- μ½”ν‹€λ¦° ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬μ˜ λͺ¨λ“  μ½”λ“œλŠ” importλ₯Ό μ§€μ •ν•˜μ§€ μ•Šμ•„도 λ°”λ‘œ μ‚¬μš©ν•  μˆ˜ μžˆλ‹€. (μ ‘κ·Ό μ œμ–΄μžλ‘œ λ§‰μœΌλ©΄ λœλ‹€.)
  - λ˜ν•œ, import μ‹œ asλ₯Ό ν†΅ν•΄μ„œ λ³„칭을 μ§€μ •ν•΄μ€„ μˆ˜ μžˆλ‹€.




βœ”οΈ λ³€μˆ˜ 

기본적으둜 μ§€μ—­ λ³€μˆ˜λ©°, μ „μ—­ λ³€μˆ˜μ˜ κ°œλ…μ΄ μ—†λ‹€.
  - μΌλ‹¨ μ΄ˆκΈ°ν™”λ˜λ©΄ κ°’을 λ³€κ²½ν•  μˆ˜ μ—†λŠ” λΆˆλ³€λ³€μˆ˜μ™€, μ–Έμ œλ“ μ§€ λ³€κ²½μ΄ κ°€λŠ₯ν•œ κ°€λ³€ λ³€μˆ˜λ‘œ κ΅¬μ„±λœλ‹€.
  - λΆˆλ³€λ³€μˆ˜(=final)λŠ” val둜, κ°€λ³€λ³€μˆ˜λŠ” var둜 μ„ μ–Έν•œλ‹€.
- λͺ¨λ“  λ³€μˆ˜λŠ” μ‚¬μš© μ „에 λ°˜λ“œμ‹œ μ΄ˆκΈ°ν™”λ˜μ–΄μ•Ό ν•˜λ©°, μ„ μ–Έλœ νƒ€μž… μžμ²΄λŠ” λ³€κ²½μ΄ λΆˆκ°€λŠ₯ν•˜λ‹€.
- λ³€μˆ˜μ˜ νƒ€μž…은 λ³€μˆ˜ μ΄λ¦„ λ‹€μŒμ— μ½œλ‘ (:)을 λΆ™μ—¬μ„œ μ§€μ •ν•œλ‹€.

val a : Int = 7, var b : Int = 0


- ν˜Ήμ€, νƒ€μž…을 μ“°μ§€ μ•Šκ³  μ΄λŸ° μ‹μœΌλ‘œ μ“Έ μˆ˜ μžˆλ‹€. μ½”ν‹€λ¦° μ»΄νŒŒμΌλŸ¬κ°€ νƒ€μž… μΆ”둠을 ν†΅ν•΄ Int둜 μ²˜λ¦¬ν•œλ‹€.

val b = 10


βœ”οΈ νƒ€μž… 

- 코틀린은 κΈ°λ³Έ νƒ€μž…μ΄ λͺ¨λ‘ 클래슀둜 μ •μ˜λ˜μ–΄ μžˆλ‹€. ν•˜μ§€λ§Œ, μ½”ν‹€λ¦° μ»΄νŒŒμΌλŸ¬κ°€ μ•Œμ•„μ„œ 객체둜 λ§Œλ“€μ–΄μ€€λ‹€.
  - κΈ°λ³Έ νƒ€μž… : Byte, Short, Int, Long, Float, Double, Char, Boolean
- μˆ«μž κ°„μ˜ νƒ€μž… λ³€ν™˜μ„ μžλ™μœΌλ‘œ ν•΄μ£Όμ§€ μ•ŠλŠ”λ‹€. λͺ…μ‹œμ μœΌλ‘œ λ³€ν™˜ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄μ€˜μ•Ό ν•œλ‹€.

val a: Int = 100;
val b: Long = a; // 컴파일 μ—λŸ¬!
val b: Long = a.toLong() // 성곡!
val b: Long = a + 1L; // 이 κ²½μš°λŠ” ν‘œν˜„μ‹μ˜ 결과둜 μ»΄νŒŒμΌλŸ¬κ°€ Longμž„μ„ μΆ”λ‘ ν•΄μ„œ 였λ₯˜κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.


- λ¬Έμžμ—΄ νƒ€μž…은 String이며, μžλ°”와 λ™μΌν•˜λ‹€.
  - λ¬Έμžμ—΄ λ¦¬ν„°λŸ΄μ„ ν™œμš©ν•˜λ©΄, κ°œν–‰ λ¬Έμžκ°€ ν¬ν•¨λœ λ¬Έμžμ—΄μ„ \n을 μ‚¬μš©ν•˜μ§€ μ•Šκ³  """κ³Ό """ μ‚¬μ΄μ— κ°’을 λ„£μ–΄ κ·ΈλŒ€λ‘œ λ¬Έμžλ₯Ό μΆœλ ₯ν•  μˆ˜λ„ μžˆλ‹€.

val s = """
  μ•ˆλ…•ν•˜μ„Έμš”
  λŒ€λ°•
"""


- μΆ”κ°€μ μœΌλ‘œ trimMargin("")을 ν™œμš©ν•˜λ©΄, μ—¬λ°± μ œκ±°λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ¬Έμžλ₯Ό λ„˜κ²¨μ£Όμ–΄μ„œ ν•΄λ‹Ή λ¬Έμžλ₯Ό μ œκ±°ν•΄μ€„ μˆ˜ μžˆλ‹€.
λ³€μˆ˜ μ΄λ¦„ μ•žμ— $λ₯Ό λΆ™μ—¬μ„œ λ¬Έμžμ—΄ ν…œν”Œλ¦Ώμ„ λ§Œλ“€ μˆ˜ μžˆλ‹€.
  - λ°°μ—΄κ³Ό ν‘œν˜„μ‹μ˜ κ²½μš°, ${args[0]}, ${x+y}처럼 μ•žλ’€λ‘œ μ€‘κ΄„ν˜Έλ₯Ό λΆ™μΈλ‹€.
  - $λ₯Ό μΌλ°˜ λ¬Έμžμ²˜λŸΌ λ§Œλ“€κ³  μ‹Άλ‹€λ©΄ \을 λΆ™μ—¬μ£Όλ©΄ λœλ‹€.
   

- λ°°μ—΄μ€ Array ν΄λž˜μŠ€λ‘œ μ •μ˜λ˜μ–΄ μžˆμœΌλ©°, μ œλ„€λ¦­μ„ μ‚¬μš©ν•΄μ„œ λ‚˜νƒ€λ‚Ό μˆ˜ μžˆλ‹€.
  - arrayOf()λ₯Ό μ‚¬μš©ν•΄μ„œ κ°„λ‹¨ν•˜κ²Œ λ°°μ—΄μ„ μƒμ„±ν•  μˆ˜ μžˆλ‹€. μ΄λ•Œ, μ΄ˆκΈ°κ°’을 κΈ°μ€€μœΌλ‘œ ν•΄λ‹Ή λ°°μ—΄μ˜ νƒ€μž…을 μ»΄νŒŒμΌλŸ¬κ°€ μΆ”λ‘ ν•  μˆ˜ μžˆλ‹€.
    - arrayOfNulls()λ₯Ό ν™œμš©ν•˜λ©΄ null을 ν—ˆμš©ν•˜λ„둝 λ§Œλ“€ μˆ˜ μžˆλ‹€.
  - ν˜Ήμ€ μƒμ„±μžμ˜ λžŒλ‹€μ‹μ„ ν™œμš©ν•˜μ—¬ μž‘μ„±ν•  μˆ˜ μžˆλ‹€

 val a = Array<String>(2, {i -> {i * i.toString()}) // λ‚΄λΆ€μ˜ κ΄„ν˜ΈλŠ” 제거 κ°€λŠ₯ν•˜λ‹€.

 

- λ˜ν•œ, λ°°μ—΄ λ‚΄λΆ€μ μœΌλ‘œλŠ” ν•΄λ‹Ή νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ €μž₯ν•˜κΈ° λ•Œλ¬Έμ—, μš”μ†Œ κ°œμˆ˜κ°€ λ§ŽμœΌλ©΄ λ©”λͺ¨λ¦¬ λ‚­λΉ„κ°€ λ°œμƒν•  μˆ˜λ„ μžˆλ‹€.
  - κ·Έλž˜μ„œ, κΈ°λ³Έ νƒ€μž…μ˜ μš”μ†Œλ₯Ό μ €μž₯ν•˜λŠ” λ°°μ—΄μ„ λ³„λ„μ˜ ν΄λž˜μŠ€λ‘œ κ°€μ§€κ³  μžˆλ‹€. (ex. IntArray, ByteArray...)
  - μ»΄νŒŒμΌλŸ¬κ°€ JVM의 κΈ°λ³Έ νƒ€μž… λ°°μ—΄λ‘œ λ³€ν™˜ν•΄μ£ΌκΈ° λ•Œλ¬Έμ—, λΆˆν•„μš”ν•œ κ°μ²΄ μƒμ„±μ„ λ§‰μ„ μˆ˜ μžˆλ‹€.

 

- λ‹€μ°¨μ› λ°°μ—΄μ€ μ΄λŸ° μ‹μœΌλ‘œ μƒμ„±ν•  μˆ˜ μžˆλ‹€. (arrayOf μ‚¬μš©ν•΄λ„ λœλ‹€.)

val intArr = Array(2) {Array(3, {i -> 0})}


- λ‹€μ°¨μ› λ°°μ—΄μ˜ μš”μ†Œ νƒμƒ‰μ€ λ‹€μŒκ³Ό κ°™μ΄ λ°˜λ³΅λ¬Έμ„ λŒλ©° μ§„ν–‰ν•  μˆ˜ μžˆλ‹€.

for (x in 0.. row-1) {
    for (y in 0..col - 1) {
    	...
    }
}


- μ½”ν‹€λ¦°μ˜ κΈ°λ³Έ ν΄λž˜μŠ€λŠ” κΈ°λ³Έμ μœΌλ‘œ AnyλΌλŠ” μ΄λ¦„μ˜ μŠˆνΌ ν΄λž˜μŠ€λ₯Ό μƒμ†λ°›κ²Œ λ˜μ–΄ μžˆλ‹€.
  - λ³€μˆ˜ νƒ€μž…을 Any둜 μ§€μ •ν•˜λ©΄ null이 μ•„λ‹Œ μ–΄λ–€ κ°’도 μ €μž₯ν•  μˆ˜ μžˆμœΌλ©°, μ–΄λ–€ κ°μ²΄λ„ μ°Έμ‘°ν•  μˆ˜ μžˆλ‹€.

- λ‚΄λΆ€μ μœΌλ‘œ μ—°μ‚°μžλ₯Ό μ˜€λ²„λ‘œλ”©ν•œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ„œ μ—°μ‚°μ„ μ²˜λ¦¬ν•œλ‹€.
  - a + bλ₯Ό μ²˜λ¦¬ν•œλ‹€λ©΄, λ‚΄λΆ€μ μœΌλ‘œ a.plus(b)λ₯Ό μˆ˜ν–‰ν•˜λ„둝 λ³€ν™˜ν•œλ‹€.
  - κ·Έλž˜μ„œ μ»€μŠ€ν…€ κ°μ²΄μ˜ λ§μ…ˆμ„ μ§„ν–‰ν•  λ•ŒλŠ” plus λ©”μ„œλ“œλ₯Ό μ˜€λ²„라이딩해주면 λœλ‹€.

- λ˜ν•œ, μ»¬λ ‰μ…˜μ„ μ‚¬μš©ν•  λ•ŒλŠ” in μ—°μ‚°μžλ₯Ό ν†΅ν•΄ λ‚΄λΆ€ μ›μ†Œλ“€μ„ μ‰½κ²Œ μ ‘κ·Όν•  μˆ˜ μžˆλ‹€.

a in b


- if-else λŒ€μ‹ μ— when을 μ‚¬μš©ν•΄μ„œ μ‘°κ±΄μ‹μ„ μ²˜λ¦¬ν•  μˆ˜λ„ μžˆλ‹€.
  - when절 λ‚΄λΆ€μ—μ„œλŠ” κ°’ -> μ‹€ν–‰ μ½”λ“œ λΈ”λ‘μ˜ ν˜•νƒœλ‘œ μž‘μ„±ν•œλ‹€.

when(option) {
    1 -> println("1")
    2 -> println("2")
    else -> {
        println("other")	
    }
}

 



βœ”οΈ 데이터 클래슀

- λ°μ΄ν„° ν΄λž˜μŠ€λ₯Ό μ‚¬μš©ν•˜λ©΄ equals, hashCode, toString, copy κ°™μ€ ν•¨μˆ˜λ₯Ό μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ μƒμ„±ν•΄μ€€λ‹€.
- ν΄λž˜μŠ€ μ΄λ¦„ λ‹€μŒ, κ΄„ν˜Έ μ•ˆμ— λ°μ΄ν„° ν΄λž˜μŠ€μ˜ μ†μ„±μ„ μ •μ˜ν•΄μ€„ μˆ˜ μžˆλ‹€.

data class Crew (val a : String, val b : Int) {
  ...
}
Comments