Kotlin을 배워보자 part4 (Data Class, Nested and Inner Class)
지난 part3에서는 Class와 생성자, 프로퍼티 그리고 상속 등에 대해서 정리해 보았는데요.
이번 글에서는 Data Class, Nested Class와 Inner클래스에 대해서 알아보도록 하겠습니다.
이전 글은 아래 링크를 참조해 주시면 됩니다.
>> Kotlin을 배워보자 part3 (Class, Constructor, 상속)
1. Data Class
코틀린에서는 데이터만 보관하는 용도로 쓰는 클래스를 제공해 주고 있는데요.
선언하는 방법도 매우 간단한데요.
data 키워드를 class 앞에 붙여주고 기본 생성자에서 1개 이상의 property를 선언해 주기만 하면 됩니다.
1-1. data클래스의 특징
data클래스임을 명시적으로 표시하면,
기본적으로 아래의 함수들을 자동으로 생성해 줍니다.
꽤나 많은 함수들을 위의 한줄만으로 사용할 수 있도록 해 주는 것이지요.
- equals() => 객체의 주소가 아니라 값이 같은지를 비교해 줌
- hashCode() => 프로퍼티 값들을 이용해 해쉬코드 값을 만들어 냄
- toString() => User(name=John, age=42)"; 와 같은 포맷으로 나옴
- copy() => 프로퍼티값을 이용해 객체를 만들어 냄
- componentN() functions => Destructuring Declarations을 할 수 있도록 해줌(이 부분은 아래에서 자세히 보도록 하겠습니다)
실제로 객체를 생성한 후 print를 해 보면 객체의 주소값이 아니라, toString한 값이 나오는데요.
단지 data 키워드를 사용했을 뿐인데 많은 일들을 코틀린이 대신 해준 것이지요.
property값을 미리 초기화 해 놓으면, 값을 지정하지 않아도 초기화 된 값으로 객체가 생성됩니다.
그리고 원하는 property값 만을 수정할 수도 있구요.
1-2. copy매소드 사용
데이터 클래스는 복사도 할수 있는데요.
아래와 같이 data클래스라는 이유만으로 copy매소드를 바로 이용해서 새로운 객체를 만들수 있습니다.
1-3. Destructuring Declarations
Data 클래스는 Destructuring Declarations을 할 수 있는데요.
프로퍼티값의 수만큼 각 N개의 컴포넌트로 함수를 만들어서 값에 접근하게 해주는 ComponentN함수를 이용한 것 입니다.
말이 조금 어렵기 때문에, 코드를 보면서 이해해 보도록 하겠습니다.
아래에서 score1과 name1에 접근하기 위해서 두줄의 코드를 썼는데요.
파란색으로 하이라이트 된 부분을 보시면, 단 한줄로 손쉽게 두개의 값에 접근하는 것을 볼 수 있습니다.
이것이 Destructuring Declarations을 이용한 것인데요.
프로퍼티의 수가 많으면 많을수록 더욱 효율적이 되겠네요.
1-4. Pair와 Triple
과거 안드로이드 개발시 Pair사용해 보셨을 텐데요.
Kotlin에서 Pair의 소스코드를 보면 data클래스라는 것을 알 수 있습니다.
이 Pair가 data클래스이므로 위에서 정리했던 data클래스의 특징들을 가지고 있는 것이지요.
아래에서는 바로 위에서 정리해 봤던, Destructuring Declarations을 적용해 보았습니다.
Triple도 마찬가지로 데이터 클래스 이므로,
data클래스의 특징들을 마찬가지로 사용할 수 있습니다.
2. Nested Class와 Inner Class
2-1. Nested Class(중첩 클래스)
코틀린에서는 중첩 클래스도 지원을 합니다.
아래에서는 outer라는 외부 함수에 중첩된 Nested 클래스의 객체를 생성한 다음
그 클래스의 함수를 호출해 주었습니다.
다만 주의해야 할 것은,
외부의 bar라고 하는 outer클래스의 변수에는 접근하지 못한다는 점 입니다.
2-2. Inner Class
Inner Class는 외부Class의 변수에 접근할 수 있는데요.
nested class와는 다르게 키워드를 앞에 inner라고 붙여야 합니다.
내가 이 클래스의 inner클래스니 접근하겠다라고 선언하는 것이죠.
객체를 생성할 때도, Nested의 경우는 "."으로 OuterClass에 접근했었는데요.
InnerClass는 Outer클래스의 객체를 생성하고, Inner클래스의 객체를 만들어 접근합니다.
3.정리
이번 part4에서는 Data Class, Nested Class와 Inner클래스에 대해서 알아보았는데요.
다음 part5에서는 익명 inner class를 사용하는데 필요한 Object Expression 그리고 Singleton패턴을 위한 Object Declaration 그리고 Java의 Static 함수를 대신해 줄 수 있는 Companion Object 에 대해서 알아보도록 하겠습니다.