GDSC HUFS 4기/Kotlin Team #7

[7팀] 코틀린 객체 지향 프로그램 기초(1)

jorippppong_조리퐁 2022. 10. 7. 22:21

이 글은 이것이 안드로이드다 with 코틀린(개정판)를 참고하여 작성하였습니다.

작성자 : 조유리

개발환경은 Windows, Android Studio입니다.

 

 

1. OOP

객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)

1) 변수, 타입

2) 흐름 제어 : 조건이 맞을 시에 실행, loop 가능

3) 함수 : 코드를 쉽게 나누게 해줌, 필요할 때 다시 사용 가능

4) collection

5) class, object

 

2. 클래스

class : 속성, 기술을 정의해주는 청사진 (붕어빵 틀)

object : class를 통해 생산한 한 대의 차 (붕어빵)

 

① 클래스 선언

class Person{}
/*
대문자로 시작
가시성 변경자를 붙이지 않으면, 기본으로 public
*/
val myPerson = Person()  //new 키워드 사용하지 않고 선언

 

② 생성자, 부생성자

//하나의 주 생성자(primary constructor), 여러 개의 부 생성자(secondary constructor) 사용가능
class Person constructor(name:String, age:Int){
    val name:String = name
    val age:Int = age
}

//주 생성자에 파라미터 val 또는 var 키워드를 추가하면 파라미터에 상응하는 프로퍼티가 자동으로 생성된다.
class Person (val name:String, val age:Int =25){}  //디폴트값 정의

val myPerson1 = Person("김가나", 20)
val myPerson2 = Person("박다라")

/*
부 생성자: 
주 생성자를 상속받는 구조, 반드시 주 생성자가 가지고 있는 인자를 가지고 있어야 한다.
var, val 키워드 사용 불가
*/
class Person (val name: String){
    var age : Int = 20
    constructor(name: String, age : Int) : this(name){  //this 키워드를 이용하여 주 생성자 호출
        this.age = age
    }
}
​

 

③ 초기화 블록

class Person (val name: String, val age: Int = 25){
    val address : String = ""
    init {
        println("주 생성자 초기화 블록")
    }
    constructor(name : String, age : Int, address : String) : this(name, age){
        println("부 생성자")
    }
}

fun main(){
    val myPerson = Person("김가나",25,"GDSC")
}

/*
(출력)
주 생성자 초기화 블록 (init 블록이 먼저 호출)
부 생성자  (부 생성자 호출)
*/
​

 

3. 늦은 초기화와 게터, 세터

/*
늦은 초기화 사용
프로퍼티 선언과 동시에 초기화 하지 않아도 된다.
*/
lateninit var owner : String

setter : 외부에서 메소드를 통해 데이터에 접근하면, 메소드는 매개값을 검증해서 유효한 값만 데이터로 저장할 수 있다.

getter : 데이터 복사본을 던져주기 때문에 원래 객체의 데이터를 손상시키지 않는다. 따라서 원본 데이터는 안전하다. 

//수정 전의 default 모습
class Car(_brand: String, _model: String, _maxSpeed: Int) {
    val brand: String = _brand  //val -> 수정 불가능(immutable), getter만 가능
        get() = field
    
    var model: String = _model
        get() = field
        set(value) {
            field = value
        }
    
    var maxSpeed: Int = _maxSpeed
        get() = field
        set(value) {
            field = value
        }
}
//수정
class Car() {
    lateinit var owner : String  //lateinit -> 나중에 지정해주겠다
 
    val myBrand: String = "BMW"
    // 수정한 getter
    get() {     
        return field.toLowerCase()  //받아서 소문자로 반환
    }   
    
    
    // default setter and getter
    var myModel: String = "M5"
        private set 
 
    var myMaxSpeed: Int = maxSpeed
        get() = field
        // 수정한 Setter
        set(value) {
            field = if(value > 0) value else throw IllegalArgumentException("_maxSpeed must be greater than zero")
    }
 
    init{
        this.myModel = "M3"
        this.owner = "Frank"
    }
}

 

4. data class

data class Person(var name: String, var age: Int, var gender: String)

제한 사항) 상속을 지원하지 않는다. 

                 기본 생성자에 최소 하나의 파라미터가 있어야 한다.

                 기본 생성자의 파라미터는 val, var

                 abstract, open, sealed, inner와 같이 사용 불가

제공하는 메소드) toString(), hashCode(), equals(), copy(), componentN()