λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Android

[Chap 4] μ½”ν‹€λ¦° 객체지ν–₯ ν”„λ‘œκ·Έλž˜λ°

by nitronium102 2021. 11. 20.

ν΄λž˜μŠ€μ™€ μƒμ„±μž

클래슀 μ„ μ–Έ

- class ν‚€μ›Œλ“œ μ‚¬μš©

- 클래슀의 λ©€λ²„λŠ” μƒμ„±μž, λ³€μˆ˜, ν•¨μˆ˜, 클래슀둜 ꡬ성

- μ½”ν‹€λ¦°μ˜ μƒμ„±μž : constructor ν‚€μ›Œλ“œλ‘œ μ„ μ–Έ

- 클래슀 μ•ˆμ— λ‹€λ₯Έ 클래슀 μ„ μ–Έ κ°€λŠ₯

- ν΄λž˜μŠ€λŠ” 객체λ₯Ό 생성해 μ‚¬μš©(new ν‚€μ›Œλ“œ μ‚¬μš©ν•˜μ§€ μ•ŠμŒ)

class User {
	val name = "kkang";
 	constructor(name: String){ this.name = name }
    	fun someFun() { println("name : $name") }
    	class SomeClass {}
}

val user = User("kim");

 

μƒμ„±μž(constructor ν‚€μ›Œλ“œ)

ν•œ 클래슀 μ•ˆμ— μ£Ό μƒμ„±μž / 보쑰 μƒμ„±μž / λ‘˜ λ‹€ μ„ μ–Έ κ°€λŠ₯

 

1. μ£Ό μƒμ„±μž :  클래슀 μ„ μ–ΈλΆ€

- ν•„μˆ˜λŠ” μ•„λ‹ˆλ©° ν•œ ν΄λž˜μŠ€μ— ν•˜λ‚˜λ§Œ κ°€λŠ₯

- 주둜 μƒμ„±μžμ˜ κ³΅ν†΅λœ μ½”λ“œλ₯Ό μž‘μ„±

- constructor ν‚€μ›Œλ“œ μƒλž΅ κ°€λŠ₯

- μ£Ό μƒμ„±μž μ„ μ–Έν•˜μ§€ μ•ŠμœΌλ©΄, μ»΄νŒŒμΌλŸ¬κ°€ λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” μ£Ό μƒμ„±μžλ₯Ό μžλ™μœΌλ‘œ μΆ”κ°€

class User constructor() { } // constructor ν‚€μ›Œλ“œ μ‚¬μš©
class User() { } // constructor ν‚€μ›Œλ“œ μƒλž΅
class User { } // λ§€κ°œλ³€μˆ˜κ°€ μ—†λŠ” μ£Ό μƒμ„±μž μžλ™ μ„ μ–Έ

class User(name: String, count: Int) { }

 

λ³Έλ¬Έ - init μ˜μ—­

μ£Ό μƒμ„±μžλŠ” 클래슀 선언뢀에 있기 λ•Œλ¬Έμ— μ‹€ν–‰ μ˜μ—­μ— { }λ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€.

init ν‚€μ›Œλ“œλ‘œ μ£Ό μƒμ„±μžμ˜ λ³Έλ¬Έ κ΅¬ν˜„

init으둜 μ§€μ •ν•œ μ˜μ—­μ€ 객체λ₯Ό 생성할 λ•Œ μžλ™μœΌλ‘œ μ‹€ν–‰(κΌ­ μ„ μ–Έν•  ν•„μš”λŠ” μ—†μŒ)

 

μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜λ₯Ό 클래슀의 멀버 λ³€μˆ˜λ‘œ μ„ μ–Έν•˜λŠ” 방법

μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜λŠ” 기본적으둜 μƒμ„±μžμ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλŠ” 지역 λ³€μˆ˜

-> μ£Ό μƒμ„±μžμ—μ„œ λ§€κ°œλ³€μˆ˜λ₯Ό varμ΄λ‚˜ val ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•˜λ©΄ 클래슀의 멀버 λ³€μˆ˜κ°€ λœλ‹€. 

class User(val name: String, val count: Int){
	fun someFun() { println("name: $name, count: $count") }
}

fun main() {
	val user = User("kkang", 10)
    	user.someFun()
}

 

