🚨 클래스와 생성자
class 클래스 선언
class User { ... }
- 클래스의 본문 내용이 없으면 {} 생략가능
- 생성자는 constructor 라는 키워드로 선언하는 함수
- 클래스 안에 다른 클래스 선언 가능
- 클래스의 멤버는 생성자, 변수, 함수, 클래스로 구성
- 클래스는 객체를 생성해 사용하며 객체로 클래스의 멤버에 접근한다
- 코틀린(Kotlin)에서는 객체를 생성할 때 new 키워드를 사용하지 않고, 클래스 이름과 같은 함수로 객체 생성
class User {
var name = "eun" //변수
constructor(name: String) { //생성자
this.name = name
}
fun someFun() { //함수
println("name : $name")
}
class SomeClass {} //다른 클래스
}
fun main() {
//객체 생성과 접근
var user = User("eeun")
user.someFun()
}
주 생성자
- 코틀린(Kotlin) 클래스는 생성자를 주생성자와 보조 생성자로 구분한다
- 주 생성자 선언은 필수는 아니며 한 클래스에 하나만 가능
- 주 생성자를 선언할 때 constructor 키워드는 생략 가능
- 주 생성자를 선언하지 않으면 컴파일러가 매개변수가 없는 주 생성자를 자동으로 추가함
- 주 생성자를 선언할 때 필요에 따라 매개변수 선언 가능
/* 주 생성자 선언 */
class User constructor() { ... }
/* constructor 키워드 생략 */
class User() { ... } //constructor 생략가능
/* 매개변수가 없는 주 생성자 자동 선언 */
class User { ... }
/* 주 생성자의 매개변수 */
class User(name: String, count: Int) { ... }
주 생성자의 본문 - init 영역
- 주 생성자는 클래스의 선언부에 있기 때문에 {} 를 추가해서 본문을 구현할 수 없다
- 클래스 안에서 init 키워드로 지정한 영역에 주 생성자의 본문을 구현할 수 있다
- 생성자의 매개변수는 생성자에서만 사용할 수 있는 지역변수다
- 주 생성자의 매개변수는 생성자 안에서만 사용할 수 있는 지역 변수지만,
매개변수를 var/var 키워드로 선언하면 클래스의 멤버 변수가 된다
/* 생성자의 매개변수를 init 영역에서 사용하는 예 */
class User(name: String, count: Int) {
init {
println("User > init() - name : $name") //생성자의 매개변수를 init 영역에서 사용
}
fun someFun() {
// println("someFun > name : $name") //사용불가! - 생성자의 매개변수는 생성자에서만 사용할 수 있는 지역변수다
}
}
/* 생성자의 매개변수를 다른 함수에서 사용하는 예 */
class User2(name: String, count: Int) {
//클래스 멤버변수 선언
var name: String
var count: Int
init {
this.name = name
this.count = count
println("User2 > init() - name : $name") //생성자의 매개변수를 init 영역에서 사용
}
fun someFun() {
println("User2 > someFun() - name : $name") //사용불가! - 생성자의 매개변수는 생성자에서만 사용할 수 있는 지역변수다
}
}
/* 생성자의 매개변수를 클래스의 멤버 변수로 선언
* - 주 생성자의 매개변수는 생성자 안에서만 사용할 수 있는 지역 변수지만 매개변수를 var/var 키워드로 선언하면 클래스의 멤버 변수가 된다
* */
class User3(val name: String, val count: Int) {
fun someFun() {
println("User3 > someFun() - name : $name, count : $count")
}
}
fun main() {
//User 클래스의 객체 생성과 접근
val user = User("eun", 10) // => User > init() - name : eun
//User2 클래스의 객체 생성과 접근
val user2 = User2("eun", 10) // => User2 > init() - name : eun
user2.someFun() // => User2 > someFun() - name : eun
//User3 클래스의 객체 생성과 접근
val user3 = User3("eun", 10)
user3.someFun() // => User3 > someFun() - name : eun, count : 10
}
보조 생성자
- 클래스의 본문에 constructor 키워드로 선언하는 함수
- 클래스 본문에 선언하므로 여러 개 추가 가능
- 보조 생성자도 생성자이므로 객체를 생성할 때 자동으로 호출된다.
- 생성자 본문을 중괄호 {} 로 묶어서 객체 생성과 동시에 실행할 영역을 지정할 수 있다
- 클래스 선언 시 주 생성자와 보조 생성자 모두 선언한다면 반드시 생성자끼리 연결해 주어야 한다
-> this() 구문을 이용해 주 생성자 호출
/* 보조생성자 선언 */
class User {
constructor(name: String) {
println("User > constructor(name) call ...")
}
constructor(name: String, count: Int) {
println("User > constructor(name, count) call ...")
}
}
/* 보조 생성자에서 주생성자 호출
* - 보조 생성자는 객체를 생성할 때 호출되며, 이때 클래스 내에 주 생성자가 있다면 this() 구문을 이용해 주생성자를 호출해야 한다.
* */
class User2 (name: String) {
constructor(name: String, count: Int) : this(name) { //보조 생성자로 객체를 생성할 때 주생성자가 함께 호출됨
println("User2 > constructor() - name : $name, count : $count")
}
}
/* 보조 생성자가 여럿일 떄 생성자 연결
* - 주 생성자가 있는 상태에서 보조 생성자를 여러 개 선언
* - 보조 샌성자를 여러개 선언한다면, 보조 생성자에서 this() 로 다른 보조 생성자를 호출할 수 있다
* */
class User3(name: String) {
constructor(name: String, count: Int) : this(name) {
println("User3 > constructor() - name : $name, count : $count")
}
constructor(name: String, count: Int, email: String) : this(name, count) {
println("User3 > constructor() - name : $name, count : $count, email : $email")
}
}
fun main() {
val user1 = User("eun") // => User > constructor(name) call ...
val user2 = User("eun", 20) // => User > constructor(name, count) call ...
val user3 = User2("eun", 30) // => User2 > constructor() - name : eun, count : 30
// => User3 > constructor() - name : eun, count : 40
// => User3 > constructor() - name : eun, count : 40, email : @@@
val user4 = User3("eun", 40, "@@@")
}
감사합니당~:)
'📱 안드로이드 Android ~ Kotlin' 카테고리의 다른 글
[Kotlin/코틀린] 5 - 상속과 클래스 종류 (data 클래스, object 클래스, companion 클래스) (1) | 2022.02.04 |
---|---|
[Kotlin/코틀린] 4 - 널(null) 안전성 (0) | 2022.02.04 |
[Kotlin/코틀린] 2 - 조건문과 반복문 (0) | 2022.02.04 |
[Kotlin/코틀린] 1 - 변수/상수, 데이터타입, 함수, 컬렉션 타입 (0) | 2022.02.04 |
[안드로이드/Android] Kotlin/Java 권한 요청 uses-permission (0) | 2021.12.30 |