[Kotlin ๊ธฐ์ดˆ] ์ฝ”ํ‹€๋ฆฐ ๊ธฐ๋ณธ ๋ฌธ๋ฒ• - ํด๋ž˜์Šค์™€ ์„ค๊ณ„
๋ฐ˜์‘ํ˜•

 

 

 

 

7 ํด๋ž˜์Šค์™€ ์„ค๊ณ„

 

  • ํด๋ž˜์Šค: ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์˜ ๋ชจ์Œ
  • ๊ทธ๋ฃนํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์™€ ๋ณ€์ˆ˜๋ฅผ ํ•œ๊ตฐ๋ฐ์— ๋ชจ์•„ ๋†“๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์ด๋ฆ„์„ ๋ถ™์—ฌ๋†“์€ ๊ฒƒ
  • ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Object-Oriented Programming)์—์„œ ์ค‘์š”ํ•œ ๊ฐœ๋…, ๋ถ•์–ด๋นต ํ‹€

 


 

ํด๋ž˜์Šค์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ

class ํด๋ž˜์Šค๋ช… {
    var ๋ณ€์ˆ˜
    fun ํ•จ์ˆ˜() {
        // ์ฝ”๋“œ
    }


class String{
    var length: Int
    fun plus(other: Any){
        // code
    }
    fun compareTo(other: String){
        // code
    }
}
  • ์œ„ ์˜ˆ์ œ์—์„œ length ๋ณ€์ˆ˜๋กœ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ณ , plus ํ•จ์ˆ˜๋Š” ๋ฌธ์ž์—ด์„ ์ด์–ด๋ถ™์ผ ์ˆ˜ ์žˆ์Œ
  • compareTo๋Š” ๋ฌธ์ž์—ด์„ ๋น„๊ตํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณต

 

 

 

ํด๋ž˜์Šค์™€ ํ•จ์ˆ˜์˜ ์ฐจ์ด์ 

  • ๊ตฌ์กฐํ™” ๋ฐ ์บก์Šํ™”
    - ํด๋ž˜์Šค: ๋ฐ์ดํ„ฐ+๋ฉ”์„œ๋“œ๋ฅผ ๋ฌถ์–ด ์บก์Šํ™”. ๋ฐ์ดํ„ฐ์™€ ๊ธฐ๋Šฅ์„ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๋ฐ ๋„์›€
    - ํ•จ์ˆ˜: ๋‹จ๋…์œผ๋กœ ์กด์žฌํ•˜๋ฉฐ ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์ง‘์ค‘
  • ์žฌ์‚ฌ์šฉ์„ฑ
    ํด๋ž˜์Šค: ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์•„์ง. ๋™์ผํ•œ ํŠน์„ฑ๊ณผ ๋™์ž‘์„ ๊ฐ€์ง„ ์—ฌ๋Ÿฌ ๊ฐ์ฒด ์‰ฝ๊ฒŒ ์ƒ์„ฑ
    ํ•จ์ˆ˜: ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์ง€๋งŒ, ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์™€ ๊ด€๋ จ๋œ ์žฌ์‚ฌ์šฉ์„ฑ์€ ์—†์Œ
  • ์ถ”์ƒํ™”
    ํด๋ž˜์Šค: ํ˜„์‹ค ์„ธ๊ณ„์˜ ๊ฐœ์ฒด๋ฅผ ๋ชจ๋ธ๋งํ•˜์—ฌ ์ถ”์ƒํ™”ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ (์˜ˆ: '์ž๋™์ฐจ' ํด๋ž˜์Šค๋Š” ์‹ค์ œ์˜ ๋‹ค์–‘ํ•œ ํŠน์„ฑ๊ณผ ๋™์ž‘ ๋ชจ๋ธ๋ง)
    ํ•จ์ˆ˜: ์ถ”์ƒํ™” ์ˆ˜์ค€์ด ๋” ๋‚ฎ์œผ๋ฉฐ, ์ฃผ๋กœ ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์ดˆ์ 
  • ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ, ํ•จ์ˆ˜๋Š” ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ ์กฐ๊ฐ
    ํด๋ž˜์Šค๋Š” ๋ฐ์ดํ„ฐ์™€ ๋™์ž‘์„ ํ•จ๊ป˜ ๋ฌถ์–ด์„œ ์ถ”์ƒํ™”ํ•˜๊ณ , ํ•จ์ˆ˜๋Š” ๋‹จ์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰

 

 

 

ํด๋ž˜์Šค ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ

class ํด๋ž˜์Šค์ด๋ฆ„ {
    // ํด๋ž˜์Šค ์Šค์ฝ”ํ”„ (class scope)
}
  • ์ค‘๊ด„ํ˜ธ { }๋Š” ์Šค์ฝ”ํ”„(Scope)๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ, ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ž˜์Šค ์Šค์ฝ”ํ”„๋ผ๊ณ  ํ•จ
  • ๋ช‡๋ช‡ ์˜ˆ์™ธ๋ฅผ ์ œ์™ธํ•˜๊ณ , ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” ํด๋ž˜์Šค ์Šค์ฝ”ํ”„ ์•ˆ์— ์ž‘์„ฑ
  • ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ƒ์„ฑ์ž๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ,
    Kotlin์€ ํ”„๋ผ์ด๋จธ๋ฆฌ(Primary)์™€ ์„ธ์ปจ๋”๋ฆฌ(Secondary) 2๊ฐœ์˜ ์ƒ์„ฑ์ž๋ฅผ ์ œ๊ณต
  • ์ƒ์„ฑ์ž: ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค(๊ฐ์ฒด)๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ํŠน์ˆ˜ํ•œ ํ•จ์ˆ˜

 

 

ํ”„๋ผ์ด๋จธ๋ฆฌ ์ƒ์„ฑ์ž (Primary Constructor)

class Person ํ”„๋ผ์ด๋จธ๋ฆฌ ์ƒ์„ฑ์ž() {
}

class Person constructor(value: String){
    // code
}
  • ํ”„๋ผ๋ฏธ๋จธ๋ฆฌ ์ƒ์„ฑ์ž๋Š” ๋งˆ์น˜ ํด๋ž˜์Šค์˜ ํ—ค๋”์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ํ”„๋ผ์ด๋จธ๋ฆฌ ์ƒ์„ฑ์ž๋Š” constructor ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ •์˜ํ•˜๋Š”๋ฐ ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ƒ๋žต ๊ฐ€๋Šฅ
  • ํ”„๋ผ์ด๋จธ๋ฆฌ ์ƒ์„ฑ์ž๋„ ๊ฒฐ๊ตญ์€ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

 

class Person(value: String){
    // code
}
  • ์ƒ์„ฑ์ž์— ์ ‘๊ทผ ์ œํ•œ์ž๋‚˜ ๋‹ค๋ฅธ ์˜ต์…˜์ด ์—†๋‹ค๋ฉด constructor ํ‚ค์›Œ๋“œ๋ฅผ ์ƒ๋žต ๊ฐ€๋Šฅ

 

class Person(value: String){
    init{
        Log.d("class", "์ƒ์„ฑ์ž๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์€ ${value}์ž…๋‹ˆ๋‹ค.")
    }
}
  • ํ”„๋ผ์ด๋จธ๋ฆฌ ์ƒ์„ฑ์ž๋Š” ๋งˆ์น˜ ํ—ค๋”์ฒ˜๋Ÿผ class ํ‚ค์›Œ๋“œ์™€ ๊ฐ™์€ ์œ„์น˜์— ์ž‘์„ฑ
  • ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด init ๋ธ”๋ก์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ณ , 
    init ๋ธ”๋ก์—์„œ๋Š” ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๋„˜์–ด์˜จ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ

 

class Person(val value: String) {
    fun process() {
        print(value)
    }
}
  • init ์ดˆ๊ธฐํ™” ์ž‘์—…์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋ฉด init ๋ธ”๋ก์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋จ
  • ๋Œ€์‹  ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ์•ž์— ๋ณ€์ˆ˜ ํ‚ค์›Œ๋“œ์ธ val์„ ๋ถ™์—ฌ์ฃผ๋ฉด ํด๋ž˜์Šค ์Šค์ฝ”ํ”„ ์ „์ฒด์—์„œ ํ•ด๋‹น ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ์ƒ์„ฑ์ž ํŒŒ๋ผ๋ฏธํ„ฐ ์•ž์— var๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ฝ๊ธฐ ์ „์šฉ์ธ val์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ

 

 

 

์„ธ์ปจ๋”๋ฆฌ ์ƒ์„ฑ์ž (Secondary Constructor)

class Person {
    constructor (value: string) {
        Log.d("class", "์ƒ์„ฑ์ž๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์€ ${value}์ž…๋‹ˆ๋‹ค.")
    }
}
  • ์„ธ์ปจ๋”๋ฆฌ ์ƒ์„ฑ์ž๋Š” constructor ํ‚ค์›Œ๋“œ๋ฅผ ๋งˆ์น˜ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ํด๋ž˜์Šค ์Šค์ฝ”ํ”„ ์•ˆ์— ์ง์ ‘ ์ž‘์„ฑ ๊ฐ€๋Šฅ
  • init ๋ธ”๋ก์„ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  constructor ๋‹ค์Œ์— ๊ด„ํ˜ธ๋ฅผ ๋ถ™์—ฌ์„œ ์ฝ”๋“œ ์ž‘์„ฑ ๊ฐ€๋Šฅ

 

class Kotlin {
    constructor (value: String){
        Log.d("class", "์ƒ์„ฑ์ž๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์€ ${value}์ž…๋‹ˆ๋‹ค.")        
    }
    constructor (value: Int){
        Log.d("class", "์ƒ์„ฑ์ž๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์€ ${value}์ž…๋‹ˆ๋‹ค.")        
    }
    constructor (value1: Int, value2: String){
        Log.d("class", "์ƒ์„ฑ์ž๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ๊ฐ’์€ ${value1}, ${value2}์ž…๋‹ˆ๋‹ค.")        
    }
}
  • ์„ธ์ปจ๋”๋ฆฌ ์ƒ์„ฑ์ž๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ๊ฐœ์ˆ˜, ๋˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํƒ€์ž…์ด ๋‹ค๋ฅด๋‹ค๋ฉด ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์ค‘๋ณตํ•ด์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ

 

 

 

Default ์ƒ์„ฑ์ž

class Student { // ์ƒ์„ฑ์ž๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    init {
        // ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ์—†๋”๋ผ๋„ ์ดˆ๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•˜๋ฉด ์—ฌ๊ธฐ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
    }
}
  • ์ƒ์„ฑ์ž๋Š” ์ž‘์„ฑํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—†๋Š” ํ”„๋ผ์ด๋จธ๋ฆฌ ์ƒ์„ฑ์ž๊ฐ€ ํ•˜๋‚˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ๋™์ผ

 

 


 

 

