2024. 3. 6. 20:49, ๐ฑAndroid Study
๋ฐ์ํ
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