[Kotlin]다양한 클래스 초간단 이해하기

이영규
8 min readAug 21, 2018

코틀린은 편의를 위해 제공하는 기능이 참으로 많다(사실 많은 건지는 잘 모르겠다..). 그 중 하나로 클래스 유형이 비교적 다양하다는 것이다. 코틀린을 처음 접하는 사람들이 신기해 하는 부분이자 한편으로는 반기는 부분이 아닐까 한다. 해서 이번 글에서는 코틀린에서 기본적으로 제공하는 다양한 클래스 중에서도 몇 가지에 대해 간단히 알아보고자 한다.

일반 클래스

이름을 뭐로 지어야 할지 몰라서 일반 클래스라고 지어봤다. 이름에서도 나타나있듯이 특별한 기능이 있다기 보다는 여러분들이 일반적 객체지향 언어에서 쓰던 클래스와 같은 역할, 형태 및 쓰임새를 갖는 클래스이다. 이전 포스팅에서 예시로 든 클래스들이 모두 일반 클래스이니 여기서는 깊게 언급하지 않고 간단하게 형태와 사용법을 살펴보면 다음과 같다.

일반 클래스의 형태 및 사용법

여타 언어들과 크게 차이가 없는 모습이다. 하지만 재밌는 것은 지금부터다. 이제부터 알아볼 클래스들은 적극 활용하면 상당히 유용하니 집중해서 봐주기를 바란다.(사실 그렇게 집중하진 않아도 된다.)

데이터 클래스(data class)

데이터 클래스는 다음과 같은 특징을 갖는다.

  • class 앞에 data 키워드를 사용함으로써 선언한다.
  • 중괄호({})로 열고 닫는 것이 아닌 소괄호(())로 열고 닫는다.
  • 변수나 상수만 선언할 수 있다. 구분은 쉼표(,)로 한다.
  • 프로퍼티를 일반 클래스와 달리 초기화 해주지 않아도 된다.(물론 해도 무방하다.)
  • 생성과 동시에 클래스 내의 프로퍼티를 기준으로 생성자가 만들어진다.

특징만 봤을 때 일반 클래스와는 약간 다를 것 같기는 한데 어떤 모습일지 감이 잡히지 않을 수 있다. 해서 이를 반영한 형태를 살펴보면 다음과 같다.

데이터 클래스의 형태 및 사용법

특징에서 살펴본대로 일반 클래스와는 다른 모습을 보인다. data라는 키워드를 쓰고 소괄호로 열고 닫고 변수 및 상수만 사용하며 이들을 기반으로 생성자가 만들어진다. 특징 중 하나라도 위반하면 오류가 생기니 유의하도록 하자.

특징 위반을 반기지 않는다.(프로퍼티 구분 및 생성자 인자 부족 오류)

아 객체화 하고 나서 일반 클래스와 같이 프로퍼티에 값을 변경하는 것 물론 가능하지 참고하면 좋을 듯 하다.(물론 변수만 변경 가능하다)

객체 생성 이후 프로퍼티에 값 할당

VO(Value Object)를 다룰 때 쓰면 제법 유용한 클래스이다. 통신을 하거나 별도의 DB를 사용한다면 데이터 클래스를 적극 활용하는 것도 하나의 좋은 방법이 될 것 같다.

오브젝트 클래스(object)

오브젝트 클래스라는 말보다는 오브젝트(Object)가 더 맞는 말이지만 맥락을 맞추기 위해 제목을 위와 같이 지었다. 오브젝트 클래스는 다음과 같은 특징을 갖는다.

  • class가 아닌 object라는 키워드로 선언한다.
  • 생성자를 갖지 않는다.(정확히는 가질 수 없다.)
  • 어느 클래스, 함수에서든 별도의 객체화 과정 없이 접근 가능하다.
  • 프로그램이 실행되는 동안 저장된 데이터는 손실되지 않는다. 단, 프로그램이 종료되면 소멸된다.
  • 위 특징 덕분에 안드로이드에서는 액티비티, 프래그먼트 구분하지 않고 데이터 전달을 할 수 있다.

특징을 살펴보면 문득 그런 생각이 들 것이다. ‘static을 쓰면 되는 거 아닌가?’ 그렇다. 정답이다. 맞는 말이다. 다만 문제가 있다. 코틀린에 static이 없다는 것이다!! 그래서 오브젝트 클래스를 static같은 느낌으로 써주면 이해가 쉬울 것이다. 형태 및 사용법은 다음과 같다.

오브젝트 클래스의 형태 및 사용법

실행하면 [09 has pikachu and type is electronic number is 25] 라는 문장이 2번 나온다. 하나는 [HandSome09Object.myPokeon()]에서 나온 것이고 하나는 그 밑에 println에서 나온 것이다. 핵심은 일반 클래스나 데이터 클래스처럼 객체화를 하는 것이 아니라 클래스 이름에 직접 접근하여 데이터를 조작하고 데이터 및 함수 호출도 가능하다는 것이다.

