본문 바로가기
2023년 이전/kotlin

코틀린(Kotlin)- 클래스와 프로퍼티, 그리고 디렉터리와 패키지

by JeongUPark 2019. 8. 21.
반응형

[출처 -  Kotlin In Action] [아래 내용들은 Kotlin In Action을 공부하면서 스스로 정리한 내용입니다] 

 

다음 Java Code와 Kotlin Code를 비교해보면

 

public class Person{
   private final String name;
   public boolean isMarried = false;

   public Preson(String name, boolean isMarried){
        this.name = name;
        this.isMarried = isMarried;
   }

   public String getName(){
       return name;
   }

   public void setMarried(boolean isMarried){
        this.isMarried = isMarried; 
   }
   public boolean isMarried(){
        return isMarried ;
   }
}
class Person{
  val name: String,
  var isMarried: Boolean
}

위의 두 code를 비교해보면 java code와 Kotlin code의 간결함 차이를 볼 수 있습니다.  (최신 JVM언어에서는 Kotlin과 유사하게 작성 가능하다고 합니다.)

 

그리고 디렉터리와 패키지의 경우 자바와 유사합니다.

 

package geomatry.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())
}

 

위에서 package geometry.shpaes 로 선언을 했습니다. 그러므로 다음과 같이

 

package geomatry.example
import geomatry.shapes.createRandomRectangle
fun main(args:Array<String>){
    println(createRandomRectangle().isSquare)
}

 

import를 통하여 fun createRandomRectangle()을 가져와 사용할 수 있습니다.
그리고 위의 shapes packge에서 Recangle class 안의 isSquare의 경우 다음과 같이 생략 가능합니다.

 

class Rectangle(val height: Int, val width : Int){
   val isSquare : Boolean
   get() = height == width
}

자 있때 Rectangle class 안에 get()이 보이는데 이 부분을 커스텀 접근자라고 합니다.

 

이 커스텀 접근자를 생성함으로써 createRandomRectangle().isSquare을 했을 때,  Rectangle class의 isSquere 값을 get()을 통하여 반환합니다. 만약, 위의 Rectangle class의 isSquere 에 대한 get이 없다면 다음과 같이 

 

class Rectangle(val height: Int, val width : Int){
   val isSquare : Boolean = false
}

isSquare를 초기화해주어야 합니다.

 

그리고 get이 있으니, set도 정의할 수 있습니다.

 

class Rectangle(val height: Int, val width : Int){
   val isSquare : Boolean
   get() = height == width
   
    
   var weight : Int = 10
   set(value){
   	field = value; 
   }
   get() = field;
        
}

fun main(args: Array<String>) {
    val rectangle = Rectangle(41, 43)
    println(rectangle.isSquare)
     println(rectangle.weight)
    rectangle.wegith = 100;
     println(rectangle.weight)
}

 

위의 code를 기준으로 설명을 드리면, 우선 val로 설정된 프로버티들은 변경이 불가능하여 get만 설정할 수 있습니다. 그리고 var weight의 경우에는 값을 10으로 초기화 하고, rectangle.weight= 100을 하면 set이 호출되고 그 value에 100이 들어가서 weight값이 100으로 설정이 됩니다.

이때, 사용된 field 값은 커스텀 프로퍼티 접근자에서 프로퍼티 값을 가리키는 값입니다. 이를 가리켜 backing field라 합니다. 이런 이유로 때문에 kotlin의 class에서는 field 식별자를 사용할 수 없습니다. 그리고 field 값은 커스텀 프로퍼티 접근자에서 사용하지 않는다면 생성되지 않습니다.

 

그래서 위 code의 결과 값은

false

10

100

으로 출력이 됩니다.

 

만일 set(value)에서 field 대신 wegith를 사용한다면, 이는 java의 경우

 

public void setwegith(int value){
  this.setwegith(value);
}

 

와 같이 재귀함수 처럼 무한 루프에 빠져 StackOverFlow가 발생합니다 get의 경우도 마찬가지 입니다.

그러므로 커스텀 프로퍼티를 사용하여 해당 프로퍼티의 값을 변경할 경우에는 반드시 field 값을 사용해야 합니다. 

 

반응형