kotlin 문법: "생성자"

SHY(code poet)·2024년 2월 13일

✨Kotlin에 관하여✨ 

목록 보기
16/36

② 생성자(Constructor) 작성하기 ⇒ ☆클래스 생성 시 함께 작성해줄 것!☆
: 작성된 클래스를 사용하기 위해서는 생성자라고 불리는 함수가 호출되어야 한다.
kotlin은 프라이머리(Primary)와 세컨더리(Secondary) 2개의 생성자를 제공한다.

※ 생성자->인스턴스->클래스 사용
★클래스를 직접 대입하여 사용하는 게 아니라, 클래스에 있는 생성자 함수를 호출해서 나온 인스턴스를 변수로 대입.
결국, 생성자란 클래스를 통해 객체를 만들어줄때, 가장 먼저 호출되는 함수.★
(그렇기에, 클래스가 받아야 되는 변수, 인자들을 생성자 속에 지정해둘 것)
->또한, 이렇게 생성자 함수를 호출하여 클래스에서 정의해 둔 속성과 메소드를 가진 데이터 객체를, 인스턴스라고 부른다.
생성자는 클래스가 처음 클래스를 통해 객체가 만들어질때, 즉, 호출되었을 때 가장 먼저 실행된다.

a. 프라이머리 생성자(Primaty Construntor)
※ constructor: 클래스를 사용하기 위해서 호출하는 일종의 함수.

  • 프라이머리 생성자는 마치 클래스의 헤더(데이터 앞부분에 파일에 대한 정보를 실어놓은 부분)처럼 사용할 수 있다.

class Person 프라이머리 생성자() { init 블록 ⇒ 형태에 집중하라!
}

  • 프라이머리 생성자도 결국은 함수이기 때문에 파라미터를 사용할 수 있다.

class Person constructor(value: String){
// code
}

  • constructor 키워드를 사용해서 정의하는데, 생성자에 접근 제한자나 다른 옵션이 없다면 조건에 따라 키워드를 생략할 수 있다.

class Person(value: String){
// code
}

마치 헤더처럼 class 키워드와 같은 위치에 작성된다. 클래스의 생성자가 호출되면 init 블록의 코드가 실행되고, init 블록에서는 생성자를 통해 넘어온 파라미터에 접근할 수 있다.

class Person(value: String){
init{
Log.d("class", "(생성자로부터 전달받은 파라미터값)은 ${value}입니다.")
}
}

  • init(initialize) 초기화 작업이 필요하지 않다면 init 블록을 작성하지 않아도 된다.

  • 대신 파라미터로 전달된 값을 사용하기 위해서는 파라미터 앞에 변수 키워드인 val을 붙여주면 클래스 스코프 전체에서 해당 파라미터를 사용할 수 있다. 물론 생성자 파라미터 앞에 var도 사용할 수 있지만, 읽기 전용인 val을 사용하는 것을 권장한다.

class Person(val value: String) {
fun process() {
print(value)
}
}

b. 세컨더리 생성자 (Secondary Constructor) ⇒ 쉽게말해, 코드블록 안의 생성자
: 세컨더리 생성자는 constructor(생성자) 키워드를 마치 함수처럼 클래스 스코프 안에 직접 작성할 수 있다. 다음과 같이 init 블록을 작성하지 않고 constructor 다음에 괄호를 붙여서 코드를 작성할 수 있다.

class Person {
constructor (value: string) {
Log.d("class", "생성자로부터 전달받은 값은 ${value}입니다.")
// 밑줄 친 부분이 세컨더리 생성자
}
}

  • 파라미터의 개수, 또는 파라미터의 타입이 다르면 여러 개를 중복해서 만들 수 있다.

class Kotlin {
constructor (value: String){
Log.d("class", "생성자로부터 전달받은 값은 ${value}입니다.")
}
constructor (value: Int){
Log.d("class", "생성자로부터 전달받은 값은 ${value}입니다.")
}
constructor (value1: Int, value2: String){
Log.d("class", "생성자로부터 전달받은 값은 ${value1}, ${value2}입니다.")
}
}

c. Default 생성자

  • 생성자는 작성하지 않을 경우 파라미터가 없는 프라이머리 생성자가 하나 있는 것과 동일하다.

class Student { // 생성자를 작성하지 않아도 기본 생성자가 동작합니다.
init {
// 기본 생성자가 없더라도 초기화가 필요하면 여기에 코드를 작성합니다.
}
}

d. 데이터 클래스(data class) 생성자

data class 클래스명(val 파라미터1: 타입, var 파라미터2: 타입)

  • Kotlin은 간단한 값의 저장 용도로 데이터 클래스(data class)를 제공한다.
  • 데이터 클래스를 정의할 때 class 앞에 data 키워드를 사용해야 하고, 생성자 파라미터 앞에 입력하는 var(또는 val) 키워드는 생략할 수 없다.
  • 생성하는 코드는 일반 클래스와 동일하게 작성한다.

// 생성자 정의 - 주로 코드 블록(클래스 스코프)을 사용하지 않고 간단하게 작성합니다.
data class UserData(val name: String, var age: Int)
// 인스턴스 생성 - 일반 class의 생성자 함수를 호출하는 것과 동일합니다.
var userData = UserData("Michael", 21)

// name은 val로 선언되었기 때문에 변경 불가능합니다.
userData.name = "Sindy" // (X)
// age는 var로 선언되었기 때문에 변경 가능합니다.
userData.age = 18 // (O)

profile
진정한 개발자는 코드를 두려워하지 않는다. 오히려 코드가 그를 두려워한다.

0개의 댓글