7. 클래스
7.1 클래스 선언 및 생성
7.1.1 클래스 선언
- class MyClass{ }
- 일반적으로는 파일 안에 파일명과 같은 이름의 클래스를 정의해 사용한다. 하지만 이는 강제 규칙이 아니며 코틀린
파일에 파일명과 같은 이름의 클래스가 없어도 상관은 없다.
- 클래스 내에 클래스를 선언해서 이용할 수도 있다.
- 클래스에는 프로퍼티, 메서드, 생성자, 클래스 등을 선언할 수 있다.
7.1.2 객체 생성
- 객체 생성은 클래스를 이용하기 위해 메모리를 할당하는 작업이며, 할당된 메모리를 객체명으로 참조하는 개념이다.
7.2 생성자
7.2.1 주 생성자(constructor)
- 하나의 클래스에 하나만 정의할 수 있다.
- 꼭 작성해야 하는 건 아니며 보조 생성자가 있다면 작성하지 않을 수 있음
- 주 생성자는 클래스 몸체가 아닌 헤더에서 클래스 이름 뒤에 선언한다.
- 만약 주 생성자에 별도의 수식 구문(어노테이션, 접근 제한자 등)이 없다면 constructor 예약어는 생략할 수 있다.
- 매개변수가 있는 주 생성자 : class Myclass constructor(name:String, age:Int)
- 일반 함수처럼 생성자의 매개변수에도 기본값을 명시할 수 있다.
- 생성자 초기화 블록 : 주 생성자는 {}를 가질 수 없다. => 클래스 내부에서 init 예약어로 따로 명시하는 기법을 사용.
- 생성자의 매개변수는 클래스의 초기화 블록(init)이나 프로퍼티에서는 접근할 수 있지만, 멤버 함수에서는 사용할 수
없다. 생성자의 매개변수를 프로퍼티에 대입하고 사용하던가, 생성자 내에서 val,var를 이용해 매개변수를 선언한다.
- 생성자의 매개변수명과 프로퍼티명을 같게 선언할 수 있지만, 초기화 블록은 생성자 매개변수를 이용하고 함수는
프로퍼티를 이용한다.
- 매개변수를 var, val로 선언한 경우에는 같은 이름의 프로퍼티가 있으면 컴파일 에러가 발생한다.
7.2.2 보조 생성자
- 클래스 몸체에 constructor 예약어로 선언한다.
- 보조 생성자를 선언했으면 주 생성자는 선언하지 않아도 된다.
- 컴파일러는 주, 보조 생성자 둘 다 선언하지 않았을 경우만 매개변수 없는 주 생성자를 추가한다.
- 생성자 오버로딩 : 하나의 클래스 내에 여러 개의 생성자를 선언한 상황을 의미한다.
- 주 생성자는 없고 보조 생성자만 있을때에도 초기화 블록은 객체 생성 때 가장 먼저 실행된다.
- 보조 생성자 매개변수는 초기화 블록, 함수에서 이용할 수 없다. 보조 생성자 내에서만 사용할 수 있다.
- 보조 생성자 내의 매개변수는 val, var로 선언할 수 없다. 클래스의 프로퍼터에 대입한 후 사용한다.
7.2.3 this()에 의한 생성자 연결
- 주 생성자를 선언했다면 보조 생성자는 무조건 주 생성자를 함께 호출해 주어야 한다. 보조 생성자 선언 영역에
this() 구문을 추가해 주 생성자를 호출한다.
- 주 생성자를 선언했다면 객체 선언 시 어떠한 경우라도 반드시 주 생성자는 실행되어야 한다.
- 보조 생성자를 선언했다 하더라도 주 생성자 초울문은 생략할 수 없다.
- 보조 생성자를 여러 개 선언하면 this()로 보조 생성자를 호출할 수는 있지만, 최종 주 생성자는 호출해야 한다.
※ 코틀린에서는 파일 내에 파일명과 같은 public 클래스를 강제하지 않는다.
※ 코틀린에는 new 연산자가 없다.
※ 코틀린의 생성자는 자바와 작성 방법 및 동작 원리가 많이 다르다.