클래스 선언
// 클래스 선언
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() {
}
}
- 자바의 생성자는 생성자, 디폴트 생성자가 있다.
- 일반적인 생성자는 사용자가 직접 만드는 생성자이다.
- 디폴트 생성자는 클래스 내부에 생성자가 하나도 없을 때 자바 컴파일러에서 자동으로 생성하는 기본 생성자이다.
- 따라서 클래스 내부에 생성자가 없어도 객체 생성이 가능하다.
자바의 생성자 선언 규칙
- 클래스 명과 생성자 명이 동일해야 한다.
- 리턴타입이 없어야 한다.
'언어 > Kotlin' 카테고리의 다른 글
Java와 비교하는 Kotlin - 람다 함수와 고차 함수 (0) | 2022.11.05 |
---|---|
Java와 비교하는 Kotlin - 코틀린의 클래스 종류 (0) | 2022.11.05 |
Java와 비교하는 Kotlin - 클래스를 재사용하는 상속 (0) | 2022.11.05 |
Java와 비교하는 Kotlin - 조건문과 반복문 (0) | 2022.11.05 |
Java와 비교하는 Kotlin - 변수와 함수 (0) | 2022.11.05 |
댓글