ํด๋ž˜์Šค์˜ ์‚ฌ์šฉ

ํด๋ž˜์Šค๋ช…()
  • ํด๋ž˜์Šค์˜ ์ด๋ฆ„์— ๊ด„ํ˜ธ๋ฅผ ๋ถ™์—ฌ์„œ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ
  • constructor ํ‚ค์›Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€๋Š” ์•Š์Œ
  • ์•„๋ฌด๋Ÿฐ ํŒŒ๋ผ๋ฏธํ„ฐ ์—†์ด ํด๋ž˜์Šค๋ช…์— ๊ด„ํ˜ธ๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด์„œ init ๋ธ”๋ก ์•ˆ์˜ ์ฝ”๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ์‹คํ–‰
  • ์„ธ์ปจ๋”๋ฆฌ ์ƒ์„ฑ์ž์˜ ๊ฒฝ์šฐ init ๋ธ”๋ก์ด ๋จผ์ € ์‹คํ–‰๋˜๊ณ , constructor ๋ธ”๋ก ์•ˆ์˜ ์ฝ”๋“œ๊ฐ€ ๊ทธ๋‹ค์Œ ์‹คํ–‰

 

var kotlin = Kotlin()

๋ถ•์–ด๋นตํ‹€ = ํด๋ž˜์Šค, ๊ณ„์† ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ถ•์–ด๋นต = ์ธ์Šคํ„ด์Šค
var one = Person("value")
// ๋˜๋Š”
var two = Person(1004)
  • ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•œ ํ›„ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ์ธ์Šคํ„ด์Šค(Instance)๋ผ๊ณ  ํ•จ
  • ํด๋ž˜์Šค๊ฐ€ ๋ถ•์–ด๋นตํ‹€์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด, ์ธ์Šคํ„ด์Šค๋Š” ๋ถ•์–ด๋นต์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋จ
  • ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋Š” ๋ณ€์ˆ˜์— ๋‹ด์•„๋‘˜ ์ˆ˜ ์žˆ์Œ
  • ์ƒ์„ฑ์ž์— ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด ๊ฐ’์„ ์ž…๋ ฅํ•ด์„œ ํ˜ธ์ถœํ•ด์•ผ ํ•จ

 

๐Ÿ’ก ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ

class ํด๋ž˜์Šค๋ช… {
    var ๋ณ€์ˆ˜A    // ํ”„๋กœํผํ‹ฐ: ํ•จ์ˆ˜ ๋ฐ–
    fun ํ•จ์ˆ˜(){
        var ๋ณ€์ˆ˜B    // ๋ณ€์ˆ˜(๋˜๋Š” ์ง€์—ญ๋ณ€์ˆ˜): ํ•จ์ˆ˜ ์•ˆ
    }
}
  • ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์ •์˜๋˜๋Š” ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜, ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ผ๊ณ  ๋ถ€๋ฆ„
  • ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋Š” ํ”„๋กœํผํ‹ฐ(Property), ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋Š” ๋ฉ”์„œ๋“œ(Method)๋ผ๊ณ ๋„ ๋ถ€๋ฆ„
  • Cf. ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์ •์˜๋œ ๋ณ€์ˆ˜๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์•„๋‹Œ ๋ณ€์ˆ˜(์ง€์—ญ ๋ณ€์ˆ˜)

 

// ํ”„๋กœํผํ‹ฐ 1๊ฐœ์™€ ๋ฉ”์„œ๋“œ 1๊ฐœ๋ฅผ ๊ฐ–๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ
class Pig {
    var name: String = "Pinky"
    fun printName(){
        Log.d("class", "Pig์˜ ์ด๋ฆ„์€ ${name}์ž…๋‹ˆ๋‹ค.")
    }
}


