[Kotlin] 클래스 기본구조
코틀린도 자바처럼 class로 클래스를 선언하는데, 좀 다른게 많다.
코틀린은 클래스에 아무것도 안넣으면 중괄호도 안써도 된다.
그래서 아래는 유효한 코드다.

그리고 클래스의 객체 생성은 new가 없어도 된다.
아래는 멤버변수(필드)만 갖고있는 단순한 클래스 Person을 구현한 것이다.
멤버변수의 선언은 그냥 변수와 다를게 없다.
아래 코드들에서는 타입을 다 명시했지만, 바로 초기화한다면 타입을 생략해도 된다.

그리고 코틀린에서는 멤버변수들이 바로 저렇게 초기화가 되어있어야 한다.
아니면 에러가 난다.
이렇게


init 생성자
바로 초기화하지 않고 생성자를 써도 된다.
생성자는 init으로 선언한다. 다른 언어의 생성자와는 다르게, 파라미터는 받을 수 없다.


lateinit 키워드
그리고 lateinit 키워드를 쓰면 초기화를 뒤로 미룰수도 있다.
그대신 제약이 좀 있는데, nullable타입과 int 등의 프리미티브 타입에 사용할 수 없다는 것이다.
lateinit 변수를 초기화하지 않고 사용하면 예외를 뱉는다.


위에서 init을 생성자라고 부르긴 했는데, 저건 자바의 생성자와는 다르게 인자도 안받고 좀 모자란다.
인자를 받는 진짜 생성자를 봐보자.

자. 중괄호에 있던 멤버변수들이 위로 올라가서 함수의 파라미터처럼 변해버렸다. 저 부분을 진짜 메인 생성자라고 부른다.
참고로 저러면 구현부가 따로 없으니까 중괄호를 빼도 된다.


constructor
그리고 저러면 호출할때 반드시 저 순서대로 초기화를 반드시 해줘야한다. 생성자를 여러개 두고 취사선택하게 할 수는 없을까? 있다!
생성자를 추가로 정의하려면 constructor를 쓰면 된다.

추가 생성자는 일반 함수처럼 파라미터를 받을 수도 있다. 그리고 반드시 자기 자신의 생성자를 호출해야한다. this는 자기 자신을 뜻한다.
위의 생성자는 구현부가 없으니 아래처럼 중괄호를 빼도 된다.

참고로, 메인 생성자도 constructor를 붙일 수 있다. 메인 생성자에 접근제어자를 명시할 필요가 있을 때 사용한다.


메서드
메서드 선언은 함수와 별다를게 없다.
아래는 여태껏 쓰던 출력을 메서드로 집약한것이다.


접근제어
접근제어자는 대충 자바와 유사하다.
차이점이라면,
1.디폴트 접근제어자는 internal로 명시되고,
2.기본 접근제어가 public이라는 것이다.
아래는 private 메서드에 접근을 시도하는 코드다. 당연히 에러가 난다.


생성자에 선언된 멤버변수에도 붙을수있다.


Getter, Setter 등은 다음에 알아보자