연습장/이론
클래스 2. 주생성자와 보조생성자
아이른
2024. 1. 26. 16:49
- constructor(생성자)
: 인스턴스의 속성을 초기화 + 인스턴스 생성시 구문을 수행.(init로 호출)
: class 클래스명(속성) 클래스의 속성 선언 = 생성자 선언.
: 클래스를 만들 때, 기본적으로 선언(주생성자) + 필요에 따라 추가적으로 선언(보조생성자)
- 프라이머리 생성자(Primary Constructior)
: 주생성자. init{}
- 세컨더리 생성자(Secondary Constructor)
: 보조생성자. constructor(){}
- 주생성자와 init 사용.
: init 사용이 메소드보다 가장 먼저 호출 됨을 볼 수 있음.
fun main() { val Lan: Person = Person("혜란",30,"책읽기") Lan.name = "혜란" Lan.age = 30 Lan.hobby = "책읽기" println(Lan.name) Lan.walk("혜란") Lan.stop("혜란") } class Person(var name: String, var age: Int, var hobby : String){ init{ println("${name}, ${age}, ${hobby} 초기화 완료") } fun walk(name : String){ println("${name} 걷기") } fun stop(name : String){ println("${name} 멈추기") } } |
fun main(){ var a = Person("A", 1990) var b = Person("B", 2000) var c = Person("C", 2010) } class Person(var name:String, val birthYear:Int){ init{ println("${this.birthYear}년생 ${this.name}입니다") } } |
<print> 혜란, 30, 책읽기 초기화 완료 혜란 혜란 걷기 혜란 멈추기 |
<print> 1990년생 A입니다 2000년생 B입니다 2010년생 C입니다 |
: this_ 인스턴스 자신의 속성이나 함수를 호출하기 위해 클래스 내부에서 사용되는 키워드.
- 보조생성자와 constructor 사용.
: 보조 생성자를 만들 때에는 반드시 주생성자를 통해 속성을 초기화 해줘야 함.
: 주생성자 -> 보조생성자 순으로 호출.
fun main() { val Lan: Person = Person("혜란",30,"책읽기","여성") Lan.name = "혜란" Lan.age = 30 Lan.hobby = "책읽기" Lan.walk("혜란") } class Person(var name: String, var age: Int, var hobby : String){ init{ println("${name}, ${age}, ${hobby} 초기화 완료") } constructor(name : String, age : Int, hobby : String, gender: String) : this(name, age, hobby){ println("보조생성자 확인. ${gender}") } fun walk(name : String){ println("${name} 걷기") } } |
fun main(){ var a = Person("A", 1990) var b = Person("B", 2000) var c = Person("C", 2010) var d = Person("D") var e = Person("E") var f = Person("F") a.introduce("혜란",1994) } class Person(var name:String, val birthYear:Int){ init{ println("${this.birthYear}년생 ${this.name}입니다") } constructor(name:String): this(name, 1995){ println("보조 생성자가 사용되었습니다") } fun introduce(name:String, birthYear: Int){ println("${name}이고, ${birthYear}년생 입니다") } } |
<print> 혜란, 30, 책읽기 초기화 완료 보조생성자 확인. 여성 혜란 걷기 |
<print> 1990년생 A입니다 2000년생 B입니다 2010년생 C입니다 1995년생 D입니다 보조 생성자가 사용되었습니다 1995년생 E입니다 보조 생성자가 사용되었습니다 1995년생 F입니다 보조 생성자가 사용되었습니다 혜란이고, 1994년생 입니다 |
: 보조 생성자가 주생성자를 호출하도록 하려면 :this 사용하고 주생성자가 필요로 하는 파라미터를 ()안에 넣으면 됨.
: :this(name, 1995) 와 같이 birthYear 1995을 기본값으로 주생성자와 다른 형태의 생성자를 만들 수 있음.
- 보조생성자만으로 사용 가능. (주생성자 값 전부 제거)
: 주생성자가 있든 없든 init 사용 시, 최우선적으로 호출.
fun main() { val Lan: Person = Person("혜란",30,"책읽기") Lan.walk("혜란") val Han: Person = Person("혜란",30,"책읽기","여성") Han.walk("혜란") } class Person { init{ println("초기화 완료") } constructor(name : String, age : Int, hobby : String, gender: String){ println("보조생성자 확인. ${gender}") } constructor(name : String, age : Int, hobby : String){ println("보조생성자2 확인. ${name}, ${age}, ${hobby}") } fun walk(name : String){ println("${name} 걷기") } } |
fun main() { val Lan: Person = Person("혜란",30,"책읽기","여성") Lan.walk("혜란") val Han: Person = Person("혜란",30,"책읽기") Han.walk("혜란") } class Person { constructor(name : String, age : Int, hobby : String, gender: String){ println("보조생성자 확인. ${gender}") } constructor(name : String, age : Int, hobby : String){ println("보조생성자2 확인. ${name}, ${age}, ${hobby}") } fun walk(name : String){ println("${name} 걷기") } } |
<print> 초기화 완료 //호출 1 : val Lan > init 보조생성자2 확인. 혜란, 30, 책읽기 //호출 2 : val Lan > (첫번째 x)(두번째) constructor, name/age/hhobby 값 혜란 걷기 //호출 3 : val Lan > function 초기화 완료 //호출 4 : val Han > init 보조생성자 확인. 여성 //호출 5 : val Han > (첫번째) constructor, gender 값 혜란 걷기 //호출 5 : val Han > function |
<print> 보조생성자 확인. 여성 //호출 1 : (첫번째) constructor, gender 값 혜란 걷기 //호출 2 : val Lan > function 보조생성자2 확인. 혜란, 30, 책읽기 //호출 3 : val Lan > (첫번째 x)(두번째) constructor, name/age/hhobby 값 혜란 걷기 //호출 4 : val Han > function |