Kotlin

[Kotlin] 클래스(Class), 데이터 클래스(Data Class)

KyungMin08 2024. 12. 4. 11:07
728x90

개요

필자는 Kotlin에 Data Class라는 클래스가 존재한다는 걸 들어서 공부하려고 했더니 클래스(Class)에 대해서 포스팅한 적이 없어 오늘 클래스(Class)와 Data Class에 대해서 포스팅을 해볼까 한다.


Class

Class는 객체 지향 프로그래밍에서 가장 기본이 되고 중요한 개념으로 반드시 알아야 할 내용이다.

본 필자가 클래스(Class)와 객체(Object)를 처음 배웠을 때 비유 했었던 자동차를 비유 들어서 이해 먼저해보자. Class는 설계도, 객체(Object)는 클래스에 의해 만들어진 완성품이다.

자동차라는 객체(Object)가 있다고 해보자. Class는 자동차에 들어갈 부품들이다. 자동차가 만들어지기 위해서는 여러 부품들이 들어가 있다. 이러한 부품들을 모아둔 곳을 클래스(Class)이고, 그런 부품들을 조합해서 완성품을 만들어낸 것이 객체(Object)이다.

즉, 클래스(Class)객체에 기능들을 모아둔 곳이다.

  • 객체(Object) : 클래스라는 개념의 실체이다.
  • 인스턴스(Instance) : 객체가 메모리 영역에 포함될 때를 말하며 개별적 객체이다.

Class는 헤더(Header)와 바디(Body)로 나눈다. Class를 선언한 부분이 헤더(Header), 중괄호 안이 바디(Body)이다.

Class의 기본 형태(예시 코드)

Class에는 프로퍼티, 함수, 생성자들이 작성될 수 있다. Class에서는 프로퍼티, 함수는 상관없이 작성해도 되는데 생성자는 여러 가지 방법으로 생성하기 때문에 생성자에 대해 설명하겠다.

 

생성자

생성자는 Class에서 가장 중요한 파트이며 알아두면 두구두구 잘 사용할 거다. Kotlin에서 생성자를 생성하는 방법은 4가지가 있다.

프로퍼티에 기본 값을 줄 수도 있으며 생성자에는 constructor와 init이 있다. constructor는 보조 생성자이며 init은 주 생성자이다.

  • init : 해당 클래스가 호출되는 시점에 초기화 코드를 실행한다.
  • constructor : 보조 생성자로 여러 생성자를 만들 수 있으며 클래스 헤더에 작성할 시 생략 가능하다. 단, 생성자에 "접근 제어자가 붙을 거다!"라고 한다면 private constructor 이런 식으로 작성해 줘야 한다.

생성자가 여러개인 클래스

필자는 생성자를 선택적으로 고를 수 있다는 점에서 매력을 느꼈다.^^(신기했다.)

클래스를 상속하려면 open 키워드를 붙여줘야 한다. open은 오버라이딩 혹은 상속을 허용한다는 의미이다.


Data Class

Data Class는 데이터 작업을 위한 클래스이기 때문에 getter / setter / copy() / hashCode() / toString() / equals() / componentN() 함수들이 자동으로 생성된다. 이러한 Data Class 특성 때문에 Data Class는 Spring Boot에서 Dto(데이터를 서버에 보내기 위해 클라이언트로부터 데이터를 받아오는 객체(그릇)를 말한다.) 만들 때 많이들 사용한다.(필자가 많이 사용했음)

  • copy() : 객체를 복사하고 그와 동시에 프로퍼티 값들을 변경할 수 있다.
  • hashCode() : 해당 객체의 메모리 영역에서 식별 가능한 고유한 번호이다.
  • toString() : 해당 객체가 가지고 있는 프로퍼티의 값들을 잘 정리해서 출력해 준다.
  • equals() : 객체가 메모리 영역에 있는 객체와 같은 지 확인할 때 사용되고이때 연산자는 ===이다. 또한 두 객체가 동일한 값을 가지고 있는지 검사할 때도 사용된다. 이때의 연산자는 ==이다.
  • componentN() : 해당 클래스 구조(프로퍼티들)를 분해할 수 있다.
  • getter : 해당 프로퍼티를 호출할 때 초기화 값이다.
  • setter : 해당 프로퍼티의 값을 직접 외부에서 넣고 싶을 때 사용한다.

자바는 갖고 있는 값을 동일한지 검사하기 위해서 equals() 메서드를 사용했었는데 Kotlin은 == 연산자를 사용하면 되고, 메모리상 같은 객체인지 확인하려고 한다면 === 연산자를 사용하면 된다.

Data Class의 기본 형태(예시 코드)

만약에 구조 분해 구간에서 값이 3개가 있다고 가정해 보자. 이때 2번째 프로퍼티를 받고 싶지 않다고 한다면 _(밑줄)을 사용하면 된다.

구조 분해 선언은 componentN() 함수로 변환된다.

 

Data Class의 추가적은 특징은 1개 이상의 프로퍼티가 있어야 하고 다른 클래스를 상속받을 수 없다. 또 abstract, open, sealed, inner 등 키워드를 붙일 수 없다.

Data Class가 주는 기본적인 기능들만 해도 많은 코드을 줄일 수 있어 공부하는 입장과 개발자 입장에서는 좋은 것 같다.


잘못된 부분이나 부족한 부분이 있을 수 있습니다. 댓글로 남겨주시면 감사하겠습니다. 😊

728x90