본문 바로가기

Programming/Kotlin

11장. 다양한 코틀린 클래스

11.1 데이터 클래스

 11.1.1 데이터 클래스(data)

   - 내부에 특별한 로직의 함수 없이 데이터만 포함한 클래스, data 예약어를 통해 data 클래스를 생성할 수 있다.

   - 주 생성자를 선언해야 하면 주 생성자의 매개변수는 최소 하나 이상이어야 한다.

   - 모든 주 생성자의 매개변수는 var 혹은 val로 선언해야 한다.

   - 데이터 클래스는 abstract, open, sealed, inner 등의 예약어를 추가할 수 없다.

 

 11.1.2 데이터 클래스의 함수

   - equals() : 객체의 데이터가 같은지 비교하는 함수. 같은 객체 주 생성자의 프로퍼티 값을 비교한다.

   - toString() : 데이터 클래스의 데이터를 문자열로 반환한다.

   - componentN() : 데이터 클래스의 프로퍼티 값을 가져올 때 사용한다. 분해 선언에서 내부적으로 사용된다.

     ex) var user = User("name",age) / val (name, age) = user

   - copy() : 객체를 복사하여 다른 객체를 만들어주는데, 데이터 클래스의 객체를 이용하다가 일부분의 데이터만

     변경해서 다른 객체를 만들 때 유용하다.

 

11.2 Enum 클래스

 11.2.1 열거형 클래스 선언 및 이용

   - 열거 상수는 기본으로 name과 oridinal 프로퍼티를 제공한다.

   - 열거 상수에 값을 대입할 수 있다.

 

 11.2.2 익명 클래스 이용

   - 열거 상수는 enum class를 상속 받은 익명 클래스이다. 

   - 익명 클래스를 직접 정의하면 주 생성자와 상관없이 임의의 프로퍼티나 함수를 추가할 수도 있다.

   - 열거 상수 이외에 다른 함수나 프로퍼티를 선언할 때는 반드시 세미콜론을 사용해야 한다. 세미콜론 앞부분이

     열거 상수이고, 뒷부분이 클래스에 선언하는 프로퍼티와 함수이다.

     ex) NORTH{ ... }, SOUTH{ ... };

 

11.3 Sealed 클래스

 - 몇몇 타입을 묶기 위한 용도로 사용한다.

 - Sealed 클래스와 열거형 클래스는 모두 이 클래스 타입의 데이터로 클래스 내에서 준비한 것 중 하나를 나열할

   목적으로 사용된다.

 - 열거형 클래스는 모든 열거 상수에 같은 형태의 데이터만 추가할 수 있다. 예를 들어, 열거 클래스의 주 생성자

   매개변수에 String, Int 타입의 프로퍼티를 선언했다면 모든 열거 상수는 String과 Int 타입으로 구성해야한다. 즉,

   데이터를 추가할 수는 있는데 열거 객체별로 데이터 구성을 다르게 할 수는 없다.

 - 열거 클래스는 열거 상수에 익명 클래스를 이용하지만, sealed 클래스는 sealed 클래스의 서브 클래스를 일반

   클래스처럼 똑같이 정의해서 사용하므로 데이터를 서브 클래스별로 다양하게 구성할 수 있다.

 - sealed 클래스는 abstract를 내장하고 있어 그 자체로 객체를 생성할 수 없다. 결국 Enum처럼 자신에게 몇 개를

   나열하고 그 중 하나를 이용하게 하는게 목적이다.

 - abstract 클래스는 서브 클래스를 추가할 때 사용하고, sealed 클래스는 열거 상수를 추가할 수없다. sealed의

   생성자는 private로 강제되어 있다.

 

11.4 Nested 클래스

 - 특정 클래스 내에 선언된 클래스를 지칭한다. 클래스 선언 위치가 최상위가 아닌 것 뿐이지, 특별한 것은 없다.

 - Nested 클래스에서 외부 클래스의 멤버를 이용하려면 Nested 클래스 선언 때 inner라는 예약어를 추가해야 한다.

 - inner가 추가된 클래스는 외부에서 객체로 생성할 수 없다. 꼭 외부 클래스에서만 객체를 생성해야 한다.

 - 외부 클래스에 Nested 클래스를 생성하는 함수를 작성하거나, Outer().Nested()와 같은 방식으로 생성할 수 있다.

   이는 Outer()로 Outer 객체가 먼저 생성되고, 그 Outer 객체를 이용해 Nested 객체를 생성한 것이다.

 

