KotlinInAction/코틀린 기초

클래스와 프로퍼티

webmaster 2022. 7. 25. 20:09
728x90

자바에서의 클래스 

public class Person {
  private final String name;

  public Person(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }
  
}
  • 필드가 둘 이상으로 늘어나면 생성자인 Person의 파라미터를 이름이 같은 필드에 대입하는 대입문의 수도 늘어난다.
  • 코틀린에서는 훨씬 더 적은 코드로 작성할 수 있다.
class Person(val name: String)
  • 코틀린 변환기를 사용해서 변환 할 수 있다.
  • 코드가 없이 데이터만 저장하는 클래스를 값 객체라고 부른다.
  • public 접근 제어자가 사라졌다.
    • 코틀린의 기본 접근 제어가는 public 이므로 이런 경우 생략해도 된다.

프로퍼티

자바에서는 데이터를 필드에 저장하며, 멤버필드의 접근성은 비공개로 한다.

클래스는 자신을 사용하는 클라이언트가 그 데이터에 접근하는 통로로 쓸 수 있는 접근자 메서드를 제공한다(getter, setter)

class Person(
    val name: String,
    var inMarried: Boolean
)
  • 자바에서는 필드와 접근자를 한데 묶어 프로퍼티라고 부른다.
  • 코틀린은 프로퍼티를 언어 기본 기능으로 제공하며, 자바의 필드와 접근자 메서드를 완전히 대신한다.
  • val로 선언한 프로퍼티는 읽기 전용이며, var로 선언한 프로퍼티는 변경 가능하다.
    • 코틀린은 값을 저장하기 위한 비공개 필드와 그 필드에 값을 저장하기 위한 Seter, Getter로 이루어진 디폴트 접근제어자를 제공한다.
    • val : getter , var = getter,setter 를 제공한다.

Person 클래스를 사용하기

public class UsePerson {
  public static void main(String[] args) {
    Person person = new Person("Bob", true);
    System.out.println("person.getName() = " + person.getName());
    System.out.println("person.isMarried() = " + person.isMarried());

  }
}

Kotlin에서 사용하기

fun main() {
    val person = Person("Bob", true);
    println(person.name);
    println(person.isMarried);
    person.isMarried = "Move" //변경 가능
}
  • 대부분의 프로퍼티에는 그 프로퍼티의 값을 저장하기 위한 필드가 있다.
  • 이를 뒷받침하는 필드라고 부른다.
  • 하지만 개발자가 원한다면 프로퍼티 값을 그때그때 계산 할 수도 있다.

커스텀 접근자

프로퍼티 접근자를 직접 작성하기

class Rectangle(val height: Int, val width: Int) {
    val isSquare: Boolean
        get() {
            return height == width;
        }
}
  • 프로퍼티에는 자체 값을 저장하는 필드가 필요 없다.
  • 이 프로퍼티에는 자체 구현을 제공하는 게터만 존재한다.
    • 클라이언트가 프로퍼티에 접근할 때마다 Getter가 프로퍼티 값을 매번 다시 계산한다.
  • get() = height == width 로 대체해도 된다.
  • 파라미터가 없는 함수를 정의하는 방식과 커스텀 게터를 정의하는 방식 중 차이점은 가독성뿐이다.

코틀린 소스코드 구조

자바의 경우 모든 클래스를 패키지 단위로 관리한다.

package geometry.shapes

import java.util.Random
class Rectangle(val height: Int, val width: Int) {
    val isSquare: Boolean
        get() {
            return height == width;
        }
}

fun createRandomRectangle(): Rectangle{
    val random = Random()
    return Rectangle(random.nextInt(), random.nextInt())
}
import geometry.shapes.createRandomRectangle

fun main(args: Array<String>) {
    println(createRandomRectangle().isSquare);
}
  • 코틀린에서의 패키징은 모든 코틀린 파일의 맨 앞에 package문을 넣어 관리한다.
  • 그러면 그 파일 안에 있는 모든 선언(클래스, 함수, 프로퍼티 등) 이 해당 패키지에 들어간다.
  • 같은 패키지에 속해 있다면 다른 파일에서 정의한 선언일지라도 직접 사용 가능하다.
  • 다른 패키지에 정의한 선언을 사용하려면 임포트를 통해 선언을 불러와야 한다.
  • 패키지 이름 뒤에.*을 추가하면 패키지 안의 모든 선언을 임포트 할 수 있다.
    • *(스타 임포트)를 사용하면 패키지 안에 있는 모든 클래스뿐 아니라 최상위에 정의된 함수나 프로퍼티까지 모두 불러오는 점을 유의하자
  • 코틀린에서는 여러 클래스를 한 파일에 넣을 수 있고, 파일의 이름도 마음대로 정할 수 있다.
    • 하지만, 대부분의 경우 자바와 같이 패키지별로 디렉터리 구성하는 편이 낫다
    • 자바의 방식을 따르지 않으면 자바 클래스를 코틀린 클래스로 마이그레이션 할 때 문제가 생길 수 있다.
728x90

'KotlinInAction > 코틀린 기초' 카테고리의 다른 글

코틀린의 예외 처리  (0) 2022.07.26
While과 for 루프  (0) 2022.07.26
enum과 when  (0) 2022.07.25
함수와 변수  (0) 2022.07.25