객체화를 하고 싶어도 생성자를 만들 수 없어서 불가능하다.

데이터 흐름의 복잡함을 쉽게 풀어줄 수 있는 클래스이지만 남발하면 코드가 뒤죽박죽이 될 가능성이 있으니 그 점은 유의하는 것이 좋다.

열거형 클래스(enum class)

C++이나 JAVA를 사용하신 분들이라면 열거형 클래스에 대해 사용해보거나 최소한 보기라도 해봤을 것이다. 코틀린도 이와 크게 다르지 않다. 특징을 살펴보면 다음과 같다.

  • 나열한 이름에 따라 [클래스 이름.name]으로 여러분이 적은 이름 값을 가져올 수 있고 순서에 따라 [클래스 이름.ordinal]로 해당 값이 몇 번째에 적혔는지, 즉 순서 값을 가져올 수 있다.
  • 인자를 넣음으로써 각 열거값*들을 표현하는 방식을 다채롭게 할 수 있다.

다른 클래스에 비해 도드라지는 특징이 많지는 않지만 활용방법은 비교적 다채로우니 하나하나 살펴보도록 하겠다.

인자 없는 열거형 클래스

말 그대로 별도의 인자가 없는 가장 기본적인 형태의 열거형 클래스다. 기본 형태는 다음과 같다.

인자 없는 열거형 클래스의 기본적인 형태(참고로 순서대로 피카츄, 이상해씨, 파이리, 꼬부기다. 예 TMI~)

짐작했겠지만 값을 쓴 순서대로 0, 1, 2, 3이라는 순서를 부여 받는다. 이를 확인 및 활용하기 위해선 다음과 같이 할 수 있다.

인자 없는 열거형 클래스의 값 가져오기

열거형에 있는 값을 쓰기 위해선 해당 열거형 클래스 타입 변수(상수)에 열거값을 넣어줘야 한다. 그 후 .name을 통해 그 열거값의 이름(위 예시에서는 PIKACHU)을, .ordinal을 통해 순서를 가져올 수 있다. 실제 위 코드를 실행하면 [PIKACHU … 0]이 나온다. 그런데 위와 같은 형태는 한 가지 문제점이 있다. 변수 하나에 한 열거값만 접근 가능하다는 것이다. 여러 곳에 접근할 수는 없을까? 없을리가 있을까. 다음과 같은 방법을 사용하면 된다.

한 가지 변수(상수)로 모든 열거값에 접근하기

바로 배열을 사용하면 된다. 열거 클래스 배열 타입을 갖고 있으며 해당 열거값을 모두 갖는 변수(상수)를 선언하여 사용하면 된다. 열거 값을 모두 넣으려면 [열거 클래스.values()]를 통해 해줄 수 있다. 이러면 열거값들이 일종의 배열 형태로 들어가게 되고 나머지는 배열 활용법과 동일하게 할 수 있다.

인자 있는 열거형 클래스

열거형 클래스는 인자를 가질 수 있다. 인자를 갖고 있음으로써 각 열거값들을 좀 더 다채롭게 표현할 수 있다. 기본 형태는 다음과 같다.

인자 있는 열거형 클래스의 기본 형태

사실 인자가 있다 하더라도 크게 어려울 건 없다. 단지 열거값에 인자에 해당하는 타입에 맞게 값을 더 넣어줄 수 있다는 것이다. 물론 값을 더 넣어준 만큼 해당 열거값에 대해서 더 다양한 값으로 접근할 수 있다.

열거값에 대해 접근하는 방법이 다양해졌다.

주의해야할 것은 인자에 명시한 이름에 맞게 접근해야 한다는 것이다. 그리고 변수로 선언했다면 이 값들은 변경 가능하다.

인자를 변수로 변경 후 값 변경

사실 열거형 클래스는 이보다 더 다채로운 형태와 활용이 가능하다. 다만 이 글의 취지인 초간단과는 멀어지니 이정도로만 하겠다.

간..단..? 하지만 일부에 불과하다.

코틀린이 제공하는 클래스는 이 말고도 sealed, inner와 같이 몇 가지가 더 있다.(이쯤되니 코틀린이 마냥 간단한 것 같아 보이지는 않는 것 같은 기분이 들겠지만 그건 넘어가도록 하자.) 다만 앞서 말했던 것처럼 이 이상 하면 본 글 취지와는 멀어지니 이쯤 해두도록 하겠다. 사실 간단이라고 했지만 위 클래스들만 잘 활용해도 충분히 좋은 프로그램을 짤 수 있지 않을까 생각한다. 다음에는 개인적으로 코틀린의 꽃이라고 생각하는 함수형 프로그래밍에 대해 간단히 알아보겠다.

주석

* 열거형 상수가 맞는 말이지만 길어서 줄였다.

--

--