11.5 Object 클래스

 - 익명 클래스 : 어떤 클래스의 객체를 딱 한번만 생성하는 경우 이름 없는 클래스로 선언하고 바로 생성해서 이용한다.

 

 11.5.1 object를 이용한 익명 내부 클래스 정의

   - object{ } 형태로 익명 클래스를 선언한다. 선언과 동시에 객체가 생성된다. 이름이 없으므로 반복해서 생성할 수 없다.

   - object 클래스에는 생성자를 추가할 수 없다.

   - object 클래스에서 object 클래스 밖에 선언된 Outer 클래스의 멤버에 접근하는 것은 private여도 문제가 없다

   - Outer 클래스에서 object의 멤버를 이용하기 위해서는 object 객체 생성시 private로 지정해야 한다. 하지만 접근

   제한자가 private이기 때문에 Outer 클래스 외부에서는 이용할 수 없다. 하지만 object 클래스를 만들면서 타입을

   명시하면 외부에서도 이용할 수 있다.

 

 11.5.2 타입 명시로 object 이용

   - object 클래스를 만들 때 다른 클래스를 상속받거나 인터페이스를 구현해서 만들 수 있다.

   - object 클래스를 선언하면서 상속받거나 인터페이스를 구현하면 클래스명은 없지만 타입이 선언된 것이다.

   - 타입이 선언되면 이 클래스는 Any 타입이 아니므로 외부에서 사용할 수 있다. 따라서 Outer 클래스 외부에서도

     object 클래스의 객체를 이용해 object 클래스 내에 선언된 멤버를 이용할 수 있다.

 

 11.5.3 object 선언

   - object 예약어를 이용해 이름이 있는 클래스도 선언할 수 있다. val obj = object{ } or object 클래스명 { }

   - object 클래스명 { }와 같이 선언하면 클래스 선언과 동시에 클래스명과 같은 이름의 객체까지 생성된다.

   - 싱글톤 패턴에서 이름 있는 object 클래스를 이용하면 선언과 동시에 객체가 자동으로 생성하고 개발자가 생성할 수

     없으므로 하나의 객체만 이용하는 싱글톤 패턴이 적용된다.

 

 11.5.4 companion 예약어

   - 이름있는 object 클래스를 최상위에 작성하지 않고 특정 클래스 안에 작성할 수도 있다. class Outer{ object Nested{ } }

   - Outer.Nested.멤버 형식으로 object 클래스의 멤버를 이용해야 한다.

   - companion 예약어를 사용하면 자바의 static 효과를 내어, object 클래스명을 사용하지 않고 멤버를 이용할 수 있다.

     ex) Outer.(object의)멤버

 

※ 코틀린에서는 함수 내의 지역변수를 final로 선언하지 않아도 함수 내에 선언한 Nested 클래스에서 이용할 수 있다.

코틀린에서는 static이라는 예약어를 제공하지 않는다.

 - 코틀린은 프로그램을 항상 클래스로 작성할 필요가 없다. 최상위에 변수나 함수를 얼마든지 선언할 수 있다. 단일

   메모리 구조에 저장되어야 하는 함수나 프로퍼티는 최상위에 선언하면 되기 때문에 굳이 static으로 따로 구분해

   선언할 필요가 없다.

 - object 클래스 혹은 companion object 클래스를 이용하여 클래스 내부에 선언한 멤버 중 객체 생성 없이 클래스명으로

   직접 이용할 수 있다.

'Programming > Kotlin' 카테고리의 다른 글

12장. 함수형 프로그래밍과 람다  (0) 2020.01.31
안드로이드 스튜디오 recyclerView 버전 문제  (0) 2020.01.29
10장. 추상 클래스와 인터페이스  (0) 2020.01.21
9장. 상속  (0) 2020.01.20
8. 프로퍼티  (0) 2020.01.17