만약 특정 동작을 가지지 않고 오로지 데이터 저장을 위해서 사용한다면 일반적인 클래스가 가지는 구현부가 필요없을 수 있다. 메모리를 아낄 수 있다. 따라서 데이터 클래스라는 특별히 고안된 클래스가 존재한다. 그 외에도 실드 클래스, 이너 클래스, 열거형 클래스 등을 사용할 수 있다.
데이터 전달을 위한 객체를 DTO(Data Transfer Object)라고 부른다.
데이터 클래스의 조건
1. 주 생성자는 최소한 하나의 매개변수를 가져야 한다.
2. 주 생성자의 모든 매개변수는 val, var로 지정된 프로퍼티여야 한다.
3. 데이터 클래스는 abstract, open, sealed, inner 키워드를 사용할 수 없다.
하지만 필요하다면 init 블록을 넣어 간단한 로직을 포함할 수 있다.
클래스 내부에 또 다른 클래스를 설계하는 이유는 독립적인 클래스로 정의하기 모호한 경우나 다른 클래스에서는 잘 사용하지 않는 내부에서만 사용하고 외부에서는 접근할 필요가 없을 때가 있기 때문이다.
하지만 남용하면 의존성이 커지고 코드가 복잡해진다.
중첩된 Nested 클래스는 바로 바깥 클래스인 Outer의 멤버에 접근할 수 없다. 접근할 수 있는 방법은 Outer 클래스가 컴패니언 객체를 가지고 있을 때는 접근이 가능하다. 이 외의 방법은 inner 키워드를 통해 이너 클래스를 만들어야 한다.
이너 클래스는 바깥 클래스의 멤버들에 접근할 수 있다. 심지어 private 멤버도 접근이 가능하다.
private한 cpu에 접근할 수 있다.
특정 메서드의 블록이나 init 블록과 같이 블록 범위 내에서만 유효한 클래스다.
Led 클래스는 Smartphone 클래스의 메서드인 powerOn( )에서만 유효한 클래스다. 단, Led 클래스에서 외부의 멤버인 프로퍼티에는 접근할 수 있다.
익명 객체 기법으로 다중의 인터페이스를 구현할 수 있다.
인터페이스로 Switcher를 선언했다. 이후 Smartphone의 powerOn 메서드를 수정한다. object를 활용해 Switcher 인터페이스의 on 메서드를 구현하고 있다. Switcher 인터페이스로부터 만들어진 객체는 이름이 없으며 powerSwitch 프로퍼티를 위해 일회성으로 사용된다.
'봉인된'이라는 의미로 무언가 안전하게 보관하기 위해 묶어두는 것을 말한다. 실드 클래스 그 자체는 추상 클래스와 같기 때문에 객체를 만들 수는 없다. 생성자도 기본적으로는 private이며 private이 아닌 생성자는 허용하지 않는다.
같은 파일 안에서는 상속이 가능하지만, 다른 파일에서는 상속이 불가능하게 제한된다.
위 두 코드는 같은 코드다. 실드 클래스를 선언하는 두 가지 방법이다.
여러 개의 상수를 선언하고 열거된 값을 조건에 따라 선택할 수 있는 특수한 클래스다.