✅공부하기에 앞서!
- 코드를 실행하는 것은 함수를 호출하는 것과 같다
- 클래스도 마찬가지로 클래스를 사용한다=class라는 이름으로 묶인 코드를 실행한다는 것
- 즉, 함수형태로 제공되는 생성자를 호출해야 클래스가 실행됨
- 코틀린은 클래스를 사용하기 위한 생성자로 프라이머리,세컨더리 생성자를 제공
✅프라이머리 생성자: default생성자
- 생성자를 작성하지 않을 경우 파라미터가 없는 프라이머리 생성자가 하나 있는 것과 동일하며 이때의 생성자를 '기본(default) 생성자'라고 함
class Person2 constructor() {}
class Person {}
fun main(args: Array<String>) {
Person()
var per:Person2=Person2()
}
- 파라미터가 있는 프라이머리 생성자: 프라이머리 생성자도 결국은 함수이기에 파라미터를 받을 수 있음
- 기본생성자 자동으로 만들어주지 않음!!
class Person4 constructor(name: String) {}
class Person5(name: String) {
fun main(args: Array<String>) {
Person4("홍길동")
}
class Person7(val name: String) {파라미터 앞에 변수 키워드를 붙임(val,var둘다 가능하지만 되도록이면 val사용)
fun person() {
for (item in 0..1) {
println(name)
}
}
}
class Person77( name: Int) {
val bal:Int=if(name>0) 0 else name
fun person() {
for (item in 0..1) {
}
}
}
✅세컨더리 생성자
- class블록 안에서 만든 생성자, 프라이머리 생성자와 다르게 오버로딩 가능
- 세컨더리 생성자가 있는 경우에도 기본생성자 저절로 만들어 지는거 아님!!
즉, Person9()로 객체 생성 불가
class Person9 {
constructor(name: String) {
println("내이름은 $name 이야")
}
constructor(age: Int) {
println("내 나이는 $age 야")
}
}
fun main(args: Array<String>) {
val personIns: Person9 = Person9("길동")
val PersonIns2 = Person9(24)
}
- 세컨더리 생성자의 파라미터를 전역변수로 사용하기:
- 세컨더리 생성자에서는 변수선언을 통해 전역변수로 만들기 불가능
- this. 사용해야 전역변수로 쓸 수있음
class Person11 {
var name: String = ""
var age: Int=0
constructor(name: String, age: Int){
this.name=name
this.age=age
}
}
✅프라이머리/세컨더리 생성자 동시에 사용하기
- 세컨더리 생성자가 호출될 때 프라이머리 생성자를 반드시 호출하도록 해야됨
- this()생성자 이용
class Car(engine:String,body:String) {
var door:String=""
constructor(engine: String, body: String, door: String): this(engine,body){
this.door=door
}
}
class Car2(var engine:String,var body:String) {
var door:String=""
constructor(engine: String, body: String, door: String): this(engine,body){
this.door=door
}
fun function(){
engine="엔진"
body="바디"
door="도어"
}
}
class Person33 constructor() {
constructor(name: String):this()
constructor(age: Int):this()
constructor(name: String, age: Int):this()
}
- 프라이머리 생성자만 있는거: 무조건 프라이머리 생성자 1개로 호출
- 세컨더리 생성자만 있는거: 세컨더리 생성자 오버로딩 했으면 여러방법으로 생성자 호출
*프라이머리에 기본()생성자 없어!! 세컨더리로 따로 만들어
- 프라이머리+세컨더리 생성자 둘다 있는거: 세컨더리 생성자 호출 시 프라이머리 생성자 무조건 호출되어야 해서 this()사용
✅init: 생성자 호출과 동시에 무조건 실행되는 코드
class Person6 {
init {
println("프라이머리-기본 생성자 호출시 자동 실행")
}
}
- 세컨더리 생성자:어떤 생성자로 호출되든 실행되기 때문에 세컨더리 생성자로 구현하는 경우 init실행->생성자 블록코드 실행 순서!
class Person9 {
init {
println("하이")
}
constructor(name: String) {
println("내 이름은 $name 이야")
}
constructor(age: Int) {
println("내 나이는 $age 야")
}
}
fun main(args: Array<String>) {
val person9Ins: Person9 = Person9("길동")
}
- 세컨더리 생성자 호출과 동시에 초기화: init블록없이 {}로 구현
class Person8 {
constructor(name: String, age: Int) {
}
}
package Kotlin
class Person {}
class Person2 constructor() {}
class Person6 {
init {
println("프라이머리 생성자 호출시 자동 실행")
}
}
class Person4 constructor(name: String) {}
class Person5(name: String) {
}
class Person7(val name: String) {
fun person() {
for (item in 0..1) {
println(name)
}
}
}
class Person77( name: Int) {
val bal:Int=if(name>0) 0 else name
fun person() {
for (item in 0..1) {
}
}
}
class Person3 {
constructor()
constructor(name: String)
constructor(age: Int)
constructor(name: String, age: Int)
}
class Person9 {
init {
println("하이")
}
constructor(name: String) {
println("내이름은 $name 이야")
}
constructor(age: Int) {
println("내 나이는 $age 야")
}
}
class Person8 {
constructor(name: String, age: Int) {
}
}
class Car(engine:String,body:String) {
var door:String=""
constructor(engine: String, body: String, door: String): this(engine,body){
this.door=door
}
}
class Car2(var engine:String,var body:String) {
var door:String=""
constructor(engine: String, body: String, door: String): this(engine,body){
this.door=door
}
fun function(){
engine="엔진"
body="바디"
door="도어"
}
}
class Person33 constructor() {
constructor(name: String):this()
constructor(age: Int):this()
constructor(name: String, age: Int):this()
}
fun main(args: Array<String>) {
Person()
Person2()
Person4("홍길동")
Person3()
Person3()
Person3("길동")
Person3(22)
Person3("길동", 22)
val person9Ins: Person9 = Person9("다빈")
val Person9Ins2 = Person9(24)
Person7("김").person()
dabin()
}