//์ƒ์„ฑ์ž๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ธ์Šคํ„ด์Šคํ™”ํ•ด์„œ ๋ณ€์ˆ˜์— ๋‹ด๊ธฐ
var pig = Pig()


//์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹ด๊ธด ๋ณ€์ˆ˜๋ช… ๋‹ค์Œ์— ๋„ํŠธ ์—ฐ์‚ฐ์ž(.)๋ฅผ ๋ถ™์—ฌ์„œ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉ
pig.name = "Pooh"
pig.printName()
โ€‹
/** ์‹คํ–‰๊ฒฐ๊ณผ
Pig์˜ ์ด๋ฆ„์€ Pooh์ž…๋‹ˆ๋‹ค.
*/

 

 

ํด๋ž˜์Šค ์•ˆ์— ์ •์˜๋œ ํ•จ์ˆ˜์™€ ๋ณ€์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ

  • ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์‚ฌ์‹ค์ƒ ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์ •์˜๋œ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ
  • ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ๋‚ด๋ถ€์— ์ •์˜๋œ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ๋„ํŠธ ์—ฐ์‚ฐ์ž(.)๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ

 

 

 


 

 

์˜ค๋ธŒ์ ํŠธ(object)

 

object Pig{
    var name: String = "Pinky"
    fun printName() {
        Log.d("class", "Pig์˜ ์ด๋ฆ„์€ ${name}์ž…๋‹ˆ๋‹ค.")
    }
}

Pig.name = "Mikey"
Pig.printName()
  • ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํด๋ž˜์Šค ์ƒ์„ฑ์ž๋กœ ์ธ์Šคํ„ด์Šคํ™” ํ•˜์ง€ ์•Š์•„๋„ ๋ธ”๋ก ์•ˆ์˜ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • Java์˜ static๊ณผ ๊ฐ™์€ ์—ญํ• 
  • object ์ฝ”๋“œ ๋ธ”๋ก ์•ˆ์˜ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋Š” ํด๋ž˜์Šค๋ช…์— ๋„ํŠธ ์—ฐ์‚ฐ์ž๋ฅผ ๋ถ™์—ฌ์„œ ์ƒ์„ฑ์ž ์—†์ด ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Œ
  • ํด๋ž˜์Šค๋ช…์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ์ถœํ•˜๋Š” ํด๋ž˜์Šค๋ช…์˜ ์ฒซ ๊ธ€์ž๊ฐ€ ๋Œ€๋ฌธ์ž์ธ ๊ฒƒ์— ์œ ์˜
  • object๋Š” ํด๋ž˜์Šค์™€ ๋‹ค๋ฅด๊ฒŒ ์•ฑ ์ „์ฒด์— 1๊ฐœ๋งŒ ์ƒ์„ฑ

 

 

์ปดํŒจ๋‹ˆ์–ธ ์˜ค๋ธŒ์ ํŠธ (companion object)

class Pig {
    companion object {
        var name: String = "None"
        fun printName(){
            Log.d("class", "Pig์˜ ์ด๋ฆ„์€ ${name}์ž…๋‹ˆ๋‹ค.")
        }
    }
    fun walk() {
        Log.d("class", "Pig๊ฐ€ ๊ฑธ์–ด๊ฐ‘๋‹ˆ๋‹ค.")
    }
}

 

  • ์ผ๋ฐ˜ ํด๋ž˜์Šค์— object ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ
  • ์˜ˆ์‹œ์˜ Pig ์ฝ”๋“œ๋ฅผ companion object ๋ธ”๋ก์œผ๋กœ ๊ฐ์‹ธ์ฃผ๋ฉด ์ƒ์„ฑ ๊ณผ์ • ์—†์ด ์˜ค๋ธŒ์ ํŠธ์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์œ„ Pig๋Š” ํด๋ž˜์Šค๋กœ ์„ ์–ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜ ํ•จ์ˆ˜์ธ walk()๋Š” ์ƒ์„ฑ์ž์ธ Pig()๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ ๋ณ€์ˆ˜์— ์ €์žฅํ•œ ํ›„์— ์‚ฌ์šฉ ๊ฐ€๋Šฅ

 

// companion object ์•ˆ์˜ ์ฝ”๋“œ ์‚ฌ์šฉํ•˜๊ธฐ
Pig.name = "Linda"
Pig.printName()    // Pig์˜ ์ด๋ฆ„์€ Linda์ž…๋‹ˆ๋‹ค.


// companion object ๋ฐ–์˜ ์ฝ”๋“œ ์‚ฌ์šฉํ•˜๊ธฐ
val cutePig = Pig()
cutePig.walk()    // Pig๊ฐ€ ๊ฑธ์–ด๊ฐ‘๋‹ˆ๋‹ค.
  • Log ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ d(), e()๊ฐ€ ๋ชจ๋‘ object ์ฝ”๋“œ ๋ธ”๋ก ์•ˆ์— ๋งŒ๋“ค์–ด์ ธ ์žˆ์–ด์„œ, ์ƒ์„ฑ์ž ์—†์ด ๋ฐ”๋กœ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

 

 

 


 

 

 

๋ฐ์ดํ„ฐ ํด๋ž˜์Šค (data class)

data class ํด๋ž˜์Šค๋ช…(val ํŒŒ๋ผ๋ฏธํ„ฐ1: ํƒ€์ž…, var ํŒŒ๋ผ๋ฏธํ„ฐ2: ํƒ€์ž…)

// ์ •์˜ - ์ฃผ๋กœ ์ฝ”๋“œ ๋ธ”๋ก(ํด๋ž˜์Šค ์Šค์ฝ”ํ”„)์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑ
data class UserData(val name: String, var age: Int)

// ์ƒ์„ฑ - ์ผ๋ฐ˜ class์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผ
var userData = UserData("Michael", 21)
โ€‹
// name์€ val๋กœ ์„ ์–ธ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ
userData.name = "Sindy" // (X)

// age๋Š” var๋กœ ์„ ์–ธ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ
userData.age = 18 // (O)
  • Kotlin์€ ๊ฐ„๋‹จํ•œ ๊ฐ’์˜ ์ €์žฅ ์šฉ๋„๋กœ ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค(data class)๋ฅผ ์ œ๊ณต
  • ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ class ์•ž์— data ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ 
  • ์ƒ์„ฑ์ž ํŒŒ๋ผ๋ฏธํ„ฐ ์•ž์— ์ž…๋ ฅํ•˜๋Š” var(๋˜๋Š” val) ํ‚ค์›Œ๋“œ๋Š” ์ƒ๋žตํ•  ์ˆ˜ ์—†์Œ
  • ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ๋Š” ์ผ๋ฐ˜ ํด๋ž˜์Šค์™€ ๋™์ผํ•˜๊ฒŒ ์ž‘์„ฑ
  • ์ผ๋ฐ˜ ๋ณ€์ˆ˜ ์„ ์–ธ์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ val๋กœ ์ •์˜ํ•˜๋ฉด ์ฝ๊ธฐ ์ „์šฉ

 

 

 


toString() ๋ฉ”์„œ๋“œ์™€ copy() ๋ฉ”์„œ๋“œ

Log.d("DataClass", "DataUser๋Š” ${dataUser.toString()}")
// DataUser๋Š” DataUser(name=Michael, age=21)

