// 객체 생성
fun main() {
val user = User("Kim")
user.someFun()
}
// 클래스 생성
class User {
var name = "mess"
constructor(name: String){
this.name = name
}
fun someFun() {
println("name: $name")
}
class SomeClass {}
}
주 생성자 선언은 constructor 키워드로 클래스 선언부에 선언하거나 키워드 생략가능.
class User constructor() {
}
class User() {
}
주 생성자 선언은 필수는 아니며 한 클래스에 하나만 가능.
개발자가 클래스의 주 생성자 선언하지 않으면 컴파일러가 매개변수가 없는 주생성자를 자동으로 추가.
class User {
}
주 생성자의 매개변수 예제
class User(name: String, age: Int){ // 매개 변수 2개 있는 클래스 생성
}
val user = User("Won", 23) // 객체 생성
class User(name: String, age: Int){
init {
println("생성자")
}
}
fun main() {
val user = User("Won", 23)
}
init 키워드를 사용하여 주 생성자의 본문을 구현할 수 있다. init은 보조 생성자로 객체를 생성할 때도 실행되나, 일반적으로 주 생성자의 본문을 구현하는 용도로 사용한다. 위 코드를 입력하면 아래 출력결과가 나오는 것을 알 수 있다.
생성자
class User(name: String, age: Int){
init {
println("$name $age") // 성공
}
fun someFun(){
println("$name $age") // 오류 발생
}
}
fun main() {
val user = User("Won", 23)
}
someFun()
함수는 오류가 발생한다.init
영역안에서 클래스 멤버 변수에 생성자의 매개변숫값을 대입하는 것을 알 수 있다.class User(name: String, age: Int){
// 클래스 멤버 변수 선언
var name: String
var age: Int
init {
// 클래스 멤버 변수에 생성자 매개변숫값 대입
this.name = name
this.age = age
}
fun someFun(){
println("$name $age") // 성공
}
}
fun main() {
val user = User("Won", 23)
user.someFun()
}
Won 23
class User(val name: String, val age: Int){
fun someFun(){
println("$name $age") // 성공
}
}
fun main() {
val user = User("Won", 23)
user.someFun()
}
따라서 위 코드에서 생성자의 매개변수 name
과 count
를 someFun()
멤버 함수에서 사용할 수 있다.
class User {
constructor(name: String){
println("생성자 (name: String) 호출")
}
constructor(name: String, age: Int){
println("생성자 (name: String, age: Int) 호출")
}
}
fun main() {
val user1 = User("Yoon")
val user1 = User("Won", 23)
}
주 생성자와 보조 생성자를 모두 선언하면 생성자끼리 연결해주어야 한다.
class User(name: String){
constructor(name: String, age: Int){ // 오류
println("생성자 (name: String, age: Int) 호출")
}
}
class User(name: String){
constructor(name: String, age: Int): this(name) { // 성공
println("생성자 (name: String, age: Int) 호출")
}
}
fun main() {
val user1 = User("Won", 23)
}
this(name)
만 추가하면 보조 생성자로 객체 생성시 주 생성자가 함께 호출된다.
class User(name: String){
constructor(name: String, age: Int): this(name) {
println("생성자 (name: String, age: Int) 호출")
}
constructor(name: String, age: Int, email: String): this(name, age) { // 성공
println("생성자 (name: String, age: Int, email: String) 호출")
}
}
fun main() {
val user1 = User("Won", 23, "youn.com")
}
위의 코드처럼 보조 생성자에서 this()
로 다른 보조 생성자를 호출할 수도 있다. 이때 보조 생성자로 객체를 생성한다면 주 생성자가 호출되게 해야 한다.
Reference
Book: 깡샘의 안드로이드 프로그래밍 with 코틀린