클래스 선언
// 클래스 선언
class User()
선언부: class User, 본문: 중괄호 {} 영역
본문에 입력하는 내용이 없다면 중괄호 생략 가능
// 클래스의 멤버
class User {
var name = "kkang"
constructor(name: String) {
this.name = name
}
fun someFun() {
println("name: $name")
}
class SomeClass {}
}
클래스 멤버: 생성자, 변수, 함수, 클래스
생성자
- constructor 키워드로 선언하는 함수
- 클래스 안에 다른 클래스 선언 가능
// 객체 생성과 멤버 접근
val user = User("kim")
user.someFun()
클래스는 객체 생성해 사용, 객체로 클래스 멤버에 접근
객체 생성 시 new 키워드 사용 X
객체 생성 → 생성자 자동 호출
⇒ 소괄호 안에 전달한 인자는 클래스에 선언되 생성자의 매개변수와 맞아야 함
주 생성자
생성자: 주 생성자/ 보조 생성자
// 주 생성자 선언
class User constructor() {
}
constructor 키워드로 클래스 선언부에 선언
주 생성자 선언은 필수 X 한 클래스에 하나만 가능
// constructor 키워드 생략 예
class User() {
}
constructor 키워드 생략 가능
// 매개변수 없는 주 생성자 자동 선언
class User {
}
클래스의 주 생성자 선언 X → 컴파일러가 매개변수가 없는 주 생성자를 자동으로 추가
주 생성자의 매개변수
// 주 생성자의 매개변수
Class User(name: String, count: Int) {
}
// 매개변수가 있는 생성자 호출
val user = User("kkang", 10)
객체 생성 시 매개변수 타입과 개수에 맞는 인자 전달
주 생성자의 본문 - init 영역
// 주 생성자 중괄호 때문에 오류 발생
class User(name: String, count: Int) {
// 주 생성자 본문
} { // 오류
// 클래스 본문
}
클래스/ 함수의 본문(실행 영역)은 중괄호 {}
주 생성자에는 {} 추가 불가능 → 클래스 선언부에 있기 때문
⇒ init 키워드 이용 → 주 생성자 본문 구현
클래스 안에서 init 키워드로 지정한 영역은 객체 생성 시 자동으로 실행
init 영역
- 반드시 선언 X → 주 생성자의 본문 구현 원할 때만 사용
- 보조 생성자로 객체를 생성할 때도 실행
- ㄴ보조 생성자 클래스 안에 선언 → {} 이용하여 본문 지정 가능
// init 키워드로 주 생성자의 본문 지정
class User(name: String, count: Int) {
init {
println("name : $name, count : $count") // 성공
}
fun someFun() {
println("name : $name, count : $count") // 오류
}
}
→ 실행 결과
I am init...
User 클래스에 주 생성자 선언, 클래스 본문에 init 영역 → 주 생성자의 본문 작성
⇒ main() 함수에서 User 클래스의 객체 생성 시 init 영역에 작성한 코드 자동 실행
생성자의 매개변수를 클래스의 멤버 변수로 선언하는 방법
생성자의 매개변수
- 생성자에서만 사용할 수 있는 지역 변수
// 생성자의 매개변수를 init 영역에서 사용하는 예
class User(name: String, count: Int) {
init {
println("name : $name, count : $count") // 성공
}
fun someFun() {
println("name : $name, count : $count") // 오류
}
}
주 생성자에 name, count 매개변수 선언 → init 영역, someFun() 함수 사용
→ 생성자 호출 시 init 영역 실행 → 접근 가능 but, 생성자의 매개변수는 지역 변수 → 다른 함수에서 사용 X
// 생성자의 매개변수를 다른 함수에서 사용하는 예
class User(name: String, count: Int) {
// 클래스 멤버 변수 선언
var name: String
var count: Int
init {
// 클래스 멤버 변수에 생성자 매개변수값 대입
this.name = name
this.count = count
}
fun someFun() {
println("name : $name, count : $count") // 성공
}
}
fun main() {
val user = User("kkang", 10)
user.someFun()
}
클래스의 멤버 함수 someFun()에서 생성자의 매개변수 이용
→ 클래스의 멤버 변수 선언 , 주 생성자의 본문 init 영역에서 매개변수값을 클래스의 멤버 변수에 대입
// 생성자의 매개변수를 클래스의 멤버 변수로 선언하는 방법
class User(val name: String, val count: Int) {
fun someFun() {
println("name : $name, count : $count") // 성공
}
}
fun main() {
val user = User("kkang", 10)
user.someFun()
}
매개변수 → var나 val 키워드로 선언 → 클래스의 멤버 변수
함수는 매개변수 선언시 var나 val 키워드 추가X
주 생성자만 유일하게 var나 val 키워드로 매개변수 선언 가능
보조 생성자
보조 생성자
- 클래스 본문에 constructor 키워드로 선언하는 함수
- 클래스 본문에 선언 → 여러 개 추가 가능
- 보조 생성자도 생성자 → 객체 생성 시 자동 호출
- 클래스 본문에 선언 → 생성자 본문을 중괄호 {}로 묶어 객체 생성과 동시에 실행할 영역 지정 가능
// 보조 생성자 선언
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 suer2 = User("kkang", 10)
}
→ 실행 결과
constructor(name: String) call...
constructor(name: String, count: Int) call...
보조 생성자에 주 생성자 연결
주 생성자와 보조 생성자 모두 선언 → 생성자끼리 필수 연결
// 주 생성자와 보조 생성자 선언 시 오류
class User(name: String) {
constructor(name: String, count: Int) { // 오류
(...생략...)
}
}
주 생성자가 없다면 보조 생성자 호출 시 문제 X
주 생성자가 있으므로 보조 생성자에서 주 생성자 호출
// 보조 생성자에서 주 생성자 호출
class User(name: String) {
constructor(name: String, count: Int): this(name) { // 성공
(...생략...)
}
}
fun main() {
val user = User("kkang", 10)
}
보조 생성자는 객체 생성 시 호출
클래스 내 주 생성자가 있을 경우 this() 구문 이용 → 주 생성자 호출
ex. 보조 생성자 선언부에 this(name) 추가
// 보조 생성자가 여럿일 때 생성자 연결
class User(name: String) {
constructor(name: String, count: Int): this(name) {
(...생략...)
}
constructor(name: String, count: Int, email: String): this(name, count) {
(...생략...)
}
}
fun main() {
val user = User("kkang", 10, "a@a.com")
}
주 생성자가 있는 상태에서 보조 생성자 여러 개 선언
→ 보조 생성자에서 this()로 다른 보조 생성자 호출 가능
ㄴ보조 생성자로 객체를 생성할 때 주 생성자가 반드시 호출되게 해야 함
'Programming Language > Kotlin' 카테고리의 다른 글
클래스를 재사용하는 상속 (0) | 2022.05.20 |
---|---|
조건문과 반복문 (0) | 2022.05.20 |
변수와 함수 (0) | 2022.05.20 |
코틀린 언어 소개 (0) | 2022.05.20 |