ν‹°μŠ€ν† λ¦¬ λ·°

이 글은 udemy κ°•μ˜μ™€ Do it! κΉ‘μƒ˜μ˜ μ•ˆλ“œλ‘œμ΄λ“œ μ•± ν”„λ‘œκ·Έλž˜λ° with 코틀린을 μ°Έκ³ ν•˜μ—¬ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

- κ°œλ°œν™˜κ²½μ€ Windows, Android Studioμž…λ‹ˆλ‹€.

 

 


 

 

1. Public, Private, Protected and Internal Examples (μ ‘κ·Ό μ œν•œμž)


μœ„μ™€ 같은 것듀을 μ ‘κ·Ό μ œν•œμžλΌκ³  ν•œλ‹€.

μ ‘κ·Ό μ œν•œμž(visibility modifier)λž€ 클래슀의 멀버λ₯Ό μ™ΈλΆ€μ˜ μ–΄λŠ λ²”μœ„κΉŒμ§€ μ΄μš©ν•˜κ²Œ ν•  것인지λ₯Ό κ²°μ •ν•˜λŠ” ν‚€μ›Œλ“œμ΄λ‹€.

μ½”ν‹€λ¦°μ—μ„œλŠ” λ³€μˆ˜λ‚˜ ν•¨μˆ˜λ₯Ό 클래슀둜 묢지 μ•Šκ³  μ†ŒμŠ€νŒŒμΌμ˜ μ΅œμƒμœ„μ— μ„ μ–Έν•  수 있고, 이 λ˜ν•œ μ ‘κ·Ό μ œν•œμžλ‘œ λ²”μœ„λ₯Ό μ œν•œν•  수 μžˆλ‹€.

 

μ ‘κ·Όμ œν•œμž μ΅œμƒμœ„μ—μ„œ 이용 클래슀 λ©€λ²„μ—μ„œ 이용
public λͺ¨λ“  νŒŒμΌμ—μ„œ κ°€λŠ₯ λͺ¨λ“  ν΄λž˜μŠ€μ—μ„œ κ°€λŠ₯
internal 같은 λͺ¨λ“ˆ λ‚΄μ—μ„œ κ°€λŠ₯ 같은 λͺ¨λ“ˆ λ‚΄μ—μ„œ κ°€λŠ₯
protected X 상속 κ΄€κ³„μ˜ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œλ§Œ κ°€λŠ₯
private 파일 λ‚΄λΆ€μ—μ„œλ§Œ 이용 클래슀 λ‚΄λΆ€μ—μ„œλ§Œ 이용
  • public : μ ‘κ·Όμ œν•œμ—†μŒ. μ ‘κ·Ό μ œν•œμž μƒλž΅ μ‹œ μžλ™μœΌλ‘œ public
  • internal : 같은 λͺ¨λ“ˆ λ‚΄ μ ‘κ·Ό. (λͺ¨λ“ˆ = Gradle같은 λΉŒλ“œ λ„κ΅¬μ—μ„œ ν”„λ‘œμ νŠΈ or 같은 μ„ΈνŠΈ λ‹¨μœ„)
  • protected : 클래슀 λ‚΄λΆ€μ—μ„œλ§Œ μ„ μ–Έ κ°€λŠ₯
  • private : λ‚΄λΆ€λ‘œλ§Œ μ œν•œ

 

 

 

2. Kotlin Constructors (μƒμ„±μž)


  • 클래슀의 멀버 : μƒμ„±μž, λ³€μˆ˜, ν•¨μˆ˜, 클래슀
  • μƒμ„±μž : μ£Ό μƒμ„±μž, 보쑰 μƒμ„±μžλ‘œ λ‚˜λ‰¨

 

