얼렁뚱땅

[Kotlin] Class 본문

Android 앱 개발

[Kotlin] Class

당당익명 2020. 12. 26. 01:20
패스트캠퍼스 강의 [Kotlin] 25~29

클래스란

// 18. Class

// OOP -> Object Oriented Programing (객체지향 프로그래밍)

// "객체"란 뭘까?
// - 이름이 있는 모든 것

// 절차지향 프로그래밍 문제 해결 방법
// - 코드를 위에서 부터 아래로 실행을 하면 문제가 해결된다!

// 객체지향 프로그래밍 문제 해결 방법
// - 객체를 만들어서, 객체에게 일을 시켜서 문제를 해결한다
// - 선수, 심판, 경기장, 관중 -> 축구 게임

// 객체를 만드는 방법
// - framework 가 제공해주지 않는 것을 만들때 객체를 따로 정의해야한다.
// - 객체가 무엇으로 어떻게 만들어지는지 "설명서"가 있어야 한다.

<자바 공부할 때 정리 했던 내용>

- 클래스 -> 설계도

- 인스턴스(=객체 = object) -> 설계도로 제작된 실제 물건

 

- 클래스 구성 멤버

    - 필드(field)

    - 메서드(method)

    - 생성자(constructor)

 

- 생성자

    - 초기화 할 때 사용

 

- this는 자신의 class를 가리킨다.

   (파라미터 변수와 클래스의 필드의 이름이 같을 경우 구분해주기 위해 사용한다. 만약 this가 없으면 파라미터 변수를 가리킨다.)

 

- overloading

    - 클래스 내에 같은 이름의 메소드를 여러개 선언하는 것

    - 하나의 메소드 이름으로 다양한 매개값을 받기 위해 오버로딩을 한다.

    - 오버로딩의 조건: 같은 메소드 이름, 파라미터의 개수나 데이터 형식이 달라야함.

    - 생성자도 메소드의 일종이므로 메소드 오버로딩이 가능.


클래스(설명서) 만드는 방법

// 클래스(설명서) 만드는 방법(1)
class Car constructor(var engine: String, var body: String) {

}

// 클래스(설명서) 만드는 방법(2)
class SuperCar {
    var engine: String
    var body: String
    var door: String

    constructor(engine: String, body: String, door: String) {
        this.engine = engine
        this.body = body
        this.door = door
    }
}

// 클래스(설명서) 만드는 방법(3) -> (1)번 방법의 확장
class Car1 constructor(engine: String, body: String) {
    var door: String = ""

    //생성자
    constructor(engine: String, body: String, door: String) : this(engine, body) {
        this.door = door
    }
}

// 클래스(설명서) 만드는 방법(4) -> (2)번 방법의 확장
class Car2 {
    var engine: String = ""
    var body: String = ""
    var door: String = ""

    constructor(engine: String, body: String) {
        this.engine = engine
        this.body = body
    }

    constructor(engine: String, body: String, door: String) {
        this.engine = engine
        this.body = body
        this.door = door
    }
}

기본적으로 class가 호출 되면 ( ) 이 괄호 내부가 불리는 것이다. ( )가 constructor의 역할을 한다고 봐도 될듯?

1. 2번을 짧게 쓰는 방법이다. (engine, body)

2. 가장 기본 방법 (engine, body, door)

3. engine과 body는 필수이지만 door는 있어도 없어도 상관없는 경우

    - 1. engine과 body만 주어졌을 경우: (engine: String, body: String) 이 부분을 통해 인스턴스가 생성된다.

    - 2. engine, body, door가 모두 주어졌을 경우: 아래의 constructor 부분을 통해 인스턴스가 생성된다.

    - this는 Car1과 동일하다. this를 통해 위의 Car1에게 engine과 body를 넘겨주면서 1번 과정 진행 후, 아래의 this를 통해 door를 넘겨준다.

    - door 생성시 기본값이 필요하기 때문에 ""을 넣어준다.

4. engine과 body는 필수이지만 door는 있어도 없어도 상관없는 경우 (3번과 동일한 조건)

    - 1. engine과 body만 주어졌을 경우: 첫번째 constructor

    - 2. engine, body, door가 모두 주어졌을 경우: 두번째 constructor

 

===> 결론: 1번과 3번을 사용하면 될 듯

* constructor 키워드를 삭제해도 된다.


클래스(설명서)를 통해서 실체를 만드는 방법

-> 인스턴스화를 통해서 -> 인스턴스(객체)을 얻게 된다.

Car("v8 engine", "big")
// class를 변수에 넣을 수도 있다.
val bigCar = Car("v8 engine", "big")

// 우리가 만든 클래스(설명서)는 자료형이 된다
// 설명서 (1) 사용
val bigCar1: Car = Car("v8 engine", "big")
// 설명서 (2) 사용
val superCar: SuperCar = SuperCar("good engine", "big", "white")

기능(method) 추가하는 방법

// 기능(1)
class RunableCar(engine: String, body: String) {

    fun ride() {
        println("탑승 하였습니다")
    }
    
    fun drive() {
        println("달립니다 !")
    }
    
    fun navi(destination: String) {
        println("$destination 으로 목적지가 설정되었습니다")
    }
}

// 기능(2)
class RunableCar2 {
    var engine: String
    var body: String

    constructor(engine: String, body: String) {
        this.engine = engine
        this.body = body
    }

    init {
        // 초기셋팅을 할 때 유용하다
        println("RunableCar2가 만들어 졌습니다")
    }

    fun ride() {
        println("탑승 하였습니다")
    }

    fun drive() {
        println("달립니다 !")
    }

    fun navi(destination: String) {
        println("$destination 으로 목적지가 설정되었습니다")
    }
}

1. 간단하게 표기한 것

2. 가장 기본적인 틀

    - 객체 생성시 init() 함수가 가장 먼저 호출된다.


기능과 요소 사용하기

// 인스턴스가 가지고있는 기능을 사용하는 방법
val runableCar: RunableCar = RunableCar("simple engine", "short body")
runableCar.ride()
runableCar.navi("부산")
runableCar.drive()
    
// 인스턴스의 멤버 변수에 접근 하는 방법
val runableCar2: RunableCar2 = RunableCar2("nice engine", "long body")
println(runableCar2.body)
println(runableCar2.engine)

오버로딩(Overloading)

// 오버로딩
// -> 이름이 같지만 받는 파라미터가 다른 함수
class TestClass() {

    fun test(a: Int) {
        println("up")
    }

    fun test(a: Int, b: Int) {
        println("down")
    }
}

main 함수 내부

val testCalss = TestClass()
    testCalss.test(1)
    testCalss.test(1, 2)

'Android 앱 개발' 카테고리의 다른 글

[UI] UI final 과제  (0) 2020.12.25
[UI] Drawable  (0) 2020.12.25
[UI] Image View  (0) 2020.12.24
[UI] Scroll View  (0) 2020.12.24
[UI] Padding, Margin  (0) 2020.12.24