Kotlin문법: "클래스 사용"

SHY(code poet)·2024년 2월 15일

✨Kotlin에 관하여✨ 

목록 보기
18/36

클래스 사용 (클래스 내부에 정의된 변수와 함수 사용)

ⓐ 생성자를 통해 변수에 저장된 클래스의 인스턴스는 내부에 정의된 변수와 함수를 도트 연산자(.)로 접근할 수 있다.

  1. 우선, 다음과 같이 프로퍼티 1개와 메서드 1개를 갖는 클래스를 만든다.

class Pig {
var name: String = "Pinky"
fun printName(){
Log.d("class", "Pig의 이름은 ${name}입니다.")
}
}
2. 위에서 정의한 클래스를 생성자로 다음과 같이 인스턴스화해서 변수에 담는다.
var pig = Pig() // 생성자를 호출하여 인스턴스를 만들고, 클래스를 다시 변수화하여 거기에 담기

  1. 인스턴스가 담긴 변수명 다음에 도트 연산자(.)를 붙여서 프로퍼티와 메서드를 사용한다.
    pig.name = "Pooh"
    pig.printName()
    /* 실행결과
    Pig의 이름은 Pooh입니다.
    /

ⓑ 오브젝트(생성자 호출X->바로 사용) = 인터페이스 상속 시에도 호출없이 바로 사용
⇒ 오브젝트(Object)를 사용하면 클래스 생성자로 인스턴스화 하지 않아도 블록 안의 프로퍼티와 메서드를 호출해서 사용할 수 있다. (Java의 static과 같은 역할)
object Pig{
var name: String = "Pinky"
fun printName() {
Log.d("class", "Pig의 이름은 ${name}입니다.")
}
}

  • object 코드 블록 안의 프로퍼티와 메서드는 클래스명에 도트 연산자를 붙여서 생성자 없이 직접 호출할 수 있다.

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

  • 주의할 점: 클래스명을 그대로 사용하기 때문에 호출하는 클래스명의 첫 글자가 대문자이다. 이에 반해, 상속자를 사용할 경우에는 var 안의 소문자 pig를 이용하는 것이기에 소문자.
  • 클래스와 다르게 앱 전체에 1개만 생성된다.
  • 컴패니언 오브젝트 (companion object) <- 세컨더리 생성자의 오브젝트 버전이라고 보자.
  • 컴패니언 오브젝트의 블록 안에서 변수와 함수를 정의하면 생성자를 통하지 않고 클래스의 멤버들을 사용할 수 있다.
  • 일반 클래스에 object 기능을 추가하기 위해 사용
  • 위에서 작성한 Pig 코드를 다음과 같이 companion object 블록으로 감싸주면 생성 과정 없이 오브젝트처럼 사용할 수 있다.
  • Log 클래스의 메서드 d(), e()가 모두 object 코드 블록 안에 만들어져 있기 때문에 생성자 없이 바로 호출해서 사용할 수 있다.

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

  • 위 Pig는 클래스로 선언했기 때문에 일반 함수인 walk()는 생성자인 Pig()를 호출한 다음 변수에 저장한 후에 사용할 수 있다. 다시말해, walk는 companion object에 속해있지 않으므로 생성자를 호출해서 사용해줘야 한다. 만약 class Pig를 Object Pig 라고 한다면, 바로 사용할 수 있겠지만. 그렇다고, fun walk를 companion object로 쓸 순 없다. object는 앱 전체에 1개만 쓸 수 있기에.

// companion object 안의 코드 사용하기 ⇒ 바로 사용
Pig.name = "Linda"
Pig.printName() // Pig의 이름은 Linda입니다.

// companion object 밖의 코드 사용하기 ⇒ 생성자 호출하여 사용
val cutePig = Pig()
cutePig.walk() // Pig가 걸어갑니다.

profile
진정한 개발자는 코드를 두려워하지 않는다. 오히려 코드가 그를 두려워한다.

0개의 댓글