출처 : Tekhit Android App School / Soft campus 윤재성 강사님
🎉 열거형(Enum)
- 프로그램 개발 시 특정 그룹의 구성요소를 정의하는 값이 필요할 때 사용합니다.
- enum 지시자를 사용합니다.
- when과 함께 사용시 enum Class에 정의한 모든 경우에 대해 작성해주면 else를 생략 가능합니다.
fun main(){
val r1 = getValue1(Direction2.SOUTH)
val r2 = getValue2(Direction.EAST)
println("r1 : $r1")
println("r2 : $r2")
}
// 열거형 정의
enum class Direction{
NORTH, SOUTH, WEST, EAST
}
fun getValue2(a1:Direction) = when(a1){
Direction.EAST -> "동쪽"
Direction.WEST -> "서쪽"
Direction.SOUTH -> "남쪽"
Direction.NORTH -> "북쪽"
}
- enum class 생성시 값을 설정할 수 있습니다.
- enum class의 주 생성자는 하나의 열겨형을 만드는 양식입니다.
fun main(){
printValue3(Number.TWO)
}
enum class Number(val num:Int, val str:String){
ONE(1, "일"),
TWO(2, "이"),
THREE(3, "삼")
}
fun printValue3(v1:Number){
when(v1){
Number.ONE -> println("1 입니다")
Number.TWO -> println("2 입니다")
Number.THREE -> println("3 입니다")
}
when(v1.num){
1 -> println("1 입니다")
2 -> println("2 입니다")
3 -> println("3 입니다")
}
when(v1.str){
"일" -> println("1입니다")
"이" -> println("2입니다")
"삼" -> println("3입니다")
}
}
🎉 Sealed Class
- 자기 자신을 상속받은 클래스를 모아 관리하는 클래스 입니다.
- Sealed Class의 생성자는 디폴트로 private이고, 다른 값으로 변경하면 컴파일 시점에 오류로 간주됩니다.
fun main() {
val obj1 = NumberClass.OneClass(100, 200)
val obj2 = NumberClass.TwoClass(300)
val obj3 = NumberClass.ThreeClass(100, 11.11)
checkNumber(obj1)
checkNumber(obj2)
checkNumber(obj3)
}
sealed class NumberClass{
class OneClass(var a1:Int, var a2:Int) : NumberClass()
class TwoClass(var a1:Int) : NumberClass(){
override fun numberMethod1() {
super.numberMethod1()
println("TwoClass의 numberMethod1")
}
}
class ThreeClass(var a1:Int, var a2:Double):NumberClass()
}
fun checkNumber(t1:NumberClass){
when(t1){
is NumberClass.OneClass -> {
println("OneClass입니다")
println(t1.a1)
println(t1.a2)
t1.numberMethod1()
}
is NumberClass.TwoClass -> {
println("TwoClass입니다")
println(t1.a1)
t1.numberMethod1()
}
is NumberClass.ThreeClass -> {
println("ThreeClass 입니다")
println(t1.a1)
println(t1.a2)
t1.numberMethod1()
}
}
}
🎉 Reflection
- 실행중인 프로새스의 구조 (객체, 함수, 프로퍼티)를 분석하는 기법입니다.
- 객체의 클래스 타입, 정보, 생성자 정보, 프로퍼티 정보 등을 실행 중에 파악할 수 있습니다.
- 모든 리플렉션 타입은 KAnnotatedElement의 자손입니다.
- KAnnotatedElement는 함수, 프로퍼티, 클래스 등 구체적인 언어 요소에 정의된 어노테이션에 접근하는 기능을 제공합니다.
- KClass<T> : 지정된 클래스의 타입을 파악합니다.(코틀린 클래스)
- Class<T> : 지정된 클래스의 타입을 파악한다(자바 클래스)
fun main(){
val a1:KClass<String> = String::class
println("String의 코틀린에서의 타입 : $a1")
val a2:Class<String> = String::class.java
println("String의 자바에서의 타입 : $a2")
// 변수를 통해 접근할 수 있는 객체의 클래스 타입 파악한다.
val str1 = "안녕하세요"
val a3:KClass<out String> = str1::class
println("str1을 통해 접근할 수 있는 객체의 클래스 타입(코틀린) : $a3")
val a4:Class<out String> = str1::class.java
println("str1을 통해 접근할 수 있는 객체의 클래스 타입(자바) : $a4")
}
class TestClass(var number1:Int, var number2:Int, var number3:Int){
var number4:Int = 0
var number5:Int = 0
constructor(a1:Int) : this(100, 200, 300)
constructor(a1:Int, a2:Int) : this(100, 200, 300)
fun testMethod1(){}
fun testMethod2(a1:Int, a2:Int){}
}
- Class Type 확인
fun main(){
val test1 = TestClass(100, 200,300)
val a5 = test1::class
val a6 = test1::class.java
println("test1의 클래스 타입(코틀린) : $a5")
println("test1의 클래스 타입(자바) : $a6")
}
- Class 정보 분석
fun main(){
val test1 = TestClass(100, 200,300)
println("추상 클래스 인가 : ${test1::class.isAbstract}")
println("Companion 인가 : ${test1::class.isCompanion}")
println("Data 클래스 인가 : ${test1::class.isData}")
println("Final 클래스 인가 : ${test1::class.isFinal}")
println("open 클래스 인가 : ${test1::class.isOpen}")
println("중첩 클래스 인가 : ${test1::class.isInner}")
println("Sealed 클래스 인가 : ${test1::class.isSealed}")
}
- 객체의 생성자 정보 분석 : 생성자의 정보를 가진 객체가 리스트로 반환됩니다.
fun main(){
val constructors = test1::class.constructors
println(constructors)
for(con in constructors){
println("생성자 : $con")
// 생성자의 매개 변수 목록을 가져온다.
for(param in con.parameters){
println("매개변수 순서 : ${param.index}")
println("매개변수 타입 : ${param.type}")
println("매개변수 이름 : ${param.name}")
}
}
// 주생성자
val primaryCon = test1::class.primaryConstructor
// 없으면 null이 반환된다.
if(primaryCon != null){
println("주 생성자 : $primaryCon")
// 주 생성자의 매개변수들
for(param in primaryCon.parameters){
println("매개변수 순서 : ${param.index}")
println("매개변수 타입 : ${param.type}")
println("매개변수 이름 : ${param.name}")
}
}
}
- 객체의 프로퍼티 정보 분석
fun main(){
val properties = test1::class.declaredMemberProperties
for(prop in properties){
println("프로퍼티 이름 : ${prop.name}")
println("프로퍼티 타입 : ${prop.returnType}")
}
}
- 객체의 메소드 정보 분석
fun main(){
val methods = test1::class.declaredMemberFunctions
for(met in methods){
println("메서드 이름 : ${met.name}")
println("메서드 반환타입 : ${met.returnType}")
println("메서드의 매개변수들 : ${met.parameters}")
}
}
'TEKHIT ANDROID SCHOOL' 카테고리의 다른 글
[TEKHIT] KOTLIN 범위 지정 함수와 배열 (0) | 2024.01.12 |
---|---|
[TEKHIT] KOTLIN FUNCTION (0) | 2024.01.11 |
[TEKHIT] 중첩 클래스 & NULL & Casting (0) | 2024.01.10 |
[TEKHIT]Companion & Data Class & Generic (1) | 2024.01.10 |
[TEKHIT] Any & This Super (0) | 2024.01.10 |