언어(Programming Language)/Kotlin

[Kotlin] 클래스(Class) 생성자(Constructors) 개념 및 사용법

RyanSin 2021. 2. 16. 01:22
반응형

- 개요

안녕하세요. 이번 시간에는 객체지향 프로그램에서 제일 어려운 개념인... Class(클래스)에 대해 알아보겠습니다.

 

일단 Class란 무엇일까요?? 딱 머릿속에 생각나는 게 없네요... 등급인가?... 반인가?... 학급을 말하는 건가?.. 이런 생각도 드네요 허허...

 

국어사전에 검색해보면...

 

 

정말 국어사전에서 설명한 말이 너무 어렵죠...?

근데 위 사전을 잘 풀어 해석하면 "데이터와 메서드를 정리한 객체를 정의한 것" , "객체를 정리하고 다룬다." 

 

그럼 여기서 객체는 무엇일까요?? 다시 국어사전에 검색을 해보겠습니다.

 

 

말이 너무 길고... 또 뭔 소리 하는 건지 모르겠죠?...ㅋㅋ

 

하지만 우리는 데이터(실체)와 그 데이터에 관련되는 동작(절차, 방법, 기능)을 기억하면 됩니다.

 

그러면 데이터?? 실체란 무엇일까요? 여기서 우리는 실체라는 단어를 잘 이해해야 합니다. 

 

실체란 "실제의 물체"라는 뜻입니다. 국어사전 설명에는 "손님, 역무원" 모두가 실체화된 객체라는 뜻입니다.

 

(여기서 동작을 객체라고 설명하고 있는데 헷갈리시면 안 됩니다. "승차권 주문"은 객체라고 볼 수 없습니다. 동작은 객체가 하는 행위입니다.

 사람이 승차권을 주문하는 행동은 메서드입니다. 헷갈리시면 안 됩니다!!.)

 

즉!! 우리 일상에서 보이는 모든 사물은 실체이고 그것들은 모두 객체입니다.

 

그럼 클래스는 무엇일까요??  "데이터와 메서드를 정리한 객체를 정의한 것" , "객체를 정리하고 다룬다"라고 설명했는데

 

클래스를 비유하자면 "설계도"라고 표현할 수 있겠습니다. 예시를 하나 들어보겠습니다.

 

Ex) 자동차

요즘 다들 전기차, 수소차, 자율주행차 등등 자동차에 대해 많은 이슈들이 있습니다.

 

이런 엄청난 자동차들을 만들어 내려면 제일 먼저 어떻게 만들지 "설계"를 합니다. 그리고 설계를 바탕으로 "설계도"를 만듭니다.

 

그럼 이 설계도를 가지고 공장에서는 자동차를 대량으로 생상 합니다. 

 

자 여기서 설계도 => 클래스, 자동차 => 객체 이렇게 됩니다.

 

(이해가 되지 않으신 분들은 댓글을 남겨주시면 친절히 답글 남기겠습니다.)

 

- 사용법

//Car.kt 파일
package main

class Car {
    
}

//Main.kt 파일
package main

fun main() {

    val car = Car() // Car Class 생성

}

Car.kt 파일을 하나 만들어 그 안에 Car라는 클래스를 작성했습니다.

 

그런 다음 Kotlin이 실행되는 Main.kt 파일에 Car 클래스 생성했습니다.

 

우리는 설계도를 만들고 자동차를 생성했습니다.

 

기본 클래스를 만들어 봤습니다. 그럼 이제 자동차 클래스를 꾸며 보도록 하겠습니다.

 

//Car.kt 파일
package main

class Car(var name:String, var color:String, var type:String, var engine:String, var date:String)


//Main.kt 파일
package main

fun main() {

    //한국 시간으로 오늘 날짜 구하는 코드
    val mSimpleDateFormat = SimpleDateFormat("yyyy.MM.dd", Locale.KOREA)
    val currentTime = Date()
    val today = mSimpleDateFormat.format(currentTime)

    val avante1 = Car("아반떼", "화이트","세단", "가솔린", today); //Car Class 생성
    val avante2 = Car("아반떼", "블루","세단", "LPG", today); //Car Class 생성
    val avante3 = Car("아반떼", "블렉","세단", "가솔린", today); //Car Class 생성

    println("---- 실행결과 avante1 ----")
    println(avante1.name)
    println(avante1.color)
    println(avante1.type)
    println(avante1.engine)
    println(avante1.date)

    println("---- 실행결과 avante2 ----")
    println(avante2.name)
    println(avante2.color)
    println(avante2.type)
    println(avante2.engine)
    println(avante2.date)

    println("---- 실행결과 avante3 ----")
    println(avante3.name)
    println(avante3.color)
    println(avante3.type)
    println(avante3.engine)
    println(avante3.date)

    /**
     * 실행 결과
     * ---- 실행결과 avante1 ----
     * 아반떼
     * 화이트
     * 세단
     * 가솔린
     * 2021.02.15
     * ---- 실행결과 avante2 ----
     * 아반떼
     * 블루
     * 세단
     * LPG
     * 2021.02.15
     * ---- 실행결과 avante3 ----
     * 아반떼
     * 블렉
     * 세단
     * 가솔린
     * 2021.02.15
     */

}

생성자는  클래스 이름 뒤에 () 소괄호를 붙여서 정의할 수 있습니다. 코틀린에서는 기본 생성자라고 표현합니다.

 

만약 클래스를 생성할 때 초기에 작업이 필요하다면 init함수를 만들어 그 안에 초기 작업할 소스코드를 작성할 수 있습니다.

 

코틀린은 자바와 다르게 생성자를 여러 개 만들 때 보조 생성자라는 키워드를 사용합니다.

 

보조 생성자

보조 생성자는 constructor라는 키워드를 사용해 정의할 수 있다고 말했습니다.

그리고 한 가지 중요한 점은 기본 생성자에서 정의한 파라미터 값을 꼭 사용해야 한다는 점입니다.(만약! 사용하기 싫으면 고정된 값 정의!!)

 

package main

import java.util.*

/**
 * 생성자
 * 자동차 이름, 자동차 색상, 자동차 종류(SUV, 세단... 등등), 자동차 엔진(가솔린, 경유, 하이브리드 등등), 자동차 생성 날짜
 */
class Car(var name:String, var color:String, var type:String, var engine:String, var date:String){


    /**
     * 보조 생성자
     * 
     * 보조 생성자 속성은 기본 생성자에서 사용되는 속성을 기본적으로 사용해야한다.
     * 
     * 만약 기본 사용자 속성을 사용하기 싫으면 고정된 값을 지정해야한다.
     */
    
    //기본 생성자에 속성 사용
    constructor (name: String, color: String, type:String, engine:String, date:String, scrapped: Date) 
                : this(name, color, type, engine, date)

    //기본 생성자에 속성 미사용
    constructor (name: String, color: String, type:String, engine:String)
            : this(name, color, type, engine, "21-02-16")

}

 

보조 생성자는 constructor라는 키워드로 정의할 수 있으며, 기본 생성자 속성을 사용하거나 사용하지 않을 때 상황에 따라 다르기 때문에

필요한 부분은 잘 정리해서 사용하시길 추천드리겠습니다.

 

이번 시간에는 어려운 개념인 클래스에 대해 알아봤습니다. :)