밤에 쓴 코드

OOP ) Class,객체간의 소통 본문

OOP

OOP ) Class,객체간의 소통

붱이🦉 2019. 4. 7. 17:13

왜 ?

개발자는 소프트웨어에 세상을 표현한다.
게임으로 이해해도 좋을 것같다.
세상은 메모리공간이고
그 곳에 여러 생물/무생물 : 객체 들 을 만들어 내는 것은 개발자의 몫이다.
앞으로의 메모리 공간에는
수많은 종류의 객체들이 존재할 것이다 .
재사용성을 위해 클래스로 공통적인 속성과 동작을 정의해두고 ,
각각의 객체들은 공통적인 속성과 동작은 가지고있으나 , 각기 내는 결과와 반환 값은 다를수있다

ex)

속성 - 무기는 모두 공격력을 가지고는 있으나 , 같은 공격력을 가지고 있지는 않다.
동작 - 동물은 모두 이동하나 , 고양이는 4족보행 , 사람은 직립보행을 한다.

클래스 의 구조


class 무기{

    var 무기명:String
    var 공격력 :UInt

    init(무기명:String , 공격력:UInt){
        self.무기명 = 무기명
        self.공격력 = 공격력
    }
    // 동작 - 메소드( 타입에 선언되어있는 함수)
    func 피해를준다( 공격대상 : 플레이어 ){
       공격대상.피해를입다(데미지: self.공격력)
    }

}

메모리로 구성된 세상에 무기를 만들고 싶다면 , 무기라는 추상적인 개념들이 가진 공통적인 속성, 동작 을 뽑아내어 class로 표현하고
그걸 class내에서 각각 프로퍼티 ( 변수) 와 메소드 로 표현한다.


class 플레이어{


    // 속성,상태 - 프로퍼티(변수)

    var 이름: String?
    var 체력 : UInt = 100
    var 장착무기 : 무기?


    init(플레이어이름:String){
        self.이름 = 플레이어이름
    }

    // 동작 - 메소드( 타입에 선언되어있는 함수)
    func 공격한다( 적 : 플레이어 ){
        print("\(self.이름!)가 \(적.이름!)에게 \(self.장착무기!.공격력)만큼 피해를 입힙니다.")
        self.장착무기?.피해를준다( 공격대상: 적)
    }

    func 이동한다 (){

    }

    func 피해를입다(데미지:UInt){
        self.체력 -= 데미지
    }

}

무기를 사용할 플레이어 또한 class로 만들어 둔다.

var 플레이어1 = 플레이어(플레이어이름: "부엉이_전사")
플레이어1.장착무기 = 무기(무기명: "부엉이검", 공격력: 10)

var 플레이어2 = 플레이어(플레이어이름: "올빼미_궁수")
플레이어2.장착무기 = 무기(무기명: "올빼미활", 공격력: 5)

메모리로 구성된 세상에서 이용할 객체를 만든다.
플레이어라는 class로 만들어진
'부엉이_전사' ,'올빼미_궁수'은 둘다 이름과 , 장착무기는 가지고있으나 각각의 무기와 이름은 상이하다.
무기라는 클래스로 구성된 class '부엉이의검','올빼미의활' 또한 동일하다.

객체간의 메세지전달 - 소통


플레이어1.공격한다(적: 플레이어2)     //부엉이_전사가 올뺴미_궁수에게 10만큼 피해를 입힙니다.
플레이어2.공격한다(적: 플레이어1)    //올뺴미_궁수가 부엉이_전사에게 5만큼 피해를 입힙니다.

현실또한 그렇듯 객체들간의 소통을 통해 메모리 세상은 돌아간다.
플레이어1이라는 객체가 공격한다라는 동작을 플레이어2를 대상으로 행하게 되고 , 그에 따른 플레이어2플레이어1의 장착무기의 공격력만큼의 피해를 입는다.

이처럼 플레이어1은 자신이 가진 장착무기객체에게 메시지를 보내고장착무기는 다시 플레이어2에게 메시지를 전달한다.
이런 구조로 객체는 소통하게 된다.

'OOP' 카테고리의 다른 글

OOP ) SOLID - 객체지향 5원칙  (0) 2019.05.18
OOP ) 타입, 추상화  (0) 2019.04.28
OOP ) 상태 , 행동 , 식별자  (0) 2019.04.26
OOP) 역할 , 책임 , 협력  (0) 2019.04.22
OOP ) 클래스 / 인스턴스 / 객체  (0) 2019.04.02
Comments