코틀린에서는 절차지향, 객체지향 모두 지원
특정 대상의 특징(멤버변수)과 동작 활동(메소드) 기록
목표로 하는 대상에서 필요한 속성, 동작을 정의하는 것을 추상화 라고 한다.
자바의 필드는 코틀린에서 프로퍼티로 부른다.
클래스를 시각적으로 나타내서 분석, 개념 구현에 용이하다.
//Car 클래스 선언, 정의
class Car{
val wheel : Int=4
fun start(){
println("Engine Start")
}
}
//Bird 클래스 선언
class Bird
fun main() {
//생성자를 이용해 객체 생성
val sonata : Car = Car()
println(sonata.wheel)
sonata.start()
}
package chap01.section2
class Bird constructor(_name : String, _wing : Int){
var name : String = _name
var wing : Int = _wing
fun birdInfo(){
println("Bird Info")
println("name : $name")
println("wing : $wing")
}
}
fun main() {
var bird1 = Bird("비둘기",2)
bird1.birdInfo()
}
Bird Info
name : 비둘기
wing : 2
주 생성자는 클래스 명 옆에 constructor 를 이용해 정의한다.
블록 내부에서 프로퍼티를 선언, 초기화해준다.
주 생성자에서 프로퍼티 초기화 외에 다른 코드를 작성하고 싶다면 init블록을 이용한다.
package chap01.section2
class Bird constructor(_name : String, _wing : Int){
var name : String = _name
var wing : Int = _wing
init{
println("bird constructed")
}
fun birdInfo(){
println("Bird Info")
println("name : $name")
println("wing : $wing")
}
}
fun main() {
var bird1 = Bird("비둘기",2)
bird1.birdInfo()
}
bird constructed
Bird Info
name : 비둘기
wing : 2
init {} 을 이용해서 생성자에 필요한 코드를 추가로 작성할 수 있다.
package chap01.section2
class Bird(var name : String, var wing : Int){
init{
println("bird constructed")
}
fun birdInfo(){
println("Bird Info")
println("name : $name")
println("wing : $wing")
}
}
fun main() {
var bird1 = Bird("비둘기",2)
bird1.birdInfo()
}
주 생성자의 매개변수 부분에 클래스 프로퍼티를 넣어버릴 수 있다.
그리고 constructor 도 특별히 @ 어노테이션 등이 필요한 것이 아니라면 생략 가능하다.
package chap01.section2
class Bird{
var name : String
var wing : Int
constructor(_name:String,_wing:Int){
println("부생성자 호출")
name = _name
wing = _wing
}
fun birdInfo(){
println("Bird Info")
println("name : $name")
println("wing : $wing")
}
}
fun main() {
var bird1 = Bird("비둘기",2)
bird1.birdInfo()
}
부생성자 호출
Bird Info
name : 비둘기
wing : 2
부 생성자는 클래스 내에 constructor를 이용해서 작성한다.
부 생성자 여러개를 이용할 때는 매개변수 형태가 같으면 충돌 발생
package chap01.section2
class Bird{
var name : String
var wing : Int
constructor(_name:String,_wing:Int){
println("부생성자 호출")
name = _name
wing = _wing
}
constructor(_name:String){
println("부생성자 호출")
name = _name
wing = 2
}
fun birdInfo(){
println("Bird Info")
println("name : $name")
println("wing : $wing")
}
}
fun main() {
var bird1 = Bird("비둘기",2)
bird1.birdInfo()
}
두번째 부 생성자에서는 wing을 매개변수로 갖지 않고 부생성자 블록 내에서 2로 초기화 해 주었다. 이처럼 매개변수에 따라 다른 부생성자를 정의해야 한다.
package chap01.section2
class Bird{
var name : String
var wing : Int
constructor(_name:String,_wing:Int){
println("부생성자 호출")
name = _name
wing = _wing
}
constructor(_name:String){
println("부생성자 호출")
name = _name
wing = 2
}
fun birdInfo(){
println("Bird Info")
println("name : $name")
println("wing : $wing")
}
}
fun main() {
var bird1 = Bird("4윙치킨",4)
bird1.birdInfo()
var bird2 = Bird("비둘기")
bird2.birdInfo()
}
부생성자 호출
Bird Info
name : 4윙치킨
wing : 4
부생성자 호출
Bird Info
name : 비둘기
wing : 2
부생성자를 이용하면 이처럼 Bird를 생성할 때 인자 2개를 전달할 수도 있고 한개만 전달할 수도 있다.