[Kotlin 깃북] Ch3 코틀린 사용을 위한 기본 문법
7. 클래스와 설계 (1)
클래스 코드 작성하기
class 클래스 이름{
}
프라이머리 생성자
- 클래스의 헤더처럼 사용 ->class 키워드와 같은 위치에 작성
- 파라미터 사용 가능
- constructor 키워드를 사용하여 정의
-> 접근 제한자나 다른 옵션 없다면, 생략
- 클래스 생성자가 호출되면, init 블록의 코드 실행됨
- init 블록에서는 생성자를 통해 넘어온 파라미터에 접근 가능
- 초기화 작업이 필요하지 않다면, init 블록 작성하지 않아도 됨
class Person constructor(value: String){
}
class Person(value: String){
}
class Person(value: String){
init{
Log.d("class", "생성자로부터 전달받은 값은 ${value}입니다.")
}
}
- 생성자를 통해 넘어온 파라미터를 클래스 스코프 전체에서 사용하려면
-> 파라미터 val/var로 사용 (val 사용 권장)
class Person(val value: String) {
fun process() {
print(value)
}
}
세컨더리 생성자
- 클래스의 함수처럼 사용 -> 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}입니다.")
}
}
- init 블록이 먼저 실행된 후, 세컨더리 생성자 블록 안의 코드 실행됨
Default 생성자
- 생성자를 작성하지 않을 경우, 파라미터가 없는 프라이머리 생성자가 있는 것과 동일
클래스의 사용
클래스 안에 정의된 함수와 변수 사용
- 생성자를 통해 클래스의 인스턴스 생성 -> 변수에 저장
-> 변수에 도트 연산자(.) -> 프로퍼티와 메서드 사용
오브젝트
- 오브젝트(Object): 클래스의 인스턴스 생성 X 프로퍼티와 메서드 사용 가능
-> 클래스명에 도트 연산자 사용
object Pig{
var name: String = "Pinky"
fun printName() {
Log.d("class", "Pig의 이름은 ${name}입니다.")
}
}
Pig.name = "Mikey"
Pig.printName()
- 오브젝트는 클래스와 다르게 앱 전체에 1개만 생성됨
Companion Object
- 일반 클래스에 object 기능 추가
-> 클래스 인스턴스 생성 X 오브젝트처럼 사용 가능
class Pig {
companion object {
var name: String = "None"
fun printName(){
Log.d("class", "Pig의 이름은 ${name}입니다.")
}
}
fun walk() {
Log.d("class", "Pig가 걸어갑니다.")
}
}
Pig.name = "Linda"
Pig.printName()
val cutePig = Pig()
cutePig.walk()
데이터 클래스
- class 앞에 data 키워드 사용
- 생성자 파라미터 val/var 생략 불가능
- 주로 클래스 스코프 블록 사용 X -> 간단하게 작성하여 사용
data class 클래스명(val 파라미터1: 타입, var 파라미터2: 타입)
- 일반 클래스처럼 init 블럭, 메서드 사용 가능
- 주로 네트워크를 통해 데이터를 주고받거나, 로컬 앱의 데이터베이스에서 데이터를 다루기 위한 용도로 사용
toString() 메서드, copy() 메서드
- 일반 클래스에서 toString() 함수 사용 -> 인스턴스 주소값 반환
데이터 클래스에서 toString() 함수 사용 -> 클래스 프로퍼티 값 반환
data class UserData(val name: String, var age: Int)
var userData = UserData("Michael", 21)
Log.d("DataClass", "${userData.toString()}")
var newUserData = userData.copy()