[Kotlin 깃북] Ch3 코틀린 사용을 위한 기본 문법 7. 클래스와 설계 (1)

0
post-thumbnail

[Kotlin 깃북] Ch3 코틀린 사용을 위한 기본 문법

7. 클래스와 설계 (1)

클래스 코드 작성하기

class 클래스 이름{
	//클래스 스코프
}

프라이머리 생성자

  • 클래스의 헤더처럼 사용 ->class 키워드와 같은 위치에 작성
  • 파라미터 사용 가능
  • constructor 키워드를 사용하여 정의
    -> 접근 제한자나 다른 옵션 없다면, 생략
  • 클래스 생성자가 호출되면, init 블록의 코드 실행됨
    • init 블록에서는 생성자를 통해 넘어온 파라미터에 접근 가능
    • 초기화 작업이 필요하지 않다면, init 블록 작성하지 않아도 됨
//프라이머리 생성자
class Person constructor(value: String){
}

//constructor 키워드 생략
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가 걸어갑니다.")
    }
}

// companion object 안의 코드 사용하기
//클래스 인스턴스 생성 필요 X!
Pig.name = "Linda"
Pig.printName()    // Pig의 이름은 Linda입니다.

// companion object 밖의 코드 사용하기
//클래스 인스턴스 생성 필요!
val cutePig = Pig()
cutePig.walk()    // Pig가 걸어갑니다.

데이터 클래스

  • 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()}")
// userData(name=Michael, age=21)
  • copy() 메서드로 간단하게 값 복사 가능
var newUserData = userData.copy()
profile
Be able to be vulnerable, in search of truth

0개의 댓글