Kotlin

[android : kotlin] 코틀린 클래스와 생성자(Constructor) 및 용어 정리 : 프로퍼티(Property), 인스턴스(Instance), override, open class , open fun

코틀린 용어 정리

클래스(Class) : 분류, 범주
프로퍼티(Property) : 속성(Attribute), 변수(Variable), 필드(Field), 데이터(Data)

메서드(Method) : 함수(Function), 동작(Operation), 행동(Beahavior)

객체(Object) :물리적인 메모리 영역에서 실행되고 있는 클래스의 실체를 의미한다.

인스턴스(Instance) : 메모리에 올라간 객체를 인스턴스(Instance)라고 부른다.

자바에서 사용하는 필드가 코틀린에서는 프로퍼티로 부른다.

클래스 다이어그램의 구성요소 : 클래스명, 속성(필드, 프로퍼티), 함수(메서드, 오퍼레이션)

코틀린 클래스 선언방법

class Car { }      // 내용이 비어 있는 클래스 선언

class Car          // 중괄호 생략가능

아래 코드 스니펫을 보고 이해하자.

Car 클래스로 부터 생성된 객체 myCar를 정의하였다

//Car 클래스 생성
class Car {
	
    //프로퍼티 정의( 속성 )
    var name: String = ""
    var year: Int? = null
    var speed: Int = 0
    var Color: String = "BLACK"
    var gear: Int = 0
    
    //메서드 정의(함수)
    fun currentSpeed() = println("SPEED: $speed")
    fun speedUp(speed: Int) {
        this.speed += speed
        println("현재속도 :$speed")
    }
    
}
fun main() {
	//클래스 Car를 주 생성자를 통해 객체 myCar를 생성하였다.
    val myCar = Car()
    myCar.name = "KIA SPORTAGE"  //프로퍼티에 값 할당
    myCar.currentSpeed() // 객체의 멤버 메서드 사용
    myCar.speedUp(30)
}

[실행결과]

SPEED: 0
현재속도 :30

코틀린 생성자(Constructor)

클래스를 통해 객체를 만들 때 기본적으로 호출되는 함수

주 생성자(Primary Constructor) : 클래스명과 함께 기술되며, constructor 키워드를 생략할 수 있다.

부 생성자(Secondary Constructor) : 클래스 본문에 기술되며, 하나 이상의 부 생성자를 정의할 수 있다.

class Car {
    var name: String = ""
    var year: Int? = null
    var speed: Int = 0
    var color: String = "BLACK"
    var gear: Int = 0
    
    fun currentSpeed() = println("SPEED: $speed")
    fun speedUp(speed: Int) {
        this.speed += speed
        println("현재속도 :$speed")
    }
    
    //주 생성자
    constructor()
    
    //부 생성자 정의 
    constructor(_name: String, _year: Int, _color: String) {
        //this키워드 생략가능
        this.name = _name
        this.year = _year
        this.color= _color
    }
    
}
fun main() {
    //주 생성자로 객체를 생성
    val myCar = Car() 
    myCar.name = "KIA SPORTAGE"
    myCar.currentSpeed()
    myCar.speedUp(30)
    
    //부 생성자를 사용하여 객체 myCar2를 생성
    val myCar2 = Car("K7", 2020, "WHITE")
    
    println("차종: ${myCar2.name}")
}

[실행결과]

SPEED: 0
현재속도 :30
차종: K7

■ 클래스명과 함께 생성자를 정의할 수 있다. 하지만 부 생성자를 정의할 수 없다.

class Car constructor(var _name: String, var _year: Int, var _color: String){
    var name: String = _name
    var year: Int? = _year
    var speed: Int = 0
    var color: String = _color
    var gear: Int = 0
    
    fun currentSpeed() = println("SPEED: $speed")
    fun speedUp(speed: Int) {
        this.speed += speed
        println("현재속도 :$speed")
    }    
}
fun main() {
    
    //부 생성자를 사용하여 객체 myCar2를 생성
    val myCar2 = Car("K7",2010, "WHITE")
    
    println("차종: ${myCar2.name}")
    println("년식: ${myCar2.year}")
    println("생상: ${myCar2.color}")
    myCar2.currentSpeed()
}

[실행결과]

차종: K7
년식: 2010
생상: WHITE
SPEED: 0

■ 생성자 키워드 constructor을 생략하고 클래스 생성시 프로퍼티가 포함된 주 생성자를 정의할 수 있다.

class Car ( _name: String,  _year: Int,  _color: String){
    var name: String = _name
    var year: Int? = _year
    var speed: Int = 0
    var color: String = _color
    var gear: Int = 0
    
    fun currentSpeed() = println("SPEED: $speed")
    fun speedUp(speed: Int) {
        this.speed += speed
        println("현재속도 :$speed")
    }    
}
fun main() {
    
    //부 생성자를 사용하여 객체 myCar2를 생성
    val myCar2 = Car("K7",2010, "WHITE")
    
    println("차종: ${myCar2.name}")
    println("년식: ${myCar2.year}")
    println("생상: ${myCar2.color}")
    myCar2.currentSpeed()
}