βœ… μ£Ό μƒμ„±μž

  • μ£Ό μƒμ„±μž μ„ μ–Έ
    // μ£Ό μƒμ„±μž μ„ μ–Έ
    class User constructor() {
    }
    
    // constructor ν‚€μ›Œλ“œ μƒλž΅ κ°€λŠ₯
    class User() {
    }
    
    // μ£Ό μƒμ„±μž μƒλž΅ μ‹œ μ»΄νŒŒμΌλŸ¬κ°€ λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” μ£Ό μƒμ„±μž μžλ™ μΆ”κ°€
    class User {
    }
    
    // μ£Ό μƒμ„±μž λ§€κ°œλ³€μˆ˜
    class User(name: String, count: Int) {
    }

 

  • μƒμ„±μž 호좜
    객체 μƒμ„± μ‹œ λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…κ³Ό κ°œμˆ˜μ— λ§žλŠ” μΈμž μ „달!
    val user = User("nkim", 10)​

 

  • init μ˜μ—­
    • μƒμ„±μžμ—λŠ” { }λ₯Ό μΆ”κ°€ν•  수 μ—†λ‹€. 이 λ•Œ init을 μ΄μš©ν•΄ μ£Ό μƒμ„±μžμ˜ 본문을 κ΅¬ν˜„ν•  수 μžˆλ‹€.
    • init으둜 μ§€μ •ν•œ μ˜μ—­μ€ 객체 생성 μ‹œ μžλ™ 싀행됨
    • κΌ­ μ„ μ–Έν•  ν•„μš”λŠ” μ—†μŒ! μ£Ό μƒμ„±μžμ˜ 본문을 κ΅¬ν˜„ν•˜κ³  싢을 λ•Œ μ‚¬μš©
    • 보쑰 μƒμ„±μžμ—μ„œλ„ μ‹€ν–‰λ˜μ§€λ§Œ 보쑰 μƒμ„±μžλŠ” 클래슀 μ•ˆμ— μ„ μ–Έν•˜λ―€λ‘œ { }λ₯Ό μ΄μš©ν•΄ λ³Έλ¬Έ 지정 κ°€λŠ₯.
      즉, init μ˜μ—­μ€ 주둜 μ£Ό μƒμ„±μž λ³Έλ¬Έ κ΅¬ν˜„ μš©λ„λ‘œ μ‚¬μš©λ¨
    • 예제
      class User(name: String, count: Int){
          init {
              println("i am init!")
          }
      }
      
      fun main() {
          val user = User("nkim", 10)
      }​
    • 좜λ ₯
      i am init!​

 

βœ… 보쑰 μƒμ„±μž

  • 보쑰 μƒμ„±μž μ„ μ–Έ
    class User {
        constructor(name: String){
        	println("1")
        }
        constructor(name: String, count: Int){
        	println("2")
        }
    }
    
    fun main() {
        val user1 = User("nkim")
        val user2 = User("nkim", 10)
    }​​
  • 좜λ ₯
    1
    2​

 

βœ… λ³΄μ‘°μƒμ„±μžμ— μ£Όμƒμ„±μž μ—°κ²° πŸ‘‰πŸ» this() 이용

λ‘˜ 쀑 ν•˜λ‚˜λ§Œ ν•  κ²½μš°μ—λŠ” λ¬Έμ œκ°€ μ—†λ‹€. λ§Œμ•½ 보쑰/μ£Ό μƒμ„±μž λ‘˜ λ‹€ μ„ μ–Έ μ‹œ λ°˜λ“œμ‹œ μƒμ„±μžλΌλ¦¬ μ—°κ²°ν•΄μ€˜μ•Όν•¨!

class User(name: String) {
    constructor(name: String, count: Int): this(name){
    	// μƒλž΅
    }
}

fun main() {
    val user = User("nkim", 10)
}​​
  • 보쑰 μƒμ„±μž 선언뢀에 this(name)을 μΆ”κ°€ν•˜λ©΄, 보쑰 μƒμ„±μžλ‘œ 객체 생성 μ‹œ μ£Ό μƒμ„±μžκ°€ ν•¨κ»˜ 호좜됨
  • μ£Ό μƒμ„±μž μžˆλŠ” μƒνƒœμ—μ„œ 보쑰 μƒμ„±μž μ—¬λŸ¬κ°œ μ„ μ–Έ μ‹œ this λͺ¨λ‘ μ‚¬μš©ν•˜κΈ°

 

