본문 바로가기
언어/Kotlin

Java와 비교하는 Kotiln - 클래스와 생성자

by 개발짜 2022. 11. 5.

클래스 선언

// 클래스 선언
class User { }

// 클래스의 멤버
class User {
    var name = "IM" // 변수
    constructor(name: String){ // 생성자
        this.name = name
    }
    fun someFun() { // 함수
        println("name: $name")
    }
    class SomeClass { } // (내부) 클래스
}

// 객체 생성과 멤버 접근
val user = User("kim")
user.someFun()

[실행 결과]
kim
  • 클래스의 멤버에는 생성자, 변수, 함수, 클래스로 구성된다.
  • 코틀린에서 객체 생성할 때 new 키워드를 사용하지 않고 바로 객체 생성한다.

자바와 차이점

class User {
    String name; // 변수
    
    public User(String name) { // 생성자
        this.name = name;
    }
    
    void someFun() { // 함수
        System.out.println("name: " + name);
    }
    
    class SomeClass { } // (내부)클래스
}

// 클래스 객체 생성
User user = new User("kim");
user.someFun();

[실행 결과]
kim
  • 클래스의 멤버에는 생성자, 변수, 함수, 클래스로 구성된다.
  • 객체 생성할 때 new 키워드를 사용

주 생성자

// 주 생성자 선언
class User constructor(){
}

// constructor 생략
class User() {
}

// 매개변수가 없는 주 생성자 자동 선언
class User {
}

// 주 생성자의 매개변수
class User(name: String, count: Int){
}
  • 주 생성자는 constructor 키워드로 클래스 선언부에 선언한다.
  • 주 생성자 선언은 필수는 아니며 한 클래스에 하나만 가능하다.

 

주 생성자의 본문 - init 영역

class User(name: String, count: Int) {
	init{
    	println("init...")
    }
}

fun main() {
	val user = User("Lee", 10)
}

[실행 결과]
init...
  • init 영역은 꼭 선언할 필요는 없고 주 생성자의 본문을 구현하고 싶을 때 사용한다.

 

생성자의 매개변수를 클래스의 멤버 변수로 선언하는 방법

// 생성자의 매개변수를 init 영역에서 사용하는 예
class User(name: String, count: Int) {
    init{
        println("name: $name, count: $count") // 성공
    }
    fun someFun() {
        println("name: $name, count: $count") // 오류
    }
}
  • 생성자의 매개변수는 기본적으로 생성자에서만 사용할 수 있는 지역 변수이다.

 

class User(name: String, count: Int) {
    var name: String
    var count: Int
    init{
        this.name = name
        this.count = count
        println("name: $name, count: $count")
    }
    fun someFun() {
        println("name: $name, count: $count")
    }
}
  • 다음과 같이 클래스 멤버 변수를 선언한 후 클래스 멤버 변수에 매개변숫값을 대입한다.

 

class User(val name: String, val count: Int) {
    fun someFun() {
        println("name: $name, count: $count")
    }
}
  • 매개변수를 var나 val 키워드로 선언하면 클래스의 멤버 변수가 되어 멤버 함수에서 사용할 수 있다.
주 생성자만 유일하게 var 나 val 키워드로 매개변수를 선언할 수 있음

보조 생성자

// 보조 생성자 선언
class User {
    constructor(name: String) {
        println("constructor(name: String) call...")
    }
    constructor(name: String, count: Int) {
        println("constructor(name: String, count: Int) call...")
    }
}
fun main() {
    val user1 = User("kkang")
    val user2 = User("kkang", 10)
}

[실행 결과]
constructor(name: String) call...
constructor(name: String, count: Int) call...
  • 보조 생성자는 한 클래스에 2개 이상 선언 가능하다.

 

보조 생성자에 주 생성자 연결

// 보조 생성자에서 주 생성자 호출
class User(name:String) {
    constructor(name: String, count: Int):this(name) {
		println("name: $name, count: $count")
    }
}
fun main() {
    val user1 = User("kkang")
    val user2 = User("kkang", 10) // 보조 생성자 호출
}

[실행 결과]
kkang, 10
  • 보조 생성자 선언부에 this(name)을 추가
  • this(name)으로 보조 생성자를 객체를 생성할 때 주 생성자가 함께 호출됨
  • 클래스 선언시 둘 중 하나만 선언하면 문제가 없으나 주 생성자와 보조 생성자 모두 선언한다면 반드시 생성자끼리 연결해 주어야 한다.

자바와 차이점

class User {
	String name;
    // 생성자
    public User(String name) {
    	this.name = name;
    }
    // 디폴트 생성자
    User() {
    }
}
  • 자바의 생성자는 생성자, 디폴트 생성자가 있다.
  • 일반적인 생성자는 사용자가 직접 만드는 생성자이다.
  • 디폴트 생성자는 클래스 내부에 생성자가 하나도 없을 때 자바 컴파일러에서 자동으로 생성하는 기본 생성자이다.
  • 따라서 클래스 내부에 생성자가 없어도 객체 생성이 가능하다.

 

자바의 생성자 선언 규칙
  • 클래스 명과 생성자 명이 동일해야 한다.
  • 리턴타입이 없어야 한다.

댓글