티스토리 뷰

본 포스팅의 내용은 [깡샘의 코틀린 프로그래밍]을 공부하고 작성자가 생각을 정리하기 위해서 작성한 글이므로 더욱 자세한 내용을 알고 싶으신 분은 [깡샘의 코틀린 프로그래밍]을 강력 추천합니다!!

1. 클래스 선언 및 생성

1. 1. 클래스 선언

class MyClass { }
class MyClass // 중괄호 생략 가능
  • 클래스를 선언할 때 클래스 몸체가 없다면 중괄호는 생략.
  • 일반적으로 파일 안에 파일명과 같은 클래스를 정의해 사용하지만 강제 규칙이 아니며 코틀린 파일에 파일명과 같은 이름의 클래스가 없어도 상관 없다.

1. 2. 객체 생성

  • 객체 생성은 클래스를 이용하기 위해 메모리를 할당하는 작업이며, 할당된 메모리를 객체명으로 참조해서 이용하는 개념이다.

2. 생성자

코틀린에서는 생성자를 주 생성자와 보조 생성자로 구분한다.

2. 1. 주 생성자

  • 주 생성자는 하나의 클래스에 하나만 정의할 수 있다.
    • 클래스 선언 부분에 작성
    • 하나의 클래스에 하나의 주 생성자만 정의 가능
    • 꼭 작성해야 하는 건 아니며 보조 생성자가 있다면 작성하지 않을 수 있음
  • 개발자가 별도로 선언한 생성자가 없다면 컴파일러가 자동으로 매개변수가 없는 주 생성자를 추가한다.
  • 만약 주 생성자에 별도의 수식 구문(어노테이션, 접근 제한자)이 없다면 constructor 예약어 생략 가능하다.

매개변수가 있는 주 생성자

class User1 constructor(name: String, age: Int){ }
class User2(name: String, age: Int = 0){ }
// ...
val user1 = User1() // 에러
val user2 = User1("weekyear", 29)
val user2 = User1("yumyum", 30)
  • 생성자의 매개변수에도 기본값을 명시할 수 있다.

생성자 초기화 블록 init

  • 주 생성자는 클래스 헤더에 명시하다 보니 실행문을 포함할 수 없다는 문제가 있다. 즉, 주 생성자는 { }를 가질 수 없다. 그래서 주 생성자의 실행 영역을 클래스 몸체에 init 예약어로 따로 명시하는 기법을 사용한다.
class User3(name: String, age: Int) {
    init {
        println("i am init..")
    }
}

생성자 매개변수 값 이용

  • 생성자의 매개변수를 이용할 때 제약이 있다. 클래스의 초기화 블록이나 프로퍼티에서는 접근할 수 있지만, 클래스에 정의된 멤버 함수에서는 사용할 수 없다.

생성자의 매개변수를 함수에서 사용하는 법

  1. 생성자의 매개변수를 클래스 프로퍼티에 대입하고 함수에서는 프로퍼티로 이용
class User4(name: String, age: Int) {
    val name = name
    fun sayHello() {
        println("hello $name")
    }
}
  1. 생성자 내에서 val, var을 이용해 매개변수를 선언하는 방법
class User5(val name: String, var age: Int) {
    fun sayHello() {
        println("hello $name")
    }
}
  • 생성자의 매개변수명과 프로퍼티명을 같게 선언할 수는 있지만 매개변수는 init 초기화 블록에서 이용하고 프로퍼티는 클래스 내의 함수에서 사용 가능하다.

2.2. 보조 생성자

  • 보조 생성자는 클래스 몸체에 constructor 예약어로 선언한다.
  • 말그대로 보조이기 때문에 주 생성자가 있다면 따로 선언하지 않아도 된다.

주 생성자 vs. 보조 생성자

  • 생성자를 하나만 선언해서 이용해도 된다면 주 생성자만 정의해서 이용하는 것이 좋다.
    • 코드 가독성 등의 이유로 굳이 클래스 몸체에 별도의 보조 생성자를 선언할 필요는 없다.
    • 가능하다면 생성자를 클래스 몸체와 분리하여 클래스 헤더에 선언하는 것이 더 읽기가 좋기 때문이다.

생성자 오버로딩

  • 자바와 거의 동일

보조 생성자와 초기화 블록

  • init으로 정의한 초기화 블록은 주 생성자든 보조 생성자든 객체 생성 때 가장 먼저 실행된다.

보조 생성자의 매개변수 사용

  • 보조 생성자 내의 매개변수에는 아예 val, var로 선언할 수 없게 금지되어 있다.

2. 3. this()에 의한 생성자 연결

  • 만약 주 생성자를 선언했다면 보조 생성자는 무조건 주 생성자를 함께 호출해줘야 한다. 즉, 보조 생성자에 주 생성자 호출 구문이 있어야 한다.
  • 같은 클래스 내에 선언된 다른 생성자를 호출할 때도 this() 구문을 이용한다.
  • 주 생성자를 선언했다면 객체 생성 시 어떠한 경우라도 반드시 주 생성자는 실행되어야 한다.
  • this() 구문은 생성자의 실행 영역인 { }에 작성하지 않고 생성자 선언 영역에 작성한다.
class User1(name: String) {
    init {
        println("init block... $name")
    }

    constructor(name: String, age: Int): this(name) {
        println("constructor ... $name .. $age")
    }
}

자바 vs 코틀린

  • 코틀린에서는 파일 내에 파일명과 같은 public 클래스를 강제하지 않는다.
    • 파일은 코드를 관리하기 위한 수단일 뿐이고 프로그램의 구성요소인 클래스와는 관련이 없다.
  • 코틀린에는 new 연산자가 없다.
  • 코틀린의 생성자는 자바와 작성 방법 및 동작 원리가 많이 다르다
    • constructor 예약어를 이용해 생성자 선언
    • 주 생성자와 보조 생성자로 구분
    • 생성자의 초기화 로직을 위해 init { } 구문을 사용
    • 주 생성자의 매개변수에 val, var를 추가하면 클래스의 프로퍼티가 되어 함수에서도 사용 가능
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함