var newData = dataUser.copy()
  • ์ผ๋ฐ˜ ํด๋ž˜์Šค์—์„œ toString() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ธ์Šคํ„ด์Šค์˜ ์ฃผ์†Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ,
    ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ ๊ฐ’์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ๋•Œ ์ข‹์Œ
  • copy() ๋ฉ”์„œ๋“œ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฐ’์„ ๋ณต์‚ฌ

 

 

 

์ผ๋ฐ˜ ํด๋ž˜์Šค์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๊ธฐ

data class UserData(var name: String, var age: Int){
    init{
        Log.d("UserData", "initialized")
    }
    fun process(){
        // ํด๋ž˜์Šค์™€ ๋™์ผํ•˜๊ฒŒ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ
    }
} // ํด๋ž˜์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด "initialized"๊ฐ€ ์ถœ๋ ฅ
  • ์ผ๋ฐ˜ ํด๋ž˜์Šค์™€ ๋™์ผํ•˜๊ฒŒ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด init ๋ธ”๋ก์ด ๋™์ž‘ํ•˜๊ณ  ๋ฉ”์„œ๋“œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์ด์ฒ˜๋Ÿผ ํด๋ž˜์Šค์™€ ์‚ฌ์šฉ๋ฒ•์ด ๋™์ผํ•˜์ง€๋งŒ ์ฃผ๋กœ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ฑฐ๋‚˜, ํ˜น์€ ๋กœ์ปฌ ์•ฑ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค

 

 


 

 

 

ํด๋ž˜์Šค์˜ ์ƒ์†๊ณผ ํ™•์žฅ

 

class Activity {
    fun drawText()
    fun draw()
    fun showWindow()
    // ...
}
โ€‹
class MainActivity: Activity() {
    fun onCreate(){
        draw("์ƒˆ ๊ทธ๋ฆผ")    // ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ ๊ธฐ๋Šฅ(draw)์„ ํ˜ธ์ถœ๋งŒ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
    }
}

 

๐Ÿ’ก ์ƒ์†์ด๋ž€?

  • ๋„ํŠธ ์—ฐ์‚ฐ์ž(.)๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ์™€ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํด๋ž˜์Šค์˜ ์ž์›์„ ์‚ฌ์šฉํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•
  • ์ƒ์†์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ์™€ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋งˆ์น˜ ๋‚ด ํด๋ž˜์Šค์˜ ์ผ๋ถ€์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

 

๐Ÿ’ก์ƒ์†์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

  • ์•ˆ๋“œ๋กœ์ด๋“œ์—๋Š” Activity๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ ธ ์žˆ์œผ๋ฉฐ, ์ด Activity ํด๋ž˜์Šค ๋‚ด๋ถ€์—๋Š” ๊ธ€์ž๋ฅผ ์“ฐ๋Š” ๊ธฐ๋Šฅ, ๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๋Š” ๊ธฐ๋Šฅ, ํ™”๋ฉด์— ์ƒˆ๋กœ์šด ์ฐฝ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ๋ฏธ๋ฆฌ ์ •์˜๋˜์–ด ์žˆ์Œ
  • ์ƒ์†์ด ์žˆ๊ธฐ์— ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๊ณ  Activity ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ์•ฑ์˜ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ
  • ์ฝ”๋“œ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ทœ๋ชจ๊ฐ€ ํฐ ํ”„๋กœ์ ํŠธ๋„ ํšจ๊ณผ์ ์œผ๋กœ ์„ค๊ณ„

 

 

 

ํด๋ž˜์Šค์˜ ์ƒ์†

open class ์ƒ์†๋  ๋ถ€๋ชจ ํด๋ž˜์Šค {
    // ์ฝ”๋“œ
}
โ€‹
class ์ž์‹ ํด๋ž˜์Šค: ๋ถ€๋ชจ ํด๋ž˜์Šค() {
    // ์ฝ”๋“œ
}
  • ์ƒ์† ๋Œ€์ƒ์ด ๋˜๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค๋Š” open ํ‚ค์›Œ๋“œ๋กœ ๋งŒ๋“ค์–ด์•ผ๋งŒ ์ž์‹ ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
  • ๋งŒ์•ฝ open ํ‚ค์›Œ๋“œ๋กœ ์—ด๋ ค ์žˆ์ง€ ์•Š์œผ๋ฉด ์ƒ์†ํ•  ์ˆ˜ ์—†์Œ (์ฝ”ํ‹€๋ฆฐ์—์„œ ํด๋ž˜์Šค๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 'final' - ์ƒ์† ๋ถˆ๊ฐ€)
  • ์ƒ์†์„ ๋ฐ›์„ ์ž์‹ ํด๋ž˜์Šค์—์„œ๋Š” ์ฝœ๋ก (:)์„ ์ด์šฉํ•ด์„œ ์ƒ์†ํ•  ๋ถ€๋ชจ ํด๋ž˜์Šค๋ฅผ ์ง€์ •
  • ์ƒ์†์€ ๋ถ€๋ชจ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ž์‹์ด ๊ฐ–๋Š” ๊ณผ์ •์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ผญ ๋ถ€๋ชจ ํด๋ž˜์Šค๋ช… ๋‹ค์Œ์— ๊ด„ํ˜ธ()๋ฅผ ์ž…๋ ฅํ•ด์„œ ๋ถ€๋ชจ์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•จ

 

 

 

์ƒ์„ฑ์ž ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋Š” ํด๋ž˜์Šค์˜ ์ƒ์†

open class ๋ถ€๋ชจ ํด๋ž˜์Šค(value: String) {
    // ์ฝ”๋“œ
}
โ€‹
class ์ž์‹ ํด๋ž˜์Šค(value: String): ๋ถ€๋ชจ ํด๋ž˜์Šค(value) {
    // ์ฝ”๋“œ
}



// ์•ˆ๋“œ๋กœ์ด๋“œ์˜ View ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ์˜ˆ์ œ
// ์ž์‹ ํด๋ž˜์Šค์— ์„ธ์ปจ๋”๋ฆฌ ์ƒ์„ฑ์ž๋งŒ ์žˆ์„ ๊ฒฝ์šฐ ์ƒ์†๋˜๋Š” ํด๋ž˜์Šค ์ด๋ฆ„ ๋‹ค์Œ์— ๊ด„ํ˜ธ๊ฐ€ ์ƒ๋žต
class CustomView: View {    // ๋ถ€๋ชจ ํด๋ž˜์Šค๋ช… ๋‹ค์Œ ๊ด„ํ˜ธ๋ฅผ ์ƒ๋žต
    constuctor(ctx: Context): super(ctx)
    constructor(ctx: Context, attrs: AttributeSet): super(ctx, attrs)
}
  • ์ƒ์†๋  ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž์— ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ž์‹ ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ๊ฐ’์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ
  • ๋ถ€๋ชจ ํด๋ž˜์Šค์— ์„ธ์ปจ๋”๋ฆฌ ์ƒ์„ฑ์ž๊ฐ€ ์žˆ๋‹ค๋ฉด, ์—ญ์‹œ ์ž์‹ ํด๋ž˜์Šค์˜ ์„ธ์ปจ๋”๋ฆฌ ์ƒ์„ฑ์ž์—์„œ super ํ‚ค์›Œ๋“œ๋กœ ๋ถ€๋ชจ ํด๋ž˜์Šค์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ
  • ์ž์‹ ํด๋ž˜์Šค์— ์„ธ์ปจ๋”๋ฆฌ ์ƒ์„ฑ์ž๋งŒ ์žˆ์„ ๊ฒฝ์šฐ, ์ƒ์†๋˜๋Š” ํด๋ž˜์Šค ์ด๋ฆ„ ๋‹ค์Œ์€ ๊ด„ํ˜ธ๊ฐ€ ์ƒ๋žต๋จ

 

 

 

๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉํ•˜๊ธฐ

open class Parent {
    var hello: String = "์•ˆ๋…•ํ•˜์„ธ์š”"
    fun sayHello(){
        Log.d("inheritance", "${hello}")
    }
}
โ€‹
class Child: Parent(){
    fun myHello() {
        hello = "Hello!"
        sayHello()
    }
}
// Child์—๋Š” hello๋ผ๋Š” ํ”„๋กœํผํ‹ฐ์™€ sayHello๋ผ๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์—†์ง€๋งŒ 
// myHello() ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋กœ๊ทธ์— "Hello!"๊ฐ€ ์ถœ๋ ฅ
  • ๋ถ€๋ชจ ํด๋ž˜์Šค์—์„œ ์ •์˜๋œ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ๋‚ด ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

 

 

 

ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ์˜ ์žฌ์ •์˜: ์˜ค๋ฒ„๋ผ์ด๋“œ

  • ์ƒ์†๋ฐ›์€ ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ ์ค‘์— ์ž์‹ ํด๋ž˜์Šค์—์„œ๋Š” ๋‹ค๋ฅธ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ
  • ์•ž์˜ ์˜ˆ์ œ์—์„œ Parent ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ์™€ Child์˜ ๋ฉ”์„œ๋“œ๋ช…์ด ๋‹ค๋ฅธ ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์Œ
  • ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ์‹ค ์ €๋Ÿฐ ๊ฒฝ์šฐ ์˜ค๋ฒ„๋ผ์ด๋“œ๋กœ Child ํด๋ž˜์Šค์˜ ๋ฉ”์„œ๋“œ๋„ sayHello๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์ด ์˜๋ฏธ์ƒ ๋” ์ ํ•ฉํ•จ
  • ๋™์ผํ•œ ์ด๋ฆ„์˜ ๋ฉ”์„œ๋“œ๋‚˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ์— override ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์Œ
  • ์˜ค๋ฒ„๋ผ์ด๋“œํ•  ๋•Œ๋Š” ํ”„๋กœํผํ‹ฐ๋‚˜ ๋ฉ”์„œ๋“œ๋„ ํด๋ž˜์Šค์ฒ˜๋Ÿผ ์•ž์— open์„ ๋ถ™์—ฌ์„œ ์ƒ์†ํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์–ด์•ผ ํ•จ

 

 

 

๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋“œ

open class BaseClass {
    open fun opened() {
    }
    fun notOpened(){
    }
}
โ€‹
class ChildClass: BaseClass(){
    override fun opened(){
    }
    override fun notOpened(){ // notOpened ๋ฉ”์„œ๋“œ๋Š” open ํ‚ค์›Œ๋“œ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ž˜๋ชป๋œ ์‚ฌ์šฉ
    }
}
  • ์ƒ์†ํ•  ๋ฉ”์„œ๋“œ ์•ž์— open ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์•ผ๋งŒ ์˜ค๋ฒ„๋ผ์ด๋“œํ•  ์ˆ˜ ์žˆ์Œ
  • ํด๋ž˜์Šค์˜ ์„ธ์ปจ๋”๋ฆฌ ์ƒ์„ฑ์ž๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ค‘๋ณตํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋„ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ

 

 

 

ํ”„๋กœํผํ‹ฐ ์˜ค๋ฒ„๋ผ์ด๋“œ

open class BaseClass2 {
    open var opened: String = "I am"
}
โ€‹
class ChildClass2: BaseClass2(){
    override var opened: String = "You are"
}
  • ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋“œ์ฒ˜๋Ÿผ ํ”„๋กœํผํ‹ฐ ์—ญ์‹œ open์œผ๋กœ ์—ด๋ ค ์žˆ์–ด์•ผ๋งŒ ์˜ค๋ฒ„๋ผ์ด๋“œ ๊ฐ€๋Šฅ

 

 

 

์ต์Šคํ…์…˜

fun ํด๋ž˜์Šค.ํ™•์žฅํ•  ๋ฉ”์„œ๋“œ(){
    // ์ฝ”๋“œ
}
  • Kotlin์€ ํด๋ž˜์Šค, ๋ฉ”์„œ๋“œ, ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•ด ์ต์Šคํ…์…˜(Extension)์„ ์ง€์›
  • ์ด๋ฏธ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋Š” ํด๋ž˜์Šค์— ์œ„์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€
  • ์ƒ์† - ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋Š” ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ๋‹ค ์“ฐ๊ธฐ
    ์ต์Šคํ…์…˜ - ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ ธ ์žˆ๋Š” ํด๋ž˜์Šค์— ๋ฉ”์„œ๋“œ๋ฅผ ๋„ฃ๊ธฐ
  • ์ž์‹ ์ด ๋งŒ๋“  ํด๋ž˜์Šค์— ์‚ฌ์šฉํ•˜๊ธฐ๋ณด๋‹ค๋Š” ๋ˆ„๊ตฐ๊ฐ€ ์ž‘์„ฑํ•ด๋‘”, ์ด๋ฏธ ์ปดํŒŒ์ผ๋˜์–ด ์žˆ๋Š” ํด๋ž˜์Šค์— ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ ์šฉ๋„
  • ์ต์Šคํ…์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ด์„œ ์‹ค์ œ ํด๋ž˜์Šค์˜ ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ ๋‹จ์ง€ ์‹คํ–‰ ์‹œ์— ๋„ํŠธ ์—ฐ์‚ฐ์ž๋กœ ํ˜ธ์ถœํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์คŒ. ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๊ฑฐ์˜ ๋ฉ”์„œ๋“œ ํ™•์žฅ ์šฉ๋„

 

 

 


 

 

์„ค๊ณ„ ๋„๊ตฌ

  • ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๊ตฌํ˜„(์‹ค์ œ ๋กœ์ง์„ ๊ฐ–๋Š” ์ฝ”๋”ฉ)๊ณผ ์„ค๊ณ„(๊ป๋ฐ๊ธฐ๋งŒ ์žˆ๋Š” ์ฝ”๋”ฉ)๋กœ ๊ตฌ๋ถ„
  • ์ง€๊ธˆ๊นŒ์ง€ ์œ„์—์„œ ๋ฐฐ์šด ๋‚ด์šฉ์€ ๋ชจ๋‘ ๊ตฌํ˜„์— ์ค‘์ ์„ ๋‘” ๊ธฐ๋ฒ•
  • ์•„๋ž˜ ๋‚ด์šฉ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์„ค๊ณ„์— ์‚ฌ์šฉํ•˜๋Š” ์„ค๊ณ„ ๋„๊ตฌ ์ค‘ ๊ธฐ๋ณธ ๋‚ด์šฉ

 

 

