본문 바로가기
Language/Kotlin

Kotlin(코틀린) 개념잡자! 문법 및 사용법 정리(3)

by 나비와꽃기린 2020. 1. 3.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 

이 글은 초보자를 위한 Kotlin 예제 200 을 참고하였습니다.

더욱 자세한 설명은 직접 책을 구매해서 확인하세요~

 

 

1. 동반자객체(Companinon object)

코틀린에서는 static을 지원하지 않는다. static의 효과를 얻으려면 코틀린에서는 companion object를 사용하면 된다.

class Person private constructor(){ //5번째 줄의 create() 함수를 통해서만 Person 객체를 생성할 수 있게 하도록 생성자를 private으로 지정

	companion object {//companion object 정의
	
		fun create(): Person{ //Person의 인스턴스 생성.
			countCreated += 1 //지금까지 생성된 인스턴스 개수 반환
			return Person()
		}

		var countCreated = 0
			private set // 외부에서 값의 조작방지를 위해 setter 접근지정자를 private로
	}
}

fun main(args: Array<String>)
{
	val a = Person.create()  //companion object는 속한 클래스의 이름으로 접근할 수 있다.
	val b = Person.create()  //따라서 Person이라는 식별자는 Person이라는 companion object로 인식됨.
	println(Person.countCreated) //또한 companion object는 클래스당 한개만 존재할 수 있다.
}

 

2. inline함수

inline함수는 함수호출시, 실행흐름을 점프하지 않고 함수호출문 자체를 함수의 몸체로 대체하여

실행하는 것으로 성능을 조금이나마 개선할 수 있다.

다만 그렇다고 해서 모든함수를 inline으로 사용하는것은 금물이다!

inline함수는 함수 속 문장을 '재활용 하지 않아서' 문장이 긴~ 함수를 inline으로 사용하면 오히려 성능이 더 나빠질 수 있다. 따라서 문장이 작은데 빈번히 호출되는 함수들만 inline을 사용하는 것이 좋다.

inline fun hello()
{
	println("Hello")
	println("Kotlin")
}

fun main(args: Array<String>)
{
	hello()
	hello()
	hello()
	
	//--> 다음처럼 대체되어 실행됨
	//println("Hello")
	//println("Kotlin")
	//println("Hello")
	//println("Kotlin")
	//println("Hello")
	//println("Kotlin")
}

 

 

3. const

런타임에 할당되는 val과는 달리 컴파일 시간 동안 할당되는 const는 함수나 클래스의 생성자에는

결코 할당될 수 없고, 문자열이나 기본 자료형으로 할당되어 사용되어진다.

때문에 일반적으로 전역변수, 오브젝트의 프로퍼티 등에 사용되어져

companion object안에 상수로 선언되는게 일반적이다

companion object안에 const val로 선언한 변수는 자바에서의 static final의 형태로 동작한다.

companion object Constant{
	const val SUPER_USER : String = "ADMIN"
    }

 

4. lateinit

클래스의 프로퍼티는 선언과 동시에 초기화하거나 init블록안에서 초기화해주어야 하는데

이런 강제성을 피하기 위해 사용할 수 있는게 lateinit 예약어다.

class Point(val x: Int, val y: Int)

class Rect
{
	lateinit var pt: Point //lateinit으로 선언해줬기 때문에 해당 프로퍼티는 초기화하지 않아도 된다.
	lateinit var pt2: Point //lateini은 var프로퍼티에만 사용가능

	val width: Int
		get() = pt2.x - pt.x
	val height: Int
		get() = pt2.y - pt.y
	val area
		get() = width * height
}

fun main(args: Array<String>)
{
	val rect = Rect()
	rect.pt = Point(3, 3)
	rect.pt2 = Point(6, 5)

	println("Width: ${rect.width}")  //pt와 pt2에 lateinit 키워드를 붙이지 않고 접근하면 UninitializedPropertyAccessException 에러가 난다
	println("Height: ${rect.height}") 
	println("Area: ${rect.area}")
}