본문 바로가기
언어/Kotlin

[Kotlin 문법 종합] - 생성자, 객체 (#비교 추가하기) @@ 질문하기!

by 젼젼39 2024. 3. 5.

 

 

 

 

1. 생성자

    : 클래스를 실체화할 때 최초로 실행할 로직 작성
        (인스턴스를 만드는 과정st... 붕어빵 틀을 가지고 붕어빵 찍어내는)

    1) 기본 생성자
        : 클래스 이름 옆에 생성자를 위한 인자를 입력받아 초기화 (함수와 유사)

class 클래스이름1(temp:String){
    var myTemp = temp
}

fun main(){
    val ex1 = 클래스이름1("가")
}

    2) 명시적 생성자

           (1) 주 생성자 Init
                : { } 초기화 블록 사용하면 객체 실행과 함께 자동실행됨

                - 한 가지의 형태로 클래스를 실체화할 때 

                - 클래스 선언부에 생성자를 명시함
                - 매개변수를 직접 넘기지 않음

@@@ 클래스 이름옆 ()에 적는 순서대로 필드의 변수가 채워지는거 맞나?? ->> 이건 다른거... 코드 정리하기 

// 클래스 선언부에 생성자를 명시함
class Character(_name:String, _hairColor:String, _height:Double) {
		//_ 는 매개변수임을 나타내기 위한 표시. this.처럼 구별하는 도구
    var name:String = ""
    var hairColor:String = ""
    var height:Double = 0.0

		// 매개변수를 직접 넘기지않음
    init {
        println("매개변수없는 생성자 실행 완료!")
    }

    fun fireBall() {
        println("파이어볼!")
    }
    fun compositing(device1:String, device2:String): String {
        var device3 = device1 + device2
        println("새로운 무기인 ${device3}입니다")
        return device3
    }
}
class 클래스이름2(_temp:String){
    var myTemp:String
    
    init{
        myTemp = _temp
    }
}

fun main(){
    val ex2 = 클래스이름2("나")
}
class Birt(var name:String, var wing:Int, var color:String){
    //매개변수 안에 var을 사용, 선언됨!!
    
    fun fly() = println("$wing")
    
}

fun main(){
    val sparrow = Birt("mySparrow", 2, "red")
    sparrow.color = "blue"
    
    println("${sparrow.color}")
    sparrow.fly()
}

 

           (2) 부 생성자 Constructor             //java랑 헷갈림... 개념 비교하기..

                (+) 입력 인자 따라 여러개 만들 수 있음 

class 클래스이름3 { 			//클래스 이름 옆이 아님!!
    var myTemp : String
    
    constructor(_temp:String){
        myTemp = _temp
    }
}

fun main(){
    var ex3 = 클래스이름3("다")
}

 

 

2. 객체

    : 클래스 타입으로 실체화된, 선언된 것들. 모든 인스턴스를 포함

    - 클래스를 실체화해 메모리에 적재
    - 정보, 행위가 그대로 로딩되는 게 아님. 위치정보를 메모리에 로딩함
    - 객체의 위치정보를 변수에 저장한 뒤, 참조함  

open class Person{
   constructor(firstName: String){ 	
       println("[Person] firstname: $firstName")
   }
   constructor(firstName: String, age: Int){ 			//5번째
       println("[Person] firstName: $firstName, $age") 		//6번째
   }
}

class Developer : Person{
    constructor(firstName: String) : this(firstName, 10){ 	//1번째 : 2번째
        println("[Developer] $firstName") 			//8번째
    }
    constructor(firstName: String, age: Int) : super(firstName, age){ 	//3번째 : 4번째
        println("[Developer] $firstName, $age") 			//7번째
    }
}

fun main(){
    val choi = Developer("Choi") 		// 9번째 = 0번째
}

//[Person] firstName: Choi, 10
//[Developer] Choi, 10
//[Developer] Choi

//만약 주생성자가 있다면 this()

class Person(firstName: String, out: Unit = println("[Primary Constructor] Parameter")) {
    val fName = println("[Property] Person fName: $firstName") 	//프로퍼티에 출력문 할당
    init{
        println("[init] Person init block")
    }
    //그럼, 여기서 철이, 20이 firstName, age에는 들어와 있는건가?@@ 이 값을 변경하질 못하니까 변경하려면 변수를 받아서 쓰는거...?
    constructor(firstName: String, age: Int, out: Unit = println("[Secondary Constructor] Parameter")): this(firstName){
        println("[Secondary Constructor] Body: $firstName, $age")
    }
}

fun main(){
    val p1 = Person("철이", 20)
    println()
    val p2 = Person("미애")
    
}

//[Secondary Constructor] Parameter
//[Primary Constructor] Parameter
//[Property] Person fName: 철이
//[init] Person init block
//[Secondary Constructor] Body: 철이, 20

//[Primary Constructor] Parameter
//[Property] Person fName: 미애
//[init] Person init block

//out은 키워드 인자. 인자에 접근할 때, 기본값으로 설정된 println()이 동작하게 됨

 

    * 익명 객체

interface Switcher{
    fun on(): String
}

class Smartphone(val model: String){
    
    fun powerOn(): String{
        class Led(Val color: String){
            fun blink(): Stirng = "Blinking $color on $model"
        }
        val powerStatus = Led("Red")
        val powerSwitch = object : Switcher{ 	//익명 객체를 사용해 switcher의 on() 구현
            override fun on(): String{
                return powerStatus.blink()
            }
        }//익명(object)객체 블록의 끝
    }
}

    - 인터페이스의 메소드 구현을 익명 객체 안에서 해도 됨 (밖에 따로 만든 걸 받아와도 ㄱㅊ)