새소식

반응형
250x250
My Study/Kotlin

Study About Kotlin 7

  • -
728x90
반응형

코틀린에서 중첩 클래스를 다루는 방법

 

중첩 클래스의 종류

Java 기준으로 중첩 클래스의 종류로는 static을 사용하는 중첩 클래스,

내부클래스, 지역클래스, 익명클래스 등이 있다.

 

static을 사용하는 클래스는 외부에서 직접적으로 참조하지 못하는 반면

내부 클래스는 밖에서 클래스를 직접 참조가 가능하다.

 

따라서 클래스 내의 클래스를 만들 때에는 static을 활용하는 것을 권장한다.

public class JavaHouse {

    private String address;
    private LivingRoom livingRoom;

    public JavaHouse(String address) {
        this.address = address;
        this.livingRoom = new LivingRoom(10);
    }

    public LivingRoom getLivingRoom() {
        return livingRoom;
    }

    public class LivingRoom {
        private double area;

        public LivingRoom(double area) {
            this.area = area;
        }

        public String getAddress() {
            return JavaHouse.this.address;
        }
    }
}

 

위 코드를 보면 내부 클래스라 직접적으로 참조가 가능하다.

 

이 코드를 Kotlin으로 바꿔보면

class KotlinHouse(
    private val address: String,
    private val livingRoom: LivingRoom
) {
    inner class LivingRoom(
        private val area: Double
    ) {
        val address : String
            get() = this@KotlinHouse.address
    }
}

 

여기서 Kotlin은 기본적으로 바깥과 연결이 없는 중첩클래스가 만들어져 따로 명시해줄 필요가 없다.

하지만 바깥과 연결을 하기 위해서는 inner라고 명시해줘야 한다.

 

또한 바깥클래스를 가져올 때에는 @바깥클래스명.필드 로 가져와야 한다.

 

코틀린에서 다양한 클래스를 다루는 방법

 

Data class

package lecture14;

import java.util.Objects;

public class JavaPersonDTO {

    private final String name;
    private final int age;

    public JavaPersonDTO(String name, int age) {
        this.age = age;
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "JavaPersonDTO{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object object) {
        if (this == object) return true;
        if (object == null || getClass() != object.getClass()) return false;
        JavaPersonDTO that = (JavaPersonDTO) object;
        return age == that.age && Objects.equals(name, that.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

 

위 코드는 DTO(Data Transfer Object)다.

위 코드가 Kotlin에는 class 앞에 data 키워드만 붙여주면 된다.

 

data class PersonDTO (
    val name: String,
    val age: Int
)

 

Enum class

 

Enum class는 추가적인 클래스 상속이 불가능하지만 인터페이스 구현은 가능하다.

각 코드는 싱글톤이다.

 

enum class Country (
    val code: String
) {
    KOREA("KO"),
    AMERICA("US")
    ;
}

fun handleCountry(country: Country) {
    when (country) {
        Country.KOREA -> TODO()
        Country.AMERICA -> TODO()
    }
}

 

Java는 Enum 내 코드가 많아지면 if else 문이 길어져 가독성이 떨어지게 된다.

하지만 Kotlin에서는 when을 사용하여 더 효율적으로 코드 작성이 가능하게 된다.

 

또한 컴파일러에서 Enum에 대한 모든 타입을 알고 있어서 다른 타입에 대한 로직,

else를 작성하지 않아도 된다.

 

Sealed class

Sealed class는 컴파일 시에 하위 클래스 타입을 모두 기억한다.

따라서 런타임 시 클래스 타입 추가가 불가능하다.

 

Enum과의 차이점은 

클래스를 상속받을 수 있고, 하위 클래스는 멀티 인스턴스가 가능하다는 점이다.

Enum과 동일하게 분기처리에 효과적이다.

 

sealed class HyundaiCar (
    val name: String,
    val price: Long
)

class Avante : HyundaiCar("아반떼", 1_000L)
class Sonata : HyundaiCar("소나타", 1_500L)
class Grandeur : HyundaiCar("그렌져", 2_000L)
728x90
반응형

'My Study > Kotlin' 카테고리의 다른 글

Study About Kotlin 9  (0) 2024.03.28
Study About Kotlin 8  (0) 2024.03.28
Study About Kotlin 6  (0) 2024.03.09
Study About Kotlin 5  (0) 2024.02.28
Study About Kotlin 4  (1) 2024.02.28
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.