2. 보쑰 μƒμ„±μž : 클래슀 λ³Έλ¬Έ

- μ—¬λŸ¬ 개 μΆ”κ°€ κ°€λŠ₯

class User {
	constructor(name: String) { println("constructor(name: String) call..." )}
    constructor(name: String, count: Int) { printlnt("constructor2") }
}

 

보쑰 μƒμ„±μžμ— μ£Ό μƒμ„±μž μ—°κ²°

클래슀λ₯Ό μ„ μ–Έν•  λ•Œ μ£Ό μƒμ„±μžμ™€ 보쑰 μƒμ„±μžλ₯Ό λͺ¨λ‘ μƒμ„±ν•œλ‹€λ©΄ λ°˜λ“œμ‹œ μƒμ„±μžλΌλ¦¬ μ—°κ²° ν•„μš”

-> 보쑰 μƒμ„±μžλŠ” 객체λ₯Ό 생성할 λ•Œ 호좜되며, μ΄λ•Œ 클래슀 내에 μ£Ό μƒμ„±μžκ°€ μžˆλ‹€λ©΄ this( ) ꡬ문을 μ΄μš©ν•΄ μ£Ό μƒμ„±μžλ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€.

// 주석 : μ—°κ²° μˆœμ„œ
class User(name: String) { // 4번
	constructor(name: String, count: Int): this(name) { ... } // 3번
    constructor(name: String, count: Int, email: String): this(name, count) { ... } // 2번
}

fun main() {
	val user = User("kkang", 10, "a@a.com") // 1번
}

 

클래슀λ₯Ό μž¬μ‚¬μš©ν•˜λŠ” 상속

상속과 μƒμ„±μž

1) 상속 : 클래슀λ₯Ό μ„ μ–Έν•  λ•Œ λ‹€λ₯Έ 클래슀λ₯Ό μ°Έμ‘°ν•΄μ„œ μ„ μ–Έν•˜λŠ” 것

- 선언뢀에 : κ³Ό ν•¨κ»˜ 상속받을 클래슀 이름을 μž…λ ₯

- μ½”ν‹€λ¦°μ˜ ν΄λž˜μŠ€λŠ” 기본적으둜 λ‹€λ₯Έ ν΄λž˜μŠ€κ°€ 상속할 수 μ—†μŒ. κ·ΈλŸ¬λ‚˜ open ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ 상속 κ°€λŠ₯

open class Super { } 
class Sub: Super() { }

- μƒμœ„ 클래슀λ₯Ό 상속받은 ν•˜μœ„ 클래슀의 μƒμ„±μžμ—μ„œλŠ” μƒμœ„ 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•œλ‹€.

open class Super(name: String) { }
class Sub(name: String): Super(name) { } // λ§€κ°œλ³€μˆ˜κ°€ μžˆλŠ” μƒμœ„ 클래슀의 μƒμ„±μž 호좜
class Sub: Super {
	constructor(name: String): super(name) // ν•˜μœ„ ν΄λž˜μŠ€μ— 보쑰 μƒμ„±μžλ§Œ μžˆλŠ” 경우
}

 

μ˜€λ²„λΌμ΄λ”©

μƒμœ„ ν΄λž˜μŠ€μ— μ •μ˜λœ 멀버(λ³€μˆ˜, ν•¨μˆ˜)λ₯Ό 같은 μ΄λ¦„μœΌλ‘œ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ λ‹€μ‹œ μ„ μ–Έν•˜λŠ” 것

- 주둜 ν•¨μˆ˜λ₯Ό μž¬μ •μ˜ν•  λ•Œ μ‚¬μš©(같은 ν•¨μˆ˜λͺ…μœΌλ‘œ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ μƒˆλ‘œμš΄ 둜직 μΆ”κ°€ν•˜κ³  싢을 λ•Œ)

- open ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λ‚˜ ν•¨μˆ˜μ— ν•œν•΄μ„œ override ν•  수 있음

open class Super { open var someData = 10 }
class Sub: Super() { override var someData = 20 }

 

μ ‘κ·Ό μ œν•œμž

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