βœ… μ£Ό μƒμ„±μž VS 보쑰 μƒμ„±μžλ₯Ό μ™œ κ΅¬λΆ„ν•˜λ‚˜μš”?

λ‘˜ 쀑 뭘둜 λ§Œλ“€λ˜ 개발자 마음!!

κ³΅ν†΅λœ μ½”λ“œλŠ” μ£Ό μƒμ„±μžμ—. λ‚˜λ¨Έμ§€λŠ” 보쑰 μƒμ„±μžμ—~

 

 

 

3. Kotlin Inheritance (상속)


βœ… μƒμ†κ³Ό μƒμ„±μž

  • 상속 : 클래슀 μ„ μ–Έ μ‹œ λ‹€λ₯Έ 클래슀λ₯Ό μ°Έμ‘°ν•΄μ„œ μ„ μ–Έν•˜λŠ” 것. κΈ°μ‘΄ 클래슀 μž¬μ‚¬μš© κ°€λŠ₯
  • 클래슀 상속 ν˜•μ‹
    open class Super { // open ν‚€μ›Œλ“œλ‘œ 상속 κ°€λŠ₯ν•˜κ²Œ ν—ˆμš©
    }
    class Sub: Super() { // Super을 상속받아 Sub 클래슀 μ„ μ–Έ
    }
  • μƒμœ„ 클래슀 μƒμ„±μž 호좜
    • ν•˜μœ„ 클래슀의 μƒμ„±μžλŠ” μƒμœ„ 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•΄μ•Όν•¨
    • λ§€κ°œλ³€μˆ˜ μ—†λŠ” μƒμœ„ 클래슀 상속
      • class Sub: Super() { } μ—μ„œ Super()은 Super 클래슀λ₯Ό μƒμ†λ°›μŒ + 이 클래슀의 λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” μƒμ„±μž 호좜
    • λ§€κ°œλ³€μˆ˜ μžˆλŠ” μƒμœ„ 클래슀 상속
      • λ§€κ°œλ³€μˆ˜ ꡬ성에 맞게 인자 전달
      • open class Super(name: String) {
        }
        class Sub(name: String): Super(name) {
        }

 

βœ… Overriding (μž¬μ •μ˜)

  • μƒμœ„ ν΄λž˜μŠ€μ— μ •μ˜λœ 멀버(ν•¨μˆ˜, λ³€μˆ˜)λ₯Ό ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜
  • 즉, μƒμœ„ ν΄λž˜μŠ€μ— μ„ μ–Έλœ λ³€μˆ˜λ‚˜ ν•¨μˆ˜λ₯Ό κ°™μ€ μ΄λ¦„μœΌλ‘œ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ λ‹€μ‹œ μ„ μ–Έ
  • 주둜 ν•¨μˆ˜ μž¬μ •μ˜μ— μ‚¬μš©
  • 같은 ν•¨μˆ˜λͺ…μœΌλ‘œ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μƒˆλ‘œμš΄ λ‘œμ§μ„ μΆ”κ°€ν•˜κ³  싢을 λ•Œ μ‚¬μš©
  • κ·œμΉ™
    • μƒμœ„ 클래슀 : overriding ν—ˆμš©ν•  λ³€μˆ˜λ‚˜ ν•¨μˆ˜ μ„ μ–Έ μ•žμ— open ν‚€μ›Œλ“œ μΆ”κ°€
    • ν•˜μœ„ 클래슀 : μž¬μ •μ˜ ν•  λ³€μˆ˜λ‚˜ ν•¨μˆ˜ μ„ μ–Έ μ•žμ— override ν‚€μ›Œλ“œ μΆ”κ°€

 

 

 

