클래스명()
위와 같이 클래스의 이름에 괄호를 붙여서 클래스 생성자를 호출한다.
아무런 파라미터 없이 클래스명에 괄호를 붙여주면 생성자가 호출되면서 init 블록 안의 코드가 자동으로 실행된다.
var kotlin = Kotlin()
클래스의 생성자를 호출한 후 생성되는 것을 인스턴스라고 하는데, 생성된 인스턴스를 위와 같이 변수에 담아 사용한다.
호출 -> 생성자(함수) -> 생성 -> 인스턴스
위 순서로 클래스 인스턴스가 만들어진다.
클래스 내부에 정의되는 변수와 함수를 멤버 변수, 멤버 함수라고 부른다. 그리고 또 다른 용어로 프로퍼티, 메서드라고 부른다.
클래스의 변수 > 멤버 변수 > 프로퍼티
클래스의 함수 > 멤버 함수 > 메서드
안드로이드에서 프로퍼티라고 하는게 뭔지 애매했는데 이제야 알았다. 그냥 이름만 바꾼거였구나;;
class 클래스명 {
var 변수A > 프로퍼티 : 함수 밖에 있어야 한다.
fun 함수() {
var 변수B > 변수(또는 지역 변수) : 함수 안에 있어야 한다.
}
}
클래스 안에 정의된 변수는 프로퍼티라고 하지만 그 중에서도 함수 안에 정의된 변수는 프로퍼티라고 하지 않고 그냥 변수(또는 지역 변수) 라고 한다.
class Pig {
var name: String = "Pinky"
fun printName() {
Log.d("class","Pig의 이름은 ${name}입니다.")
}
}
var pig = Pig()
// 인스턴스가 담긴 변수명 다음에 도트 연산자(.)를 붙여서 프로퍼티와 메서드를 사용한다.
pig.name = "Pooh" // 프로퍼티 재정의
pig.printName() // 함수 호출
실행결과 >
Pig의 이름은 Pooh입니다.
오브젝트(object)를 사용하면 클래스를 생성자로 인스턴스화 하지 않아도 블록 안의 프로퍼티와 메서드를 호출해서 사용할 수 있다. 자바를 알고 있다면 static과 같은 역할이다.
object Pig {
var name: String = "Pinky"
fun printName() {
Log.d("class","Pig의 이름은 ${name}입니다.")
}
}
Pig.name = "Mikey"
Pig.printName()
object 코드 블록 안의 프로퍼티와 메서드는 클래스명에 도트 연산자를 붙여서 생성자 없이 직접 호출할 수 있다. 주의할 점은 클래스명을 그대로 사용하기 때문에 호출하는 클래스명의 첫 글자가 대문자라는 것이다.
위 코드와 다르게 var pig = Pig() 라는 인스턴스화 작업이 없이도 프로퍼티와 메서드를 호출해 오는 것을 볼 수 있다.
object는 클래스와 다르게 앱 전체에 1개만 생성된다.
작업 중 자주 쓰이거나 필수적으로 쓰이는 코드들의 중복을 줄이기 위해 최고 클래스로써 object에 중복사용될 코드들을 선언해주고 각 클래스마다 상속해서 사용하는 용도로 쓰이지 않을까 싶다.
companion object는 일반 클래스에 object 기능을 추가하기 위해서 사용한다.
앞에서 작성한 Pig 코드를 다음과 같이 companion object 블록으로 감싸주면 생성 과정 없이 오브젝트처럼 사용할 수 있다.
Class Pig {
companion object {
var name : String = "None"
fun printName() {
Log.d("class", "Pig의 이름은 ${name}입니다.")
}
}
fun walk() {
Log.d("class", "Pig가 걸어갑니다.")
}
}
companion object 덕분에 object 기능이 추가되었기 때문에 역시 var pig = Pig() 작업이 없다.
walk() 함수의 경우 companion object 밖의 코드이다.
// companion object 밖의 코드 사용하기
val cutePig = Pig() // Pig클래스 인스턴스화
cutePig.walk()
실행결과
Pig가 걸어갑니다.
Log.d 경우에도 Log 클래스의 메서드 d() 가 object 코드 블록 안에 만들어져 있기 때문에 생성자 없이 바로 호출해서 사용할 수 있었던 것이다.