[실행결과]

차종: K7
년식: 2010
생상: WHITE
SPEED: 0

■ 주 생성자의 초기화 블록을 선언하여 사용하는 케이스 

class Car ( _name: String,  _year: Int,  _color: String){
    var name: String = _name
    var year: Int? = _year
    var speed: Int = 0
    var color: String = _color
    var gear: Int = 0
    
    fun currentSpeed() = println("SPEED: $speed")
    fun speedUp(speed: Int) {
        this.speed += speed
        println("현재속도 :$speed")
    }    
    
    //초기화 블록
    init {
        println("----초기화 블록 시작----")
        speedUp(30)
    }
 
}
fun main() {
    
    //부 생성자를 사용하여 객체 myCar2를 생성
    val myCar2 = Car("K7",2010, "WHITE")
    
    println("차종: ${myCar2.name}")
    println("년식: ${myCar2.year}")
    println("생상: ${myCar2.color}")
}

[실행결과]

----초기화 블록 시작----
현재속도 :30
차종: K7
년식: 2010
생상: WHITE

■ 주 생성자 생성시 기본값을 지정한 케이스

class Car (var _name: String,  _year: Int = 2020,  _color: String = "BLACK", _speed: Int){
    var name: String = _name
    var year: Int? = _year
    var speed: Int = _speed
    var color: String = _color
    var gear: Int = 0
    
    fun currentSpeed() = println("SPEED: $speed")
    fun speedUp(speed: Int) {
        this.speed += speed
        println("현재속도 :$speed")
    }    
    
    //초기화 블록
    init {
        println("----초기화 블록 시작----")
        speedUp(30)
    }
 
}
fun main() {
    
    //부 생성자를 사용하여 객체 myCar2를 생성
    //기본값이 있는 인자는 생략하고 기본값이 없는 인자만 전달 하는 방법
    val myCar2 = Car(_name = "K7", _speed = 100)
    
    println("차종: ${myCar2.name}")
    println("년식: ${myCar2.year}")
    println("생상: ${myCar2.color}")
    myCar2.currentSpeed() 
}

[실행결과]

----초기화 블록 시작----
현재속도 :30
차종: K7
년식: 2020
생상: BLACK
SPEED: 130

■ 클래스 상속 및 메서드 오버라이드 
부모 클래스에 open 키워드를 사용해서 클래스를 생성해야 상속을 받을 수 있다.

메서드 역시 open키워드를 사용해서 정의해야 오버라이드가 가능하다.

open class Car(
	var _name: String,
	_year: Int = 2020,
	_color: String = "BLACK",
	_speed: Int
) {
	var name: String = _name
	var year: Int? = _year
	var speed: Int = _speed
	var color: String = _color
	var gear: Int = 0

	fun currentSpeed() = println("SPEED: $speed")
	open fun speedUp(speed: Int) {
		this.speed += speed
		println("현재속도 :$speed")
	}

}

class CarDetail(
	_name: String,
	_year: Int = 2020,
	_color: String = "BLACK",
	_speed: Int,
	var _door: String
) : Car(_name, _year, _color, _speed) {
	var door: String = "4 doors"
	var sunroof: Boolean = false

	override fun speedUp(speed: Int) {
		println("----CarDetail : speedUp()----")
		this.speed += speed + 30
	}
}

fun main() {
    
    //부 생성자를 사용하여 객체 myCar2를 생성
    //기본값이 있는 인자는 생략하고 기본값이 없는 인자만 전달 하는 방법
    val myCarDetail = CarDetail("KIA K7", 2020, "WHITE", 50, "2 Doors")
    
    println("차종: ${myCarDetail.name}")
    println("년식: ${myCarDetail.year}")
    println("생상: ${myCarDetail.color}")
    myCarDetail.currentSpeed() 
}

[REFERENCE]

Do it! 코틀린 프로그래밍 [황영덕 저 | 이지스퍼블리싱]

kotlinlang.org/docs/tutorials/kotlin-for-py/classes.html

[코틀린 더 알아보기]

[android : kotlin] 코틀린 더블콜론(::) 사용 방법 & 사용 예시

[android : kotlin] 코틀린 Nothing 사용방법 & 사용 예시

[android : kotlin] 코틀린 Unit 오브젝트 사용방법 & 사용 예시

[android : kotlin] 코틀린 shared Preferences 사용방법 및 예제 코드 : 자동 로그인 처리하기

[android : kotlin] 코틀린 lateinit, lazy 사용방법 및 예제

[android : kotlin] 코틀린 웹뷰(WebView) 사용 설정 방법 및 예제 총정리

[android : kotlin] 코틀린 RecyclerView 아이템 추가 및 삭제하는 방법

Leave a Reply

error: Content is protected !!