ํŒจํ‚ค์ง€ (Package)

package ๋ฉ”์ธ ๋””๋ ‰ํ„ฐ๋ฆฌ.์„œ๋ธŒ ๋””๋ ‰ํ„ฐ๋ฆฌ
class ํด๋ž˜์Šค {
โ€‹
}

//์˜ˆ์‹œ: ํŒŒ์ผ ์ƒ๋‹จ package com.limheejin.calculator
  • ์ปดํ“จํ„ฐ ์–ธ์–ด์—์„œ์˜ ํŒจํ‚ค์ง€ ์‚ฌ์šฉ ๋ชฉ์ ์€ ์„ค๊ณ„์— ๊ฐ€๊นŒ์›€
  • ์ฝ”๋”ฉํ•˜๋ฉด์„œ ํŒŒ์ผ์„ ๋ถ„๋ฅ˜ํ•˜๊ณ , ์ด๋ฆ„์„ ์ง“๊ณ , ํŠน์ • ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋ชจ์•„ ๋†“๋Š” ๊ฒƒ์ด ๋ชจ๋‘ ์„ค๊ณ„
  • ํŒจํ‚ค์ง€๋Š” ํด๋ž˜์Šค์™€ ์†Œ์Šค ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ์˜ ์ €์žฅ ๊ณต๊ฐ„
    ํ˜„์žฌ ํด๋ž˜์Šค๊ฐ€ ์–ด๋–ค ํŒจํ‚ค์ง€(๋””๋ ‰ํ„ฐ๋ฆฌ)์— ์žˆ๋Š”์ง€ ํ‘œ์‹œ
  • ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ๊ณ„์ธต ๊ตฌ์กฐ๋กœ ๋งŒ๋“ค์–ด์ ธ ์žˆ์œผ๋ฉด ์˜จ์ (.)์œผ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ๊ฐ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋ชจ๋‘ ๋‚˜์—ด

 

 

์ถ”์ƒํ™”

abstract class Design {
    abstract fun drawText()
    abstract fun draw()
    fun showWindow() {
        // code
    }
}
โ€‹
class Implements: Design(){
    fun drawText() {
        // ๊ตฌํ˜„ ์ฝ”๋“œ
    }
    fun draw() {
        // ๊ตฌํ˜„ ์ฝ”๋“œ
    }
}

 

abstract class Animal {
    fun walk(){
        Log.d("abstract", "๊ฑท์Šต๋‹ˆ๋‹ค.")
    }
    abstract fun move()
}

class Bird: Animal(){
    override fun move(){
        Log.d("abstract", "๋‚ ์•„์„œ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.")
    }
}
  • ์ดˆ๋ฐ˜ ๊ฐœ๋… ์„ค๊ณ„๋ฅผ ํ•˜๋Š” ๋‹จ๊ณ„์—์„œ๋Š” ํด๋ž˜์Šค์˜ ์ด๋ฆ„๊ณผ ํด๋ž˜์Šค ์•ˆ์— ์žˆ์Œ ์งํ•œ ๊ธฐ๋Šฅ์„ ์œ ์ถ”ํ•ด์„œ ๋ฉ”์„œ๋“œ ์ด๋ฆ„ ๋‚˜์—ด
  • ๋ช…ํ™•ํ•œ ์ฝ”๋“œ๋Š” ์„ค๊ณ„ ๋‹จ๊ณ„์—์„œ ๋ฉ”์„œ๋“œ ๋ธ”๋ก ์•ˆ์— ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ,
    ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ๊ตฌํ˜„ ๋‹จ๊ณ„์—์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋„๋ก ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„๋งŒ ์ž‘์„ฑ
  • ํ›„์ž๋ฅผ ์ถ”์ƒํ™”(Abstract)๋ผ๊ณ  ํ•˜๋ฉฐ abstract ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ช…์‹œ
  • ๊ตฌํ˜„ ๋‹จ๊ณ„์—์„œ๋Š” ์ถ”์ƒํ™”๋œ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„์„œ ์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์€ ๋ถ€๋ถ„์„ ๋งˆ์ € ๊ตฌํ˜„
  • ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด move๋Š” Animal์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ
    ์•ž์œผ๋กœ ์ƒ์†๋ฐ›์„ ์ž์‹ ํด๋ž˜์Šค์˜ ํŠน์ง•์— ๋”ฐ๋ผ ์ฝ”๋“œ๊ฐ€ ๊ฒฐ์ •๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ๊ธฐ๋Šฅ์€ abstract ํ‚ค์›Œ๋“œ๋กœ ์ถ”์ƒํ™”
  • ์‹ค์ œ ๊ตฌํ˜„ ํด๋ž˜์Šค์ธ Bird์—์„œ ์ด ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„์„œ ์•„์ง ๊ตฌํ˜„๋˜์ง€ ์•Š์€ ์ถ”์ƒํ™”๋˜์–ด ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๊ตฌํ˜„
  • ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™” ํ•  ์ˆ˜ ์—†์–ด์„œ ๊ตฌํ˜„ ๋‹จ๊ณ„๊ฐ€ ๊ณ ๋ ค๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ž˜๋ชป๋œ ์„ค๊ณ„๊ฐ€ ๋  ์ˆ˜ ์žˆ์Œ
  • ์•ˆ๋“œ๋กœ์ด๋“œ์˜ Activity๋„ ์ˆ˜๋งŽ์€ ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›๋Š”๋ฐ, ์ด ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค ์ค‘ ์ตœ์ƒ์œ„ ํด๋ž˜์Šค์ธ Context๊ฐ€ ๋ฐ”๋กœ abstract๋กœ ์„ค๊ณ„๋˜์–ด ์žˆ์Œ

 

 

 

์ธํ„ฐํŽ˜์ด์Šค (Interface)

interface ์ธํ„ฐํŽ˜์ด์Šค๋ช… {
    var ๋ณ€์ˆ˜: String
    fun ๋ฉ”์„œ๋“œ1()
    fun ๋ฉ”์„œ๋“œ2()
}
  • ์‹คํ–‰ ์ฝ”๋“œ ์—†์ด ๋ฉ”์„œ๋“œ ์ด๋ฆ„๋งŒ ๊ฐ€์ง„ ์ถ”์ƒ ํด๋ž˜์Šค
  • ๋ˆ„๊ตฐ๊ฐ€ ์„ค๊ณ„ํ•ด ๋†“์€ ๊ฐœ๋… ํด๋ž˜์Šค ์ค‘์— ์‹คํ–‰ ์ฝ”๋“œ๊ฐ€ ํ•œ ์ค„์ด๋ผ๋„ ์žˆ์œผ๋ฉด ์ถ”์ƒํ™”,
    ์ฝ”๋“œ ์—†์ด ๋ฉ”์„œ๋“œ ์ด๋ฆ„๋งŒ ๋‚˜์—ด๋˜์–ด ์žˆ์œผ๋ฉด ์ธํ„ฐํŽ˜์ด์Šค
  • ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ƒ์† ๊ด€๊ณ„์˜ ์„ค๊ณ„๋ณด๋‹ค๋Š” ์™ธ๋ถ€ ๋ชจ๋“ˆ์—์„œ ๋‚ด๊ฐ€ ๋งŒ๋“  ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„์„ ๋‚˜์—ดํ•ด๋‘” ์ผ์ข…์˜ ๋ช…์„ธ์„œ๋กœ ์ œ๊ณต
  • ์ธํ„ฐํŽ˜์ด์Šค๋Š” interface ์˜ˆ์•ฝ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ณ  ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋“œํ•ด์„œ ๊ตฌํ˜„
  • Kotlin์€ ํ”„๋กœํผํ‹ฐ๋„ ์ธํ„ฐํŽ˜์ด์Šค ๋‚ด๋ถ€์— ์ •์˜ํ•  ์ˆ˜ ์žˆ์Œ (๋Œ€๋ถ€๋ถ„์˜ ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์—์„œ๋Š” ์ง€์›ํ•˜์ง€ ์•Š์Œ)
  • ์ถ”์ƒ ํด๋ž˜์Šค์™€ ๋‹ค๋ฅด๊ฒŒ class ํ‚ค์›Œ๋“œ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ

 

