처음 접했을 때 매개변수랑 되게 헷갈렸던 개념. 개념정리하는 김에 적어두었다.
클래스를 통해 객체를 생성하면 무조건 호출되는 요소
특징)
종류)
// 생성자
constructor(){
println("TestClass2의 매개 변수가 없는 생성자")
}
// 매개변수의 개수나 타입을 다르게 하면 여러개의 생성자를 제공할 수 있다.
constructor(a1:Int, a2:Int){
println("TestClass2의 매개 변수가 있는 생성자")
println("a1 : $a1")
println("a2 : $a2")
}
= 객체를 생성할 때 자동으로 동작하는 부분.
= 프로퍼티 초기화를 위해 많이 씀.
= 생성자보다 먼저 동작함!
특징)
init{
println("TestClass1의 init 코드 블럭")
println("객체가 생성될 때 자동으로 동작하는 부분입니다")
println("Java 코드로 변환될 때 모든 생성자의 상단에 삽입되는 코드입니다.")
}
객체가 가지고 있는 멤버를 지칭하기 위해 사용한다.
특징)
class TestClass4{
// 멤버변수 a1, a2
var memberA1 = 0
var memberA2 = 0
constructor(memberA1:Int, memberA2:Int){
// 여기서 사용하는 memberA1과 memberA2는 매개변수를 지칭한다.
println("memberA1 : $memberA1")
println("memberA2 : $memberA2")
// 생성자나 메서드의 매개변수 이름과 멤버 변수의 이름이 같은 경우
// 매개변수가 출력된다.
// 맴버변수를 사용하고자 한다면 this를 사용한다.
// this는 객체 자기 자신을 가리키는 키워드이다.
this.memberA1 = memberA1
this.memberA2 = memberA2
}
constructor(매개변수) : 호출할 다른 생성자(매개변수)
constructor():this(1000, 2000){
println("매개변수가 없는 생성자 호출")
}
하나의 클래스에서 생성자가 여러 개 있을 경우 주 생성자를 지정할 수 있다.
특징)
주생성자가 아닌 다른 생성자들은 모두 주 생성자를 무조건 호출해야 한다.
주생성자를 호출하지 않으면 오류남 (강제성 부여로 실수 제어)
사실 헷갈렸던 이유가,, 코드 호출 될 때 '가장 먼저 호출'되는 친구들이라고 해서,, 그 개념에만 꽂혀서 혼동했던 건데 알고보니 전혀 다른 특징을 가지고 있었다.
주 생성자는 클래스의 속성을 정의, 매개변수를 받는 친구고
init블록은 java로 코드로 변환 시 모든 코드의 상단에 추가되는 코드다. 그래서 프로퍼티 초기화 하기 좋다는 것. 그리고 모든 생성자가 상단에 동일한 코드를 가지고 있을 때도 init블럭을 사용하면 간단히 중복 제거가 된다. 참 편리한 친구가 아닐 수 없다.