๐ก์์ฑ์, ์์, ์ถ์, interface๐ก
โช๏ธ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ
ยท ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉ๋๋ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ ๊ธฐ๋ฅ์ ๊ฐ์ฒด๋ก ๋ฌถ์ด์ ๊ด๋ฆฌํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ๋ฒ์ด๋ค.
ยท ๋งค๊ฐ์ฒด ํ๋์ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด์๋ ๊ฐ์ฒด ํ๋๊ฐ ํ์ํ๋ฉฐ ๊ด๋ฆฌํ๊ณ ์ ํ๋ ๋งค๊ฐ์ฒด์ ์๋งํผ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํ๋ค.
fun main() {
// ๊ฐ์ฒด ๋ง๋ค๊ธฐ
val obj1 = TestObject()
val obj2 = TestObject()
// obj1์๋ ์ด๋ฏธ ๋ง๋ค์ด๋
ผ ๊ฐ์ฒด๊ฐ ์์ผ๋ฏ๋ก obj3์๋ obj1์ ์ฃผ์๊ฐ์ด ๋ค์ด๊ฐ(๊ฐ์ ๊ฐ์ฒด)
val obj3 = obj1
// ๊ฐ์ฒด์ ์ฃผ์๊ฐ์ด ๋์ด
println("obj1 : $obj1")
println("obj2 : $obj2")
println("obj3 : $obj3")
}
class TestObject
๋ฉค๋ฒ ๋ณ์
fun main() {
val obj = TestObject()
println("num1, num2 : ${obj.num1}, ${obj.num2}")
// num1์ val๋ก ์ ์ธํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ฐ๊ฟ ์ ์์
// obj.num1 = 20
obj.num2 = 200
println("num1, num2 : ${obj.num1}, ${obj.num2}")
}
class TestObject {
// ๋ฉค๋ฒ ๋ณ์
val num1 = 10
var num2 = 100
}
๋ฉค๋ฒ ๋ฉ์๋(ํจ์)
fun main() {
val obj = TestObject()
obj.testMethod()
}
class TestObject {
// ๋ฉค๋ฒ ๋ฉ์๋
fun testMethod() {
println("testMethod ํธ์ถ")
}
}
โช๏ธ์์ฑ์
init
ยท ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์๋์ผ๋ก ์ํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ณณ์ด๋ค.
ยท init ์ฝ๋ ๋ธ๋ก์ ๋ง๋ค์ด ์ฃผ๋ฉด ๊ฐ์ฒด ์์ฑ ์ ์๋์ผ๋ก ์ฒ๋ฆฌ๋๋ ์ฝ๋๋ฅผ ๋ง๋ค ์ ์๋ค.
fun main() {
val obj = TestClass()
}
class TestClass {
init {
println("init ์ฝ๋์
๋๋ค")
}
}
constructor
ยท constructor๋ฅผ ์ด์ฉํ์ฌ ์์ฑ์๋ฅผ ์ ์ํ ์ ์๋ค.
ยท ๋งค๊ฐ ๋ณ์์ ๊ฐ์๋ ์๋ฃํ์ ๋ฌ๋ฆฌํ์ฌ ์ฌ๋ฌ ๊ฐ๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ ์ ์๋ค.
fun main() {
val obj1 = TestClass()
val obj2 = TestClass(10)
val obj3 = TestClass(10, 20)
}
class TestClass {
constructor() {
println("๋งค๊ฐ ๋ณ์๊ฐ ์๋ ์์ฑ์")
}
constructor(num1 : Int) {
println("๋งค๊ฐ ๋ณ์๊ฐ ํ ๊ฐ์ธ ์์ฑ์")
}
constructor(num1 : Int, num2 : Int) {
println("๋งค๊ฐ ๋ณ์๊ฐ ๋ ๊ฐ์ธ ์์ฑ์")
}
}
์ฃผ ์์ฑ์
ยท ํด๋์ค๋ช ์์ ๋ฐ๋ก ์ฃผ ์์ฑ์๋ฅผ ๋ง๋ค ์๋ ์๋ค.
class TestClass1 constructor(var num1 : Int, var num2 : Int)
// constructor ์๋ต ๊ฐ๋ฅ
class TestClass2 (var num1 : Int, var num2 : Int)
๋ณด์กฐ ์์ฑ์
fun main() {
// ๋งค๊ฐ ๋ณ์๋ฅผ ํ๋๋ง ๋ฃ์์ผ๋ฏ๋ก ๋ณด์กฐ ์์ฑ์๋ฅผ ํธ์ถ
val obj = TestClass(10)
}
class TestClass constructor(var num1 : Int, var num2 : Int) {
// ๋ณด์กฐ ์์ฑ์
constructor(num : Int) : this(num, 30) {
println("๋ณด์กฐ ์์ฑ์ ํธ์ถ")
}
}
โช๏ธ์์
ยท ํด๋์ค๋ฅผ ์ค๊ณํ ๋ ๋ค๋ฅธ ํด๋์ค๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ถ๋ถ์ ๋ฌผ๋ ค๋ฐ์ ๊ฒ์ ์๋ฏธํ๋ค.
ยท SuperClass : ์์์ ํด์ฃผ๋ ํด๋์ค(๋ถ๋ชจ)
ยท SubClass : ์์์ ๋ฐ๋ ํด๋์ค(์์)
ยท ๋ถ๋ชจ ํด๋์ค๋ open ํค์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฉฐ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์๋ฐ ์ฝ๋๋ก ๋ณ๊ฒฝ๋ ๋ final ํค์๋๊ฐ ๋ถ๋๋ค.
fun main() {
val sub = SubClass()
println("${sub.subMember}")
sub.subMethod()
// ์์์ ๋ฐ์๊ธฐ๋๋ฌธ์ ๋ถ๋ชจ์ ๋ฉค๋ฒ ๋ณ์, ๋ฉ์๋๋ฅผ ์ธ ์ ์์
println("${sub.superMember}")
sub.superMethod()
}
// ์์์ ํด์ค์ผ ํ๊ธฐ ๋๋ฌธ์ oepn์ ๋ถ์ฌ์ฃผ์
open class SuperClass {
var superMember = 100
fun superMethod() {
println("superMethod ํธ์ถ")
}
}
// ์์์ ๋ฐ์ ๊ฒฝ์ฐ ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถํด์ผ ํจ
// ๋งค๊ฐ ๋ณ์๊ฐ ์์ผ๋ฏ๋ก ()๋ง ํด์ค
class SubClass : SuperClass() {
var subMember = 100
fun subMethod() {
println("subMethod ํธ์ถ")
}
}
ยท ์์์ ๋ฐ์ ๊ฒฝ์ฐ ๋ฐ๋์ ๋ถ๋ชจ ํด๋์ค์ ์ฃผ ์์ฑ์๋ฅผ ๋ถ๋ฌ์ค์ผ ํ๋ค.
// ๋งค๊ฐ ๋ณ์๊ฐ ํ๊ฐ์ธ ๋ถ๋ชจ
// ์ฌ๊ธฐ์ ์ฃผ ์์ฑ์๋ ๋งค๊ฐ ๋ณ์ ํ๊ฐ์ง๋ฆฌ
open class SuperClass(var num : Int)
// ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค ํธํ๋๋ก ์ฐ๋ฉด ๋จ
class SubClass1 : SuperClass(100)
class SubClass2 : SuperClass {
constructor() : super(100)
}
โช๏ธ์ง์ฐ ์ด๊ธฐํ
lateinit
ยท var๋ก ์ ์ธ๋ ๋ณ์์ ์ด๊ธฐํ๋ฅผ ๋ค๋ก ๋ฏธ๋ฃฐ ์ ์๋ค.
ยท ๋ณ์์ ๊ฐ์ ์ฌ์ฉํ๊ธฐ ์ ์ ๋ฐ๋์ ์ด๊ธฐํ๊ฐ ์ด๋ฃจ์ด์ ธ์ผ ํ๋ค.
ยท val๋ก๋ ์ ์ธํ ์ ์์ผ๋ฉฐ ๋ฐ๋์ var๋ก ์ ์ธํด์ผ ํ๋ค.
fun main() {
val obj = LatClass()
obj.letMethod()
}
class LatClass {
lateinit var str : String
fun letMethod() {
// ::๋ ๋ฆฌํ๋ ์
์ด๋ผ ๋ถ๋ฅด๊ณ ํด๋น ๊ฐ์ฒด์ ๊ด๋ จ๋ ํด๋์ค๋ฅผ ํ์
ํ๊ธฐ ์ํด ์ฌ์ฉ
// isInitialized๋ ์ด๊ธฐํ ๋์ ์ด ์๋์ง ํ์ธํจ
if(!::str.isInitialized) {
str = "๋ฌธ์์ด"
println("$str")
}
}
}
by lazy
ยท val๋ก ์ ์ธ๋ ๋ณ์๋ by lazy ์ฝ๋ ๋ธ๋ก์ ์ด์ฉํ๋ฉด ๋๋ค.
ยท ์ฌ์ฉํ ๋ ๊ฐ์ ์ด๊ธฐํํ๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
fun main() {
val obj = BylClass()
println("str : ${obj.str}")
}
class BylClass {
val str by lazy {
println("str ์ฌ์ฉ")
"๋ฌธ์์ด"
}
}
โช๏ธabstract
ยท ์ถ์ ํด๋์ค, ์ถ์ ๋ฉ์๋ : ๊ตฌํ๋์ง ์์ ํด๋์ค์ ๋ฉ์๋
ยท ์ถ์ ํด๋์ค๋ฅผ ํตํด์๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์๋ค.
ยท ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ค๋ฉด ์ถ์ ํด๋์ค๋ฅผ ์์๋ฐ์ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ์ถ์ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
ยท ์ถ์ ํด๋์ค์ ๋ชฉ์ ์ ์์ ํด๋์ค์์ ๋ฉ์๋๋ฅผ Overriding ํ๊ฒ ํ๋ ค๋ ๊ฒ์ด๋ค. (๊ฐ์ ์ฑ ๋ถ์ฌ)
ยท ํด๋์ค๋ช ์์ open abstract๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.
fun main() {
// ์ถ์ ํด๋์ค๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์์
//val obj = AbsClass1()
val obj = AbsClass2()
obj.absMethod()
}
open abstract class AbsClass1 {
open abstract fun absMethod()
}
class AbsClass2 : AbsClass1() {
override fun absMethod() {
println("absMethod ํธ์ถ")
}
}
โช๏ธinterface
ยท ๊ฐ์ฒด์ ์ฃผ์ ๊ฐ์ ๋ค์ํ ํ์ ์ ๋ณ์์ ๋ด์ ์ ์๋๋ก ํ๊ณ ์ถ๋ค๋ฉด ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ๋ฉด ๋๋ค.
ยท ํด๋์ค๋ ํ ๊ฐ ์ด์์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ ์๋ค.
fun main() {
val obj = IntClass()
obj.inter1Method()
obj.inter2Method()
}
interface Inter1 {
fun inter1Method() {
println("inter1Method1 ํธ์ถ")
}
}
interface Inter2 {
fun inter2Method() {
println("inter2Method ํธ์ถ")
}
}
class IntClass() : Inter1, Inter2 {
override fun inter1Method() {
super.inter1Method()
println("IntClass์์ inter1Method ํธ์ถ")
}
override fun inter2Method() {
super.inter2Method()
println("IntClass์์ inter2Method ํธ์ถ")
}
}

'๐ฑ > ๐Kotlin' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Kotlin] ์ปฌ๋ ์ (1) | 2022.12.26 |
---|---|
[Kotlin] ํจ์ํ ํ๋ก๊ทธ๋๋ฐ (0) | 2022.12.26 |
[Kotlin] ๋ค์ํ ํด๋์ค (0) | 2022.12.20 |
[Kotlin] ์ ์ด๋ฌธ๊ณผ ๋ฐ๋ณต๋ฌธ (0) | 2022.12.20 |
[Kotlin] ๊ธฐ๋ณธ ๋ฌธ๋ฒ (0) | 2022.12.20 |