๐Ÿ’ก ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์“ฐ์ง€ ์•Š๋Š” ๊ฒŒ ์ข‹์„ ๋•Œ

  • ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์™ธ๋ถ€์˜ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์„ ์œ„ํ•œ ์˜์‚ฌ์†Œํ†ต ๋ฐฉ์‹์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ
  • ํ˜ผ์ž ๊ฐœ๋ฐœํ•˜๊ฑฐ๋‚˜ ์†Œ์ˆ˜์˜ ์ธ์›์ด ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ ๋‹จ์œ„๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Œ
  • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋‚จ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ๊ณผ ๊ตฌํ˜„ ํšจ์œจ์„ฑ์ด ๋–จ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ
  • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ๊ฐ€ ๋ณด์•˜์„ ๋•Œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“œ๋Š” ๋ชจ๋“ˆ์ด ์™ธ๋ถ€ ๋ชจ๋“ˆ์ด๊ธฐ ๋•Œ๋ฌธ

 

 

 

์ธํ„ฐํŽ˜์ด์Šค ๋งŒ๋“ค๊ธฐ

interface InterfaceKotlin{
    var variable: String // var ์•ž์— abstract ํ‚ค์›Œ๋“œ๊ฐ€ ์ƒ๋žต๋˜์–ด ์žˆ์Œ!!!
    fun get()
    fun set()
}
  • ๋ฉ”์„œ๋“œ๋Š” ์ฝ”๋“œ ๋ธ”๋ก ์—†์ด ์ด๋ฆ„๋งŒ ์ž‘์„ฑ
  • ์ธํ„ฐํŽ˜์ด์Šค์˜ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์„œ๋“œ ์•ž์—๋Š” abstract ํ‚ค์›Œ๋“œ๊ฐ€ ์ƒ๋žต๋œ ํ˜•ํƒœ

 

 

 

ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•˜๊ธฐ

class KotlinImpl: InterfaceKotlin {
    override var variable: String = "init value"
    override fun get() {
        // code
    }
    override fun set() {
        // code
    }
}
var kotlinImpl = object: InterfaceKotlin {
    override var variable: String = "init value"
    override fun get() {
        // code
    }
    override fun set() {
        // code
    }   
}
  • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํด๋ž˜์Šค์—์„œ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ์ƒ์†๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ, ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„๋งŒ ์ง€์ •
  • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํด๋ž˜์Šค์˜ ์ƒ์† ํ˜•ํƒœ๊ฐ€ ์•„๋‹Œ ์†Œ์Šค ์ฝ”๋“œ์—์„œ ์ง์ ‘ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” object ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ (์ž์ฃผ ์”€)

 

 

 

 

์ ‘๊ทผ ์ œํ•œ์ž

  • Kotlin์—์„œ ์ •์˜๋˜๋Š” ํด๋ž˜์Šค, ์ธํ„ฐํŽ˜์ด์Šค, ๋ฉ”์„œ๋“œ, ํ”„๋กœํผํ‹ฐ๋Š” ๋ชจ๋‘ ์ ‘๊ทผ ์ œํ•œ์ž(Visibility Modifiers)๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ
  • ํ•จ์ˆ˜ํ˜• ์–ธ์–ด๋ผ๋Š” ํŠน์„ฑ ๋•Œ๋ฌธ์— ์ฝ”ํ‹€๋ฆฐ์€ ๊ธฐ์กด ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์ ‘๊ทผ ์ œํ•œ์ž ๊ธฐ์ค€์ธ ํŒจํ‚ค์ง€ ๋Œ€์‹ ์— ๋ชจ๋“ˆ ๊ฐœ๋…์„ ๋„์ž…
  • internal ์ ‘๊ทผ ์ œํ•œ์ž๋กœ ๋ชจ๋“ˆ ๊ฐ„์— ์ ‘๊ทผ์„ ์ œํ•œ ๊ฐ€๋Šฅ
  • ๋ชจ๋“ˆ์ด๋ž€? ํ•œ ๋ฒˆ์— ๊ฐ™์ด ์ปดํŒŒ์ผ๋˜๋Š” ๋ชจ๋“  ํŒŒ์ผ (ํ•˜๋‚˜์˜ ์•ฑ == ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ == ํ•˜๋‚˜์˜ ๋ชจ๋“ˆ)

 

 

์ ‘๊ทผ ์ œํ•œ์ž์˜ ์ข…๋ฅ˜

์ ‘๊ทผ ์ œํ•œ์ž ์ œํ•œ ๋ฒ”์œ„
private ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€
internal ๊ฐ™์€ ๋ชจ๋“ˆ์— ์žˆ๋Š” ํŒŒ์ผ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
protected private์™€ ๊ฐ™์ด ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ์ ‘๊ทผ ๋ถˆ๊ฐ€
๋‹ค๋งŒ, ์ƒ์† ๊ด€๊ณ„์—์„œ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ ์ ‘๊ทผ ๊ฐ€๋Šฅ
public ์ œํ•œ ์—†์ด ๋ชจ๋“  ํŒŒ์ผ์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • ์ ‘๊ทผ ์ œํ•œ์ž๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ์—๊ฒŒ ์ž์‹ ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ œ๊ณต
  • ๊ฐ ๋ณ€์ˆ˜๋‚˜ ํด๋ž˜์Šค ์ด๋ฆ„ ์•ž์— ์•„๋ฌด๋Ÿฐ ์˜ˆ์•ฝ์–ด๋ฅผ ๋ถ™์ด์ง€ ์•Š์•˜์„ ๋•Œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ public ์ ‘๊ทผ ์ œํ•œ์ž๊ฐ€ ์ ์šฉ

 

 

์ ‘๊ทผ ์ œํ•œ์ž์˜ ์ ์šฉ

open class Parent {
    private val privateVal = 1
    protected open val protectedVal = 2
    internal val internalVal = 3
    val defaultVal = 4
}