μ ‘κ·Ό μ œν•œμž μ΅œμƒμœ„μ—μ„œ 이용 클래슀 λ©€λ²„μ—μ„œ 이용
public λͺ¨λ“  νŒŒμΌμ—μ„œ κ°€λŠ₯ λͺ¨λ“  ν΄λž˜μŠ€μ—μ„œ κ°€λŠ₯
internal 같은 λͺ¨λ“ˆ λ‚΄μ—μ„œ κ°€λŠ₯ 같은 λͺ¨λ“ˆ λ‚΄μ—μ„œ κ°€λŠ₯
protected μ‚¬μš© λΆˆκ°€ 상속 κ΄€κ³„μ˜ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œλ§Œ κ°€λŠ₯
private 파일 λ‚΄λΆ€μ—μ„œλ§Œ 이용 클래슀 λ‚΄λΆ€μ—μ„œλ§Œ 이용

- public : λ””ν΄νŠΈ μ ‘κ·Ό μ œν•œμž

- internal : 같은 λͺ¨λ“ˆ λ‚΄μ—μ„œ μ ‘κ·Ό(λͺ¨λ“ˆ : gradle, maven 같은 λΉŒλ“œ λ„κ΅¬μ—μ„œ ν”„λ‘œμ νŠΈ λ‹¨μœ„ λ˜λŠ” 같은 μ„ΈνŠΈ λ‹¨μœ„)

- protected : 클래슀의 λ©€λ²„μ—μ„œλ§Œ μ„ μ–Έ. μ΅œμƒμœ„μ— μ„ μ–Έλ˜λŠ” λ³€μˆ˜λ‚˜ ν•¨μˆ˜λŠ” protected둜 μ„ μ–Έν•  수 μ—†μŒ.

- private : ν•΄λ‹Ή 클래슀 λ‚΄λΆ€ / μ΅œμƒμœ„μ—μ„œ private둜 μ„ μ–Έν•˜λ©΄ ν•΄λ‹Ή 파일 λ‚΄λΆ€μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯

 

μ½”ν‹€λ¦°μ˜ 클래슀 μ’…λ₯˜

데이터 클래슀

- data ν‚€μ›Œλ“œλ‘œ μ„ μ–Έ, 자주 μ‚¬μš©ν•˜λŠ” 데이터λ₯Ό 객체둜 λ¬Άμ–΄μ€€λ‹€

- VO(value object) 클래슀λ₯Ό νŽΈλ¦¬ν•˜κ²Œ μ΄μš©ν•  수 있게 ν•΄ μ€€λ‹€.

- 주둜 μ£Ό μƒμ„±μžμ— var, val ν‚€μ›Œλ“œλ‘œ λ§€κ°œλ³€μˆ˜λ₯Ό μ„ μ–Έν•΄ 클래슀의 멀버 λ³€μˆ˜λ‘œ ν™œμš©

 

1) equals() ν•¨μˆ˜ : 객체의 데이터λ₯Ό 비ꡐ

- 일반 클래슀의 객체 비ꡐ : 객체 자체λ₯Ό 비ꡐ

- 데이터 클래슀의 객체 비ꡐ : 객체의 데이터λ₯Ό 비ꡐ

- μ£Ό μƒμ„±μžμ— μ„ μ–Έν•œ 멀버 λ³€μˆ˜μ˜ λ°μ΄ν„°λ§Œ 비ꡐ(μ£Ό μƒμ„±μžμ˜ 멀버 λ³€μˆ˜κ°€ κ°™μ€μ§€λ§Œ νŒλ‹¨)

data class DataClass(val name: String, val email: String, val age: Int) {
	lateinit var address: String
    constructor (name: String, email: String, age: Int, address: String){
    	this(name, email, age)
        this.address = address
    }
} 

fun main() {
	val obj1 = DataClass("kang", "aaa@com", 10, "seoul")
    val obj2 = DataClass("kang", "aaa@com", 10, "busan")
    println("obj1.equals(obj2) : ${obj1.equals(obj2}}") // true - address κ³ λ € X
}

 

2) toString() ν•¨μˆ˜ : 객체의 데이터λ₯Ό λ°˜ν™˜

- μ£Ό μƒμ„±μžμ˜ λ§€κ°œλ³€μˆ˜μ— μ„ μ–Έλœ λ°μ΄ν„°λ§Œ 좜λ ₯ λŒ€μƒ

