지난 part4에서는 Data Class, Nested Class와 Inner클래스에 대해서 정리해 보았습니다.

이전 글은 아래링크를 클릭해주세요

>> Kotlin을 배워보자 part4 (Data Class, Nested and Inner Class)


이번 part5에서는 익명 inner class에 사용되는 Object Expression,

Singleton패턴을 위한 Object Declaration 

그리고 Java의 Static 함수를 대신하기 위해 사용하는 Companion Object 에 대해 정리해 보겠습니다.

1. Object Expression and Declaration

1-1. Object Expression

특정타입으로부터 상속받는 Anonymous inner 클래스를 만들 때

Object expressions을 사용하는데요.

이에 대해서 알아 보도록 하겠습니다.

 

object Expression은 특정 클래스로부터 상속받는 어떤 클래스를 변경하고,

익명으로 그 클래스의 객체를 전달해 주기 위해 사용합니다.

object키워드로 익명의 클래스로 만든 객체를 나타내는데요.

 

좀 더 이해하기 위해서 몇가지 예를 보면서 정리하도록 하겠습니다.

 

아래에서는 MouseAdapter를 상속받는 익명의 클래스가 있는데요.

이 클래스는 mouseClicked와 mouseEntered를 override해서 필요에 맞게 재정의 하였습니다.

그리고 이 객체를 addMouseListener에게 전달해 주었네요.

핵심은 "object:상속받는 클래스"와 같은 형식을 이용해서

특정 메소드를 override한 익명 클래스의 객체를 생성해 넘겨준다는 것이지요.

 

 

 

아래 코드는 안드로이드에서 사용될 것 같은데요.

View.OnClickListener 클래스를 상속받고 onClick을 override한 익명의 클래스의 객체를 받아서

setOnClickLIsterner에 넘겨주었습니다.

 

 

물론 위와 같이 변경해야 할 함수가 하나뿐인 경우 람다식으로 심플하게 아래와 같이 사용할 수도 있습니다.

이 작업은 Android Studio가 클릭한번으로 도와주지만 말이지요.

 

 

아래와 같이 상속받으려고 하는 클래스에 생성자가 있는 경우 인자를 넘겨주어야 합니다.

아래는 A클래스와 B인터페이스를 상속 및 구현하며

변수를 override하는 클래스의 익명의 객체를 만들어 ab에 담는 코드입니다.

 

 

특별히 상속받을 것이 없는 경우에도 object expression을 쓸 수 있는데요.

클래스 이름이 없을 뿐 객체로서 adHoc변수에 대입되었습니다.

 

 

object Expression을 이용함에 있어서 주의해야 할 것은

private이나 local로 사용되지 않고 public으로 사용된다면,

익명객체에 들어가 있는 변수나 함수에 접근할 수 없다는 점 입니다.

 

아래의 코드를 보면 private으로 표현된 object Expression에서는 name에 접근 가능하였지만,

public인 object Expression에는 에러가 난다는 것을 알 수 있습니다.

 

 

 

여기까지 object Expression에 대해서 알아보았는데요.

object declaration이라는 것도 있습니다.

 

1-2. Object Declarations

object declaration은 싱글턴 패턴을 쉽게 사용하도록 해 주는데요.

object키워드 뒤에 선언할 객체 명이 나옵니다.

생성자등을 이용해 객체를 생성하지 않고, 바로 object declaration을 한 이름을 통해 접근합니다.

 

아래 kotlin코드를 decompile해보면 왜 싱글턴 패턴을 사용하게 해주는지 알 수 있는데요.

 

위 코드를 디컴파일 해주면 아래와 같이 싱글턴 패턴의 Java파일을 만들어 주는 것을 알 수 있습니다.

 

 

실제로 object declaration을 이용하는 코드를 보도록 하겠습니다.

 

 

다른 클래스로부터의 상속이나, 여러 인터페이스의 구현도 가능한데요.

아래에서는 MouseAdapter 클래스를 상속하였습니다.

 

 

object declaration을 사용하면서 한가지 알아 두어야 할 점은,

object expression이 즉시 초기화 되어 객체가 생성되는 반면,

object declaration은 lazily(나중에) 객체에 처음으로 접근되어질 때, 초기화 되는데서 차이가 존재한다는 점 입니다.

전자는 객체가 바로 생성되는 것이고, 후자는 객체를 선언만 하고 나중에 생성되는 것이지요.

 

다시 한번 정리하면,

object Declaration은 한번 객체가 만들어지고 나서, 처음으로 접근되어 질 때, 메모리상에 초기화 되서 올라가구요.

다시 부르더라도 새로운 객체로 생성되어지지 않고, 싱글턴과 같이 그 객체를 그대로 사용합니다.

따라서 객체가 가지고 있는 값도 유지되겠지요.

 

2. Companion Object

Kotlin에서는 Static 함수라는 것이 없어서,

Java를 사용하던 개발자는 당황하게 되는데요.

그럴경우 Companion Object를 사용해주면 됩니다.

 

한가지 주의할 점은, Companion Object의 변수나 함수가 static하다고 생각하면 않된 다는 점 입니다.

Companion Object는 상속이나 구현이 가능한 객체일 뿐입니다.

 

 

Companion Object는 class안에 Object Declaration을 하면서 앞에 companion이라는 키워드를 붙여주면 되는데요.

해당 Class에서 명을 통해서 Companion object의 멤버 변수나 함수에 대해 바로 접근이 가능합니다.

(Static class의 변수나 함수에 대해 그랬던 것처럼 말이지요.)

아래에서도 create멤버 함수에 클래스명을 통해 바로 접근이 가능하였습니다.

 

 

또한 아래와 같이 companion object의 이름을 생략해도 됩니다.

보통은 이렇게 사용할 것 같네요.

 

 

대신 이 companion object에 접근할 때는 아래와 같이 Companion 키워드로 접근해야 합니다.

 

 

참고로, companion object는 클래스가 로드될 때 초기화 되어 집니다.

Java의 static initializer와 비슷하다고 할 수 있습니다.

 

3. 정리

이번 part5에서는 Object Expression, Object Declaration 그리고 Companion Object 에 대해 정리해 보았습니다.

이렇게 해서 기본적으로 Kotlin에 대해 알아야 하는 부분들에 대한 글은 part5인 이 글을 통해 마무리가 되었구요.

Kotlin에 대한 다른 주제의 글들을 계속 블로그에서 다루도록 하겠습니다.

 

+ Recent posts