class Child: Parent() {
    fun callVariables() {
        // privateVal์€ private ๋ฉค๋ฒ„์ด๊ธฐ ๋•Œ๋ฌธ์— ์ ‘๊ทผ ๋ถˆ๊ฐ€
        Log.d("Modifier", "protected ๋ณ€์ˆ˜์˜ ๊ฐ’์€ ${protectedVal}"). 
        // protected ๋ฉค๋ฒ„ protectedVal์€ ์ƒ์† ๊ด€๊ณ„์ด๋ฏ€๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ
        Log.d("Modifier", "internal ๋ณ€์ˆ˜์˜ ๊ฐ’์€ ${internalVal}"). // 
        // internal ๋ฉค๋ฒ„ internalVal์€ ๋™์ผํ•œ ๋ชจ๋“ˆ์ด๋ฏ€๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ
        Log.d("Modifier", "๊ธฐ๋ณธ ์ œํ•œ์ž ๋ณ€์ˆ˜ defaultVal์˜ ๊ฐ’์€ ${defaultVal}"). 
        // ์ ‘๊ทผ ์ œํ•œ์ž๊ฐ€ ์—†๋Š” ๋ฉค๋ฒ„ defaultVal์—๋Š” public์ด ์ ์šฉ๋˜์–ด ์ ‘๊ทผ ๊ฐ€๋Šฅ
    }
}
  • ์ ‘๊ทผ ์ œํ•œ์ž๋ฅผ ๋ถ™์ด๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค, ๋ฉค๋ฒ„ ํ”„๋กœํผํ‹ฐ ๋˜๋Š” ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ด ์ œํ•œ๋จ

 

 

์ œ๋„ค๋ฆญ (Generic)

public interface MutableList<E> {
    var list: Array<E>
    // ...
}
var list: MutableList<Generic> = mutableListOf("Mon", "Tue", "Wed")
fun testGenerics() {
    var list: MutableList<String> = mutableListOf()
    // String์„ ์ œ๋„ค๋ฆญ์œผ๋กœ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— list ๋ณ€์ˆ˜์—๋Š” ๋ฌธ์ž์—ด๋งŒ ๋‹ด์„ ์ˆ˜ ์žˆ์Œ
    list.add("Mon")
    list.add("Tue")
    list.add("Wed")
    // list.add(35) <- ์ž…๋ ฅ ์˜ค๋ฅ˜ ๋ฐœ์ƒ
    for (item in list){
        Log.d("Generic", "list์— ์ž…๋ ฅ๋œ ๊ฐ’์€ ${item}์ž…๋‹ˆ๋‹ค.")
        // String ํƒ€์ž…์˜ item ๋ณ€์ˆ˜๋กœ ๊บผ๋‚ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
    }
}
  • ์ œ๋„ค๋ฆญ(Generic)์€ ์ž…๋ ฅ๋˜๋Š” ๊ฐ’์˜ ํƒ€์ž…์„ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ค๊ณ„ ๋„๊ตฌ
  • ํด๋ž˜์Šค๋ช… ์˜†์— <E>๋ผ๊ณ  ๋˜์–ด ์žˆ๋Š” ๋ถ€๋ถ„์— String๊ณผ ๊ฐ™์€ ํŠน์ • ํƒ€์ž…์ด ์ง€์ •๋˜๋ฉด ํด๋ž˜์Šค ๋‚ด๋ถ€์— ์„ ์–ธ๋œ ๋ชจ๋“  E์— String์ด ํƒ€์ž…์œผ๋กœ ์ง€์ •
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ var list: Array<E>๊ฐ€ var list: Array<String>์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ
  • ์ปฌ๋ ‰์…˜์ด๋‚˜ ๋ฐฐ์—ด์—์„œ ์ž…๋ ฅ๋˜๋Š” ๊ฐ’์˜ ํƒ€์ž…์„ ํŠน์ •ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

 

 


 

์ •๋ฆฌ

  • ํด๋ž˜์Šค(class): ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์˜ ๋ชจ์Œ์œผ๋กœ, ์—ฐ๊ด€์„ฑ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๊ณ  ์ด๋ฆ„์„ ๋งค๊ธด ๊ฒƒ
  • constructor: ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ˜ธ์ถœํ•˜๋Š” ์ผ์ข…์˜ ํ•จ์ˆ˜
  • init: ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก
  • ํ”„๋กœํผํ‹ฐ(property): ํด๋ž˜์Šค์— ์ •์˜๋œ ๋ณ€์ˆ˜ = ํ”„๋กœํผํ‹ฐ ๋˜๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜
  • ๋ฉ”์„œ๋“œ(method): ํด๋ž˜์Šค์— ์ •์˜๋œ ํ•จ์ˆ˜ = ๋ฉ”์„œ๋“œ ๋˜๋Š” ๋ฉค๋ฒ„ ํ•จ์ˆ˜
  • ์ปดํŒจ๋‹ˆ์–ธ ์˜ค๋ธŒ์ ํŠธ(comapnion object): ์ปดํŒจ๋‹ˆ์–ธ ์˜ค๋ธŒ์ ํŠธ์˜ ๋ธ”๋ก ์•ˆ์—์„œ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋ฉด ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•˜์ง€ ์•Š๊ณ  ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋“ค์„ ์‚ฌ์šฉ
  • ์ƒ์†: ์ฝ”๋“œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ค๊ณ„ ๋„๊ตฌ. ์ƒ์† ๊ด€๊ณ„์—์„œ ์ž์‹ ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„๋“ค์„ ์ž์‹ ์˜ ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉ
  • ์ถ”์ƒํ™”(abstract): ํด๋ž˜์Šค๋ฅผ ๊ฐœ๋… ์„ค๊ณ„ํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ
  • ์ธํ„ฐํŽ˜์ด์Šค(interface): ์™ธ๋ถ€ ๋ชจ๋“ˆ์— ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ”์„œ๋“œ ์ด๋ฆ„์„ ๋‚˜์—ดํ•œ ๋ช…์„ธ์„œ
  • ํŒจํ‚ค์ง€(package): ์—ฐ๊ด€์„ฑ ์žˆ๋Š” ํด๋ž˜์Šค๋“ค์„ ๋ถ„๋ฅ˜ํ•˜๊ธฐ ์œ„ํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์กฐ
  • ์ ‘๊ทผ ์ œํ•œ์ž: ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„์— ์ง€์ •๋œ ์ ‘๊ทผ ์ œํ•œ์ž์— ๋”ฐ๋ผ ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉ ์—ฌ๋ถ€๊ฐ€ ๊ฒฐ์ •
  • ์ œ๋„ค๋ฆญ(generic): ํƒ€์ž…์„ ํŠน์ •ํ•ด์„œ ์•ˆ์ •์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์„ค๊ณ„ ๋„๊ตฌ

 

์ถ”๊ฐ€ ๋‚ด์šฉ ์ •๋ฆฌ

๐Ÿ’กํŒŒ๋ผ๋ฏธํ„ฐ(Parameter)์™€ ๋งค๊ฐœ๋ณ€์ˆ˜(Argument)์˜ ๊ตฌ๋ถ„

fun add(x: Int, y: Int): Int {
    return x + y
}
// ํŒŒ๋ผ๋ฏธํ„ฐ: x, y


val result = add(5, 3)
// ๋งค๊ฐœ๋ณ€์ˆ˜: 5, 3
  • ํŒŒ๋ผ๋ฏธํ„ฐ: ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ ์ •์˜์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜ (x, y)
  • ๋งค๊ฐœ๋ณ€์ˆ˜: ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ ์ „๋‹ฌ๋˜๋Š” ์‹ค์ œ ๊ฐ’ (5, 3)
๋ฐ˜์‘ํ˜•
 ๐Ÿ’ฌ C O M M E N T