- 일반 클래슀둜 μƒμ„±ν•œ 객체의 toString() : 의미 μ—†λŠ” κ°’

- 데이터 클래슀둜 μƒμ„±ν•œ 객체의 toString() : 객체가 ν¬ν•¨ν•˜λŠ” 멀버 λ³€μˆ˜μ˜ 데이터λ₯Ό 좜λ ₯

println("data class toString : ${data.toString()}")
// 좜λ ₯
DataClass(name=kang, email=aaa@com, age=10)

 

였브젝트 클래슀

읡λͺ… 클래슀λ₯Ό λ§Œλ“€ λͺ©μ μœΌλ‘œ μ‚¬μš©

- 클래슀 이름이 μ—†μœΌλ―€λ‘œ 클래슀λ₯Ό μ„ μ–Έν•˜λ©΄μ„œ λ™μ‹œμ— 객체 생성

- νƒ€μž… λͺ…μ‹œν•˜μ§€ μ•Šμ„ 경우 μ½”ν‹€λ¦°μ˜ μ΅œμƒμœ„ νƒ€μž…μΈ Any둜 μ·¨κΈ‰ -> 보톡은 νƒ€μž…κΉŒμ§€ ν•¨κ»˜ μž…λ ₯

var/val λ³€μˆ˜ = object {클래슀 λ‚΄μš©}
open class Super() { open var data = 10 }
val obj = object: Super() { override var data = 20 } // Super 클래슀 상속
fun main() { obj.data = 30 }

 

μ»΄νŒ¨λ‹ˆμ–Έ 클래슀

멀버 λ³€μˆ˜λ‚˜ ν•¨μˆ˜λ₯Ό 클래슀 μ΄λ¦„μœΌλ‘œ μ ‘κ·Όν•˜κ³ μž ν•  λ•Œ μ‚¬μš©

- 객체λ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³ μ„œλ„ 클래슀 μ΄λ¦„μœΌλ‘œ νŠΉμ • 멀버λ₯Ό μ΄μš©ν•  수 있음

class MyClass {
	companion object {
    	var data = 10
        fun some() { println(data) }
    }
}

fun main() {
	val obj = MyClass()
    	obj.data = 20 // 성곡
 	MyClass.data = 20 // 성곡
    MyClass.some() // 성곡
}

 

+ 코틀린은 static ν‚€μ›Œλ“œλ₯Ό μ§€μ›ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ»΄νŒ¨λ‹ˆμ–Έ ν΄λž˜μŠ€λŠ” 결과적으둜 static 역할을 ν•œλ‹€. 

κ·Έλ ‡λ‹€λ©΄ μ™œ static을 쓰지 μ•ŠλŠ”κ°€? μžλ°”λŠ” λͺ¨λ“  것을 클래슀 내뢀에 μ„ μ–Έν•˜λ―€λ‘œ 객체둜 묢일 ν•„μš”κ°€ μ—†λŠ” λ©€λ²„λŠ” static으둜 μ„ μ–Έν•˜μ§€λ§Œ, 코틀린은 μ΅œμƒμœ„μ— ν•¨μˆ˜λ‚˜ λ³€μˆ˜λ₯Ό μ„ μ–Έν•  수 μžˆμ–΄μ„œ 객체둜 μ΄μš©ν•  ν•„μš”κ°€ μ—†λŠ” 멀버λ₯Ό ꡳ이 ν΄λž˜μŠ€μ— μ„ μ–Έν•˜μ§€ μ•Šμ•„λ„ 되기 λ•Œλ¬Έ. 

-> ν΄λž˜μŠ€μ— μ„ μ–Έν•˜λŠ” λ©€λ²„λŠ” λŒ€λΆ€λΆ„ 객체둜 μ΄μš©ν•΄μ•Ό ν•˜μ§€λ§Œ, ν΄λž˜μŠ€μ— μ„ μ–Έν•œ 멀버λ₯Ό μžλ°”μ˜ static처럼 μ΄μš©ν•  λ•Œκ°€ μžˆμœΌλ―€λ‘œ companion 클래슀λ₯Ό μ§€μ›ν•˜λŠ” 것

λŒ“κΈ€