Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

DOing

[Kotlin] 함수 vs 메서드, 프로퍼티 vs 필드 본문

Java & Kotlin

[Kotlin] 함수 vs 메서드, 프로퍼티 vs 필드

mangdo 2022. 3. 28. 23:36

  자바에서는 자주 사용하지 않았던 용어 같은데, 코틀린에 오니 갑자기 많이 쓰이게 되는 용어들이 있다. 대충 느낌은 오니까 대수롭지 않게 넘겼는데, 찾아보니 분명한 차이가 있었고 이 차이들에서 코틀린의 특징을 담고 있다라고 느껴졌다. 이런 용어들 중에 대표적으로 함수와 메서드, 프로퍼티와 필드가 있었는데 이번 기회에 이런 용어들에 대해 분명하게 알고 가면 좋을 것 같아서 포스팅을 하게 되었다.


 

✏️  함수 vs 메서드

 코틀린의 기본적인 함수(function)은 fun 키워드로 시작한다. 이를 활용해서 톱레벨 함수, 클래스의 멤버함수, 함수 내부의 지역함수를 만들 수 있다. 또한 추가적으로 함수 리터럴을 활용해서 익명함수를 정의할 수도 있다.

 

   메서드(method)는 클래스와 연결된 함수를 의미한다. 멤버 함수(=클래스에 정의되어 있는 함수)는 해당 클래스와 연결되어 있으므로, 메서드다. 메서드를 호출하려면 클래스 인스턴스가 있어야하며, 이를 활용해서 참조해야한다. 확장함수를 메서드로 불러도 되는지에 대해서는 논란의 여지가 있지만, 대부분의 시각에서는 확장 함수도 호출할 때 인스턴스가 필요하므로 메서드로 보고 있다. 참고로 C#도 이러한 이유로 확장함수를 메서드로 정의하고 있다.

  클래스와 연결된 함수를 메서드라고 하기 때문에 자바에서는 공식적으로 메서드만 존재한지만, 학계에서는 정적 자바 메서드가 실제로는 함수라고 주장하기도 한다. 이에 반해 코틀린에서는 어떤 객체와도 연결되지 않은 함수(= 메서드가 아닌 함수)를 정의할 수 있다.

 

 

✏️  프로퍼티 vs 필드

  자바에서는 필드라는 용어를 주로 사용했지만, 코틀린에서는 필드라는 용어 대신 프로퍼티라는 용어를 더 사용한다. 그 이유는 사실 프로퍼티는 필드와 같지 않기때문이다. 프로퍼티는 실제로 데이터가 저장되는 공간(Field), 저장된 값을 읽으려고 할 때 호출되는 함수(Getter), 그리고 값을 저장하려고 할 때 호출되는 함수(Setter)로 이루어져 있다. 

  코드를 보면 더 자세히 이해가 될 수 있다. get()에 있는 field는 실제로 값이 저장된 프로퍼티 속의 변수를 나타내는 특수 식별자이다. 코틀린 공식 문서에 보면 backing field라는 용어를 사용하고 있다. 외부에서 프로퍼티를 이용할 때는 프로퍼티의 get(), set() 함수가 호출되지만, get(), set() 내부에서는 field 를 통해 프로퍼티가 가지고 있는 값에 접근한다. 이렇게 뒤에 숨어있는 필드라는 의미라는 뜻으로 backing field 라고한다.

  field 는 클래스 내에서 직접 선언이 불가능하다. 하지만 코틀린은 프로퍼티가 backing field를 필요로 할 경우 자동으로 제공하며, backing field 는 field 식별자를 이용해 접근자에서 참조될 수 있다. field 식별자는 프로퍼티의 접근자(getter,setter)에서만 사용할 수 있다는 것을 유의해야 한다.

 

 

 

✏️  Kotlin 프로퍼티의 특징

  val 프로퍼티는 초기 값이 주어지면 더이상 변경될 수 없다. 그래서 val 프로퍼티에는 Getter만 존재한다.

  val 프로퍼티에 Setter를 강제적으로 정의하려고 하면 오류가 발생한다. 프로퍼티에 디폴트 Getter, Setter가 포함되어 있기때문에 자바처럼 Getter, Setter를 하나하나 만들어줄 필요가 없다. 단, Getter, Setter의 동작을 커스텀하고 싶다면 별도로 정의해줘야한다.

 

 

 

Reference :

https://kotlinlang.org/docs/properties.html#backing-fields

이펙티브 코틀린(마르친 모스칼라 저)

초보자를 위한 코틀린 200제(엄민석 저)