[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 아이템 추가 및 삭제하는 방법