Class
1 Class
1.1 클래스 정의
class Person(val name:String)
동일한 Java
public class Person{
private final String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
1.2 프로퍼티
- 자바에서는 필드와 접근자를 한데 묶어 프로퍼티라고 합니다.
- 자바에서는 데이터를 필드에 저장하며 멤버 필드의 가시성을 일반적으로 private으로 정의합니다.
- 이 경우 클라이언트가 클래스의 필드에 접근이 필요한 경우 접근자 메서드를 사용합니다.
- 접근자 메서드는 getter와 setter가 있습니다.
- 코틀린은 프로퍼티를 언어 기본 기능으로 제공합니다.
- 코틀린의 프로퍼티는 자바의 필드와 접근자 메서드를 완전히 대신합니다.
- val로 선언한 프로퍼티는 읽기 전용입니다.
- 비공개 필드와 public getter를 만들어집니다.
- var로 선언한 프로퍼티는 읽기/쓰기가 가능합니다.
- 비공개 필드와 public setter와 getter를 만들어 냅니다.
1.3 커스텀 접근자
- 직사각형 클래스인 Rectangle을 정의하면서 자신이 정사각형인지 알려주는 기능을 만들어보자.
class Rectangle(val height:Int, val width:Int) {
val isSquare: Boolean
get () {
return height == width
}
}
- 정사각형인지를 별도의 필드에 저장할 필요가 없다.
- isSquare 프로퍼티에는 자체 값을 저장하는 필드가 필요없다.
- 이 프로퍼티에는 자체 구현을 제공하는 getter만 존재한다.
- 클라이언트가 프로퍼티에 접근할 때마다 getter가 프로퍼티 값을 매번 계산한다.
2 자바 클래스와 차이점
- 코틀린의 클래스는 기본적으로
final,pulic이다. - 중첩 클래스는 기본적으로 내부 클래스가 아니다.
- 외부 클래스에 대한 참조가 없다.
3 abstract class
- abstract로 선언한 클래스는 인스턴스화할 수 없다.
- 추상 멤버는 항상 열려있어 추상 멤버 앞에
open변경자를 명시할 필요가 없다.
예시
- 추상 클래스에는 abstract 변경자를 붙인다.
- 추상 메서드에도 abstract 변경자를 붙인다.
- 메서드에 abstract 변경자를 붙이지 않으면 추상 메서드가 아니다.
abstract class Animated {
// 추상 메서드
abstract fun animate()
// 비추상 메서드도 기본적으로 final이기 때문에 원한다면 open을 명시해야 함
open fun stopAnimating() {}
// 비추상 메서드 기본적으로 final
fun animateTwice() {}
}
4 nested class
- 자바처럼 코틀린에서도 클래스 안에 클래스를 정의할 수 있습니다.
- 클래스 안에 다른 클래스를 선언하면 도우미 클래스를 캡슐화하거나 코드 정의를 그 코드를 사용하는 곳 근처에 두는 데 유용합니다.