Kotlin

객체지향 프로그래밍

공부처음하는사람 2023. 12. 22. 20:48

객체지향 프로그래밍의 개념

객체지향 프로그래밍 코드는 코드를 정리하는 방법이다.
데이터에 대한 생각, 구조방식이라고 할 수 있다.

비디오 게임을 만든다고 상상해보자.

이 경우 플레이어 객체(object)가 필요하다.
각 플레이어 객체는 각각 다른 데이터를 갖을 것이다.
플레이어를 단 한명만 만든다면

const player = {
    name: "Elon Musk",
      health: 85,
      skill: "Programmer",
};

이렇게 코딩을 해도 될 것이다.

하지만 숫자가 늘어나면 문제가 생긴다.
플레이어들이 늘어나면 패턴, 이슈들이 생기는데

다른 플레이어도 마찬가지로 모두 같은 속성(property)를 가지고 있다.
name, health, skill과 같은 동일한 속성(property) 말이다.
다른점은 data뿐이다.

const player = {
    name: "Mark Zuckerberg",
      health: 90,
      skill: "Programmer",
};

const player = {
    name: "Warren Buffett",
      health: 50,
      skill: "Investor",
};

바로 여기서 생기는 이슈는 플레이어를 구성하는 모습이 어떠해야한다 하는 일종의 '구조'에 대한 고민이 없는 것.

실수로 skill을 넣는걸 빼먹을 수 있고, 오타가 발생할 수 있다.
플레이어 수가 많다면 이런 스펠링 에러들은 당연히 찾기가 힘들 것이다.

이렇게 코드 복제를 해서 플레이어를 생성하게 된다면, 내가 새로운 속성(property)'경험치'를 추가하고 싶다면?
한땀한땀 작성해야 할 것이다.. 이것을 해결하기 위해
일종의 플레이어 팩토리를 만드는 것이다.

내가 데이터만 넣으면 적용해주는 함수가 있는, 그리고 객체를 아웃풋으로도 얻을 수 있다. 이렇게 하면 오타를 낼 일도 없고, 일일이 복제를 할 필요도 없을거다.

바로 이것이 OOP의 초석을 사용 할 때이고, 이게 바로 Class의 개념이다.
Class는 객체를 위한 팩토리와 같은 것이다.

Class는 일종의 구조. 설계도를 만들어 준다. 플레이어 객체가 어떻게 보여야 하는지에 대한 도면을 정의해준다.

Class를 적용하면 아래의 코드가 완성된다.

class Player {
    constructor(name, health, skill) {
        this.name = name;
        this.health = health;
        this.skill = skill;
        this.xp = 0;
    }
}

const bill = new Player("Elon Musk", 85, "Programmer");
const bill = new Player("Mark Zuckerberg", 90, "Programmer");
const bill = new Player("Warren Buffett", 50, "Investor");

일일이 복사하지 않아도 돼고 코드가 굉장히 깔끔하며 쉬워졌다.
(Kotlin이 아니지만 예시가 js나 python밖에 없어서.. 그래도 이해는 간다)

클래스는 일종의 금형 설계도 같은 것이다. 동일한 속성(property), 그러나 각각 다른 데이터를 갖고있는 수많은 플레이어 객체를 생성할 수 있다.

(검색해보니 한국에선 붕어빵 틀 예시가 되게 많다 ㅋㅋㅋ)

const elon = new Player("Elon Musk", 90, "Legend");
//여기서 elon을 플레이어 class의 객체 혹은 인스턴스라고 지칭한다.

인스턴스 혹은 객체란 '쿠키 금형'을 사용한 후에 얻을 수 있는 쿠키이다.
constructor와 init이 있는데 이것은 정상적인 함수이지만 클래스 내에 있기에 method라고 불린다.
(이건 Kotlin에서도 마찬가지 인지는 확인해봐야 함. 내가 이해하기론 constructor는 명시적 생성자 init은 주생성자라고 따로 분류하는걸로 이해했음..)

메서드는 클래스를 더 높은 단계로 진화 시켜주는 역할을 한다.
메서드를 통해 플레이어 클래스에서 생선된 모든 객체가 서로 인사를 하는 기능, 전투게임을 만든다면 플레이어가 맞았을때 무슨일이 생기는지 코딩할 수도 있다.
메서드로 조작할 수 있는 인터페이스를 만들 수 있게 된 것이다.


OOP에서 가장 핵심기능인 '상속(Inheritance)'를 살펴보자

상속은 코드 중복을 줄이고 코드를 재사용 가능한 조각으로 나눌 수 있다.
현실에서는 상속은 부모님이 돌아가신 후 자식들이 무언가를 물려받는 개념이지만, OOP 세상에선 그 누구도 죽지 않지만
자녀클래스가 부모클래스의 속성을 갖게된다.

우리가 심즈게임을 만든다고 가정해보자.
그렇다면 '인간'을 위한 클래스를 만들어야 할 것이다.
'인간'에 속하는 '아기'클래스도 있어야 할 것이다. 아기의 속성은 귀엽고, 걷지 못하고 잘 우는 속성을 갖고 있겠지
'청소년' 클래스도 있어야 할 것이다. 말을 안듣고 욕을 하는,, 속성을 가지고 있을 수 있겠고.

여기서 코드 중복이 발생한다. 위 클래스들은 이름이 있고, 두 팔과 두 다리를 가지고 있다. 바로 이 때 '상속'개념이 필요한 것이다.
이름이 있고, 두 팔, 두다리가 있는 Human 클래스에서 확장을 하면 된다.

fun main() {
    var human = Human("인간")
    var baby = Baby("아기")
    var teenager = Teenager("청소년")

    human.sleeping()
    baby.sleeping()
    teenager.sleeping() 
}

open class Human(name:String) {
    var name: String = ""

    init {
        // this는 현재 클래스의 상태변수를 의미합니다
        // var name: String = ""
        this.name = name
    }

    fun sleeping() {
        println("${name} 자는중")
    }

}

class Baby(name: String) : Human(name) {

}

class Teenager(name: String) : Human(name) {

}

(팔과 다리로 예시를 들긴 했으나 그냥 간략하게 어떤 형식인지만 이해해보자..)


객체지향이 너무 헷갈리고 어려워서 검색 후 정리해보았다.
한 절반쯤은 이해가 되는거 같다.

'Kotlin' 카테고리의 다른 글

내일배움캠프 12.08 TIL  (2) 2023.12.22
내일배움캠프 12.07 TIL  (1) 2023.12.22
순수 함수  (0) 2023.12.22
내일배움캠프 12.06 TIL  (2) 2023.12.22
내일배움캠프 12.04 TIL  (2) 2023.12.22