[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 사용방법 및 예제

