프로그래밍/Kotlin

[코틀린 / Kotlin] class 정의 , inti 블록

pupu91 2022. 10. 19. 19:04
반응형

 

class 생성 하기

클래스 내부에 정의한 변수 혹은 상수를 속성(property)라고 하며(자바의 필드) 함수는 메소드(method)라고 함

참고 )
package com.greedy.`class`
자바에서 class는 예약어여서 해당 네임으로 class를 만들 수 없지만, 코틀린에서는 ``백틱을 자동으로 붙여서 생성되어 예약어가 아닌 class 이름으로 인식할 수 있음
class Car {

    /* 속성 정의 */
    /* 현재 속도 */
    var speed: Int = 0
    /* 시동 걸려있는지 여부 */
    var isOn: Boolean = true

    /* 메소드 정의 */
    /* 가속해서 속도 증가 */
    fun accelerate(){
        speed += 10
    }

    /* 감속해서 속도 감소 */
    fun decelerate(){
        speed -= 10
        if(speed < 0) speed = 0
        //10을 줄이는데 -까지 가지 않기위해서 0까지로 제한 줌
    }

    /* 시동을 켠다 */
    fun turnOn(){
        isOn = true
    }

    /* 시동을 끈다 */
    fun turnOff(){
        isOn = false
    }

    /* 현재 속도 확인용 출력 메소드 */
    fun shewSpeed(){
        println("current speed : $speed")
    }
}


//클래스 범위를 벗어나서 메인 함수 만들어서 테스트 하기
fun main(){

    //객체 생성
    var c = Car()

    c.turnOn()
    println(c.isOn)
    println(c.speed)

    c.accelerate()
    c.shewSpeed()

    c.decelerate()
    c.turnOff()
    println(c.isOn)


}

출력 결과
true
0
current speed : 10
false

 

 

 

클래스 정의 방법

1. 생성자가 없는 클래스
class Person1{
    /* 속성 초기화 */
    var name: String = "홍길동"
    var age: Int = 0
}

fun main(){
	
    var p1 = Person1() //생성자가 없어도 객체 생성 가능
    println("${p1.name}, ${p1.age}") //속성 값 확인

    p1.name = "또치" //속성에 접근하여 값 변경 가능
    p1.age = 20
    println("${p1.name},${p1.age}살")
}

출력 결과
홍길동, 0
또치,20

 

 

 

2. 주 생성자가 포함 된 클래스
class Person2 (val name: String, var age: Int, val gender: String){
    //매개변수로 전달 받은 값을 전역에서 사용할 수 있다.(전달 받자마자 속성으로 추가 된다)
    fun test(){
        println(name)
    }
}

fun main(){

    //객체를 생성하면서 초기값을 바로 전달한다
    //var p2 = Person2(30,"짱구","남성") 사용x
    // var p2 = Person2(age=30,name="짱구", gender="남성")
    // 정의한 속성 순서대로 전달해야하지만 각 속성에 값을 대입하며 호출하는 경우에는 순서가 상관 없다.
    var p2 = Person2("짱구",5,"남성")
    println("${p2.name}, ${p2.age}, ${p2.gender}")
    p2.test()
}

출력 결과
짱구, 5, 남성
짱구

 

 

 

3. 주 생성자를 통해서 값만 전달 받는 클래스
   - 매개변수에 val, var 키워드가 생략 된다.
    - 속성에 val, var를 생략하면 생성자에 선언 된 매개변수로 취급하게 된다.(속성으로 취급x)
    - val와 var를 작성해야 속성으로 취급 된다.
class Person3(name: String, age: Int, gender: String){
    // 값은 전달되지만, 속성 값이 되는 일은 일어나지 않는다. 전달 받은 값이지 속성은 아님
   
    /* 속성 화 시키기*/
    var name: String = name
    var age: Int = age
    var gender: String = gender

    /* 속성에 대입할 값으로만 사용 될 수 있다.
       속성을 주석처리하면 선언되지 않은 변수라는 커파일 에러가 발생한다.*/
    fun test(){
        println(name)
    }
}

fun main(){
	var p3 = Person3("희동이",5,"남성")

    println("${p3.name}, ${p3.age}, ${p3.gender}")
    p3.test()
}

출력 결과
희동이, 5, 남성
희동이
반응형

 

 

4. 주 생성자에 기본 값이 설정 된 클래스
class Person4(val gender: String, val name: String = "스폰지밥", var age: Int = 20){}

fun main(){
    var p4 = Person4("여성")
    println("${p4.name}, ${p4.age},${p4.gender}")

    p4 = Person4("남성", age=100)
    println("${p4.name}, ${p4.age},${p4.gender}")
}

출력 결과
스폰지밥, 20,여성
스폰지밥, 100,남성

 

 

 

 

init 블록을 이용해서 속성 값 초기화

init 블록은 주 생성자를 통한 속성 ㄱ밧 초기화 작업이 끝난 직후에 실행된다.
속성 값을 초기화 할 때 필요한 코드가 있다면 init 블록을 사용하면 된다.
class Overlap1(var originName: String, var originAge: Int, var originGender: String){
                //가공할 공간이 없기 때문에 가공처리가 필요하면 init 블럭에 가공하면 된다.

    var overName: String
    var overAge: Int
    var overGender: String

/* 주 생성자에서는 코드를 작성할 수 없으므로 주 생성자 호출 이후 바로 호출 되는 init 블록 내부에
   전달 받은 원래 이름, 나이, 성별 정보를 덮어 씌울 수 있다.*/
    
    init{
        overName = originName.reversed()
        overAge = originAge * 2
        overGender = if(originGender == "남성") "여성" else "남성"
    } //추가적인 초기화 작업, 전달받은 값을 over~ 에 초기화해라
}

fun main(){

	var over1 = Overlap1("징징이",23,"남성")
        println("${over1.overName}, ${over1.overAge}, ${over1.overGender}")    
}

출력 결과
이징징, 46, 여성

 

 

 

주 생성자의 var 키워드를 생략하여 전달 된 원래 이름, 나이, 성별을 저장하는 속성이 생성되지 않도록 수정
class Overlap2(originName: String, originAge: Int,  originGender: String){

    var overName: String
    var overAge: Int
    var overGender: String

    init{
        overName = originName.reversed()
        overAge = originAge * 2
        overGender = if(originGender == "남성") "여성" else "남성"
    }
}

fun main(){
 
 	var over2 = Overlap2("뚱이",16,"여성")
	println("${over2.overName}, ${over2.overAge}, ${over2.overGender}")
    
}

출력 결과
이뚱, 32, 남성

 

 

 

속성 값 초기화 작업에 간단한 한 줄의 코드만 필요하다면 init 블록을 사용하지 않고 바로 대입 가능
class Overlap3(originName: String, originAge: Int,  originGender: String){
   
    var overName: String = originName.reversed()
    var overAge: Int = originAge * 2
    var overGender: String = if(originGender == "남성") "여성" else "남성"
}

fun main(){

    var over3 = Overlap3("잠만보",30,"남성")
    println("${over3.overName}, ${over3.overAge}, ${over3.overGender}")
}

출력 결과
보만잠, 60, 여성
반응형