코틀린 : 클래스와 설계

mingsso·2023년 7월 2일
0

Java-Kotlin

목록 보기
16/17

클래스의 기본 구조

class 클래스명 {
	var 변수
    fun 함수() {
    }
}


작성된 클래스를 사용하기 위해서는 생성자가 호출되어야 하는데, 코틀린은 프라이머리와 세컨더리 2개의 생성자를 제공함

프라이머리 생성자

클래스의 헤더처럼 사용할 수 있으며 constructor 키워드를 사용해서 정의하는데, 조건에 따라 생략할 수도 있음

class Person constructor(value: String) {  }

생성자에 접근 제한자나 다른 옵션이 없다면 constructor 키워드를 생략할 수도 있음

클래스의 생성자가 호출되면 init 블록의 코드가 실행되고, init 블록에서는 생성자를 통해 넘어온 파라미터에 접근할 수 있음

class Person(value: String) {
	init {
    	Log.d("class", "생성자로부터 전달받은 값은 ${value}입니다")
    }
}


// init 초기화 작업이 필요하지 않다면 생략해도 됨
class Person(val value: String) {
	fun process() {
    	print(value)
    }
}

세컨더리 생성자

constructor 키워드를 마치 함수처럼 클래스 스코프 안에 직접 작성할 수 있음
또한, 파라미터의 개수나 타입이 다르다면 여러 개를 중복해서 만들 수 있음

class Person {
	constructor (value: String) {
    	Log.d("class", "생성자로부터 전달받은 값은 ${value} 입니다")
    }
}

Default 생성자

생성자는 작성하지 않을 경우 파라미터가 없는 프라이머리 생성자가 하나 있는 것과 동일함

class Student {
	init {	}
}



클래스의 사용

아무런 파라미터 없이 클래스명에 괄호를 붙여주면, 생성자가 호출되면서 init 블록 안의 코드가 자동으로 실행됨
세컨더리 생성자의 경우 init 블록이 먼저 실행되고, constructor 블록 안의 코드가 실행됨

var kotlin = Kotlin()



오브젝트

오브젝트를 사용하면, 클래스를 생성자로 인스턴스화 하지 않아도 블록 안의 프로퍼티와 메소드를 호출해 사용할 수 있음
앱 전체에 한 개만 생성됨

object Pig {
var name: String = "Pinky"
	fun printName() {
    	Log.d("class", "Pig의 이름은 ${name} 입니다")
    }
}

Pig.name = "Mikey"
Pig.printName()

컴패니언 오브젝트

일반 클래스에 object 기능을 추가하기 위해 사용함

class Pig {
	companion object {
    	var name: String = "None"
        fun printName() {
        	Log.d("class", "Pig의 이름은 ${name} 입니다")
        }
    }
   	fun walk() {
    	Log.d("class", "Pig가 걸어갑니다")
    }
}

// companion object 안의 코드 사용하기
Pig.name = "Linda"
Pig.printName()

// companion object 밖의 코드 사용하기
val cutePig = Pig()
cutePig.walk()



데이터 클래스

간단한 값의 저장 용도로 사용함

// 정의 - 주로 코드 블록을 사용하지 않고 간단하게 작성함
data class UserData(val name: String, var age: Int)

// 생성 - 일반 class의 생성자 함수를 호출하는 것과 동일함
var userData = UserData("Michael", 21)

// 일반 클래스처럼 사용하기
data class UserData(var name: String, var age: Int) {
	init {
    	Log.d("UserData", "initialized")
    }
    fun process() {	}
}


이처럼 클래스와 사용법이 동일하지만 주로 네트워크를 통해 데이터를 주고 받거나, 혹은 로컬 앱의 데이터베이스에서 데이터를 다루기 위한 용도로 사용함



클래스의 상속과 확장

상속 대상이 되는 부모 클래스는 open 키워드로 만들어야만 자식 클래스에서 사용할 수 있음

open class Parent {
	var hello: String = "안녕하세요"
    fun sayHello() {
    	Log.d("inheritance", "${hello}")
    }
}

class Child: Parent() {
	fun myHello() {
    	hello = "Hello!"
        sayHello()
    }
}

오버라이드

동일한 이름의 메소드나 프로퍼티를 사용할 필요가 있을 경우, override 키워드를 사용해서 재정의할 수 있음 (open 키워드를 붙어야 함)

open class BaseClass {
	open fun opened() {
    }
}

class ChildClass: BaseClass() {
	override fun opened() {
    }
}

익스텐션

코틀린은 클래스, 메소드, 프로퍼티에 대해 익스텍션을 지원하기 때문에, 이미 만들어져 있는 클래스에 메소드를 추가할 수 있음

fun 클래스.확장할 메소드() {	}
profile
🐥👩‍💻💰

0개의 댓글