Do it 코틀린 정리 - 4,5강 (kotlin 클래스)

박경현·2024년 1월 6일
0

항상 객체지향을 보면 클래스 단위로 객체를 만든다
그렇다면 객체지향은 왜 클래스를 중요하게 여길까? - 근본적인 질문을 던져보자

그전에 "객체지향이 무엇인지?" 에 대한 질문을 던져보자

현실세계는 사물(여기서는 객체로 표현)로 이루어져있고 모든 사건들은
객체들의 상호작용으로 이루어진다


여기서 객체는 객체를 이루는 데이터와 그 데이터의 조작법이 포함된다
그리고 이것을 다루는 것이 바로 객체지향이다!!


클래스는 객체일끼? - 클래스는 객체를 만들 수 있는 하나의 설계도이다
그렇다면 위에 질문에 답할 수가 있게 된다

객체지향에서는 객체를 다루는 것이 핵심인데 이 객체는 클래스를 통해 만들어진다
그렇기에 객체지향에서는 클래스가 중요하다!!


코틀린에서 클래스

안드로이드 앱은 sdk가 제공하는 클래스를 상속받아 개발을 하기에 개발자는
주로 클래스를 다루게 됩니다

자바에서는 그냥 클래스 이름만 있는 클래스는 아무 의미가 없다

하지만 코틀린의 경우 클래스의 생성자를 본문이 아닌 선언부 (클래스 이름 옆)에 작성할 수 있어서 그런 클래스도 의미가 있을 수 있다!

주생성자

바로 이 주 생성자가 선언부 옆에 생성자가 있는 것이다

주 생성자는 한 클래스에 하나만 가능하다!

여기서 생성자 매개변수에 val이나 var를 붙이면 클래스 내부 변수가 되지만
안 붙이면 생성자 한정 변수가 된다!

class User{
	init {
    	println("init...")
    }
    private var name = "kkang"
}
class User2(name:String, count: Int) {
	init {
    	println("name: $name, count: $count")
    }
}
class User3(private val name: String) {
	fun someFun() {
    	println("일반 함수에서 변수 사용가능! $name")
    }
}

보조 생성자

클래스 본문에 주로 constructor()라고 해서 여러개 생성자를 만드는데
이게 보조 생성자들이다!

val or var는 내부 constructor에 매개변수에 적을 수 없다

주생성자와 보조 생성자 콜라보 및 왜 분리한걸까?

만약 주생성자와 보조생성자를 모두 선언하면 생성자끼리 연결해줘야한다!
this(매개변수 )로 반환을 해주면 됨!

분리이유는?
공통된 코드가 있는데 그 경우는 주생성자에 작성하면 된다 이렇게 각 의미가 있다!
객체를 여러개 형태로 생성할 수 있게 도와준다!

class User4(private val name: String) {
	constructor(name: String, count: Int) : this(name) {
    
    }
    constructor(name: String, count:Int, email: String): this(name, count) {
    
    }
}

상속과 생성자

코틀린은 신기하게도 기본적으로 상속을 막아놨다!!
그래서 상속을 하려면 open이라는 키워드를 작성해줘야한다!

추가로 하위클래스의 생성자에서는 상위클래스의 생성자가 있다면 이를 호출해주어야합니다

open class Super1(name: String) {
	
}
class Sub(name: String): Super(name) {
	
}

오버라이드 - 재정의

상속과 마찬가지로 open키워드가 필요하다! 추가로 하위에서는 override적어주기

open class Super1 {
	open var someData = 2
    open fun someFun() {
    	println("i am $someData")
    }
}
class Sub1: Super1() {
	override var someData = 10
    override fun someFun() {
    	println("Sub class someData -> $someData")
    }
}

접근 제한자

public - 모든 파일이나 클래스 가능 이게 기본
internal - 같은 모듈내에서 가능
protected - 상속관계의 하위 클래스만 가능
private - 함수 내부만

데이터 클래스

data키워드로 선언하며 자주 사용하는 데이터를 객체로 묶어줍니다

객체의 데이터를 비교해버리기 때문에 데이터 클래스로 같은 객체를 만들면 true가 나옵니다

차고로 주 생성자의 맴버변수가 같은지만 판단해서 보조 생성자가 다른건 신경 안쓴다

데이터클래스의 toString은 각 매게변수에 값이 뭐가 들어갔는지 알려줍니다
일반 클래스의 경우 의미 있는 데이터가 나오지는 않는다

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

fun main() {
	val data1 = DataClass("kkang", "a@com", 10)
    val data2 = DataClass("kkang", "a@com", 10)

    println("data : ${data1 == data2}")
    println("data toString -> ${data1.toString()}")
}

오브젝트 클래스

익명클래스를 만들 목적으로 사용, 선언과 동시에 객체로 생성해야한다

object클래스는 클래스의 타입까지 뒤에 같이 입력해야 다른데서 내부 변수나 함수를 불러서 사용이 가능하다

val obj = object: Super2() {
    override var someData = 10
    fun some() {
        println("data $data")
    }
}

fun main() {
	obj.someData = 30
}

컴패니언 클래스

멤버변수나 함수를 클래스 이름으로 접근하고자 할때 사용
객체를 생성하지 않고도 사용이 가능!

java의 static을 대체한다고 생각하자

코틀린은 객체로 묶일 필요가 없는변수나 함수를 최상위에 둘 수 있어서 굳이 멤버 static은 필요가 없다

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

fun main() {
	MyClass.some()
}
profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글