4. Kotlin Polymorphism and Abstraction (λ‹€ν˜•μ„±κ³Ό 좔상화)


βœ… λ‹€ν˜•μ„±

  • 이름은 κ°™μ§€λ§Œ λ§€κ°œλ³€μˆ˜κ°€ λ‹€λ₯΄κ±°λ‚˜ λ‹€λ₯Έ λ™μž‘μ„ ν•˜λ„λ‘ ν•˜λŠ” 것
  • μ΄ν•΄ν•˜κΈ° 쉽고 λ³€κ²½ν•˜κΈ° μ‰¬μš΄ μ½”λ“œ μž‘μ„± κ°€λŠ₯

 

βœ… Overloading VS Overriding

 

[Kotlin] 클래슀 5β€Š—β€Šλ‹€ν˜•μ„±(polymorphism)

Kotlin μ–Έμ–΄λ‘œ overloadingκ³Ό overriding 그리고 binding κ°œλ…μ„ 거쳐 λ‹€ν˜•μ„±μ— λŒ€ν•œ κ°œλ…μ„ λ‹€λ£Ήλ‹ˆλ‹€.

medium.com

 

βœ… μΆ”상 클래슀

  • 아직 κ΅¬ν˜„λ˜μ§€ μ•Šκ³  μ„ μ–Έλ§Œ 된 좔상 λ©”μ„œλ“œλ₯Ό 가지고 μžˆλŠ” 클래슀
  • 좔상 ν΄λž˜μŠ€λŠ” λ©”μ„œλ“œκ°€ κ΅¬ν˜„λ˜μ§€ μ•Šμ•„μ„œ 이 클래슀λ₯Ό μ§μ ‘ 객체둜 λ§Œλ“€ 수 μ—†κ³  λ°˜λ“œμ‹œ 상속을 λ°›λŠ” μžμ‹ ν΄λž˜μŠ€κ°€ μžˆμ–΄μ•Όν•¨
  • 좔상 λ©”μ„œλ“œλŠ” μ„œλΈŒν΄λž˜μŠ€μ—μ„œ λ°˜λ“œμ‹œ override ν•΄μ„œ μ‚¬μš©
  • abstract ν‚€μ›Œλ“œ μ‚¬μš© μ‹œ ν΄λž˜μŠ€λ‚˜ ν•¨μˆ˜μ— open ν‚€μ›Œλ“œ λ”°λ‘œ λͺ…μ‹œν•˜μ§€ μ•Šμ•„λ„ 됨
  • 닀쀑 상속 λΆˆκ°€
  • μΈν„°νŽ˜μ΄μŠ€μ™€ 클래슀의 쀑간
  • 좔상 ν΄λž˜μŠ€λŠ” 객체 생성 λΆˆκ°€, μƒμ„±μž κ°€μ§ˆ 수 있음
  • 좔상 클래슀 μ •μ˜
    fun main(args : Array<String>) {
        var tempClass : AbstractClass = SubClass()
        tempClass.generalMethod()
        tempClass.abstractMethod()
    }
     
    open abstract class AbstractClass {
        //μžμ‹ ν΄λž˜μŠ€μ—μ„œ κ·Έλƒ₯ μ‚¬μš©ν•  수 μžˆλŠ” 일반 λ©”μ„œλ“œ
        fun generalMethod () {
            println("일반 λ©”μ„œλ“œ")
        }
     
        //μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”© ν•΄μ•Ό μ‚¬μš©ν• μˆ˜ μžˆλŠ” 좔상 λ©”μ„œλ“œ
        open abstract fun abstractMethod()
    }
     
    class SubClass : AbstractClass() {
        override fun abstractMethod() {
            println("좔상 λ©”μ„œλ“œ κ΅¬ν˜„")
        }
    }​
  • κ²°κ³Ό
    일반 λ©”μ„œλ“œ
    좔상 λ©”μ„œλ“œ κ΅¬ν˜„β€‹

 

 

 

λŒ“κΈ€