티스토리 뷰

CS

객체지향프로그래밍(OOP)

데브캣_DevCat 2022. 8. 18. 09:07

What I Learned

💡 객체지향 프로그래밍을 나 나름대로 구상해보았다.
RPG 게임 세계를 만든다고 가정하고, 순차적 프로그래밍을 통해 구현한다고 하면 player가 가야할 길을 일일이 프로그래밍 해주어야 한다.
A라는 지역에 가서 "아무개" 라는 NPC에게 말을 걸고 1번 이벤트를 진행해야 한다고 하면 순서대로 프로그래밍을 하고,  "아무개"에게 말을 걸기 전에는 1번 이벤트가 진행되지 않도록 막는다던가 1번 이벤트가 진행된 후에 "아무개"에게 말을 거는 프로그래밍을 추가로 해주어야 한다.
게임이 방대해지고 이벤트가 많아지면 경우의 수가 기하급수적으로 늘어나기 때문에 프로그래밍 하는 게 부담스러워지고 놓치는 부분도 많아질 것이다.

💡 또 같은 게임을 절차적 프로그래밍을 통해 구현해보자.
player가 A라는 지역에 진입하면 openA 라는 함수를 불러오고, "아무개"에게 말을 걸었을 때는 npc1Talk 함수를 실행한다. 그리고 1번 이벤트는 getEvent라는 함수로 불러오게 된다면 player가 하는 행동에 따라 함수가 불러와지므로 순차적 프로그래밍을 할 때보다 자유도가 높아지고프로그래밍의 부담도 덜해질 것 같다.
그러나 이것또한 이벤트가 많아지고 NPC가 늘어나면 npc1Talk부터 시작해서 npc(n개)Talk 함수까지 만들어야 할 뿐 아니라 npc와 대화하는 함수, 물건을 구입하는 함수, 판매하는 함수, 전투하는 함수 등 한 명의 npc에 해당하는 함수가 늘어나 프로그래밍이 부담스럽고 복잡해질 것이다.

💡 이것을 객체지향 프로그래밍을 통해 구현한다면 어떻게 될까?
Talk, Sell, Buy, Battle 이라는 클래스를 구성해놓고 npc 객체를 생성한 후 필요한 클래스를 상속하거나 불러오면 될 것이다. "아무개"라는 npc가 하는 행동을 일일이 함수를 뒤져가며 대화를 할 수 있고 물건을 살 수 있고 전투를 할 수 있구나라고 알아내는 것이 아니라, "아무개" 객체가 무엇을 상속했는지 또는 불러왔는지 한눈에 알아볼 수 있을 것이다. npc가 늘어나고 각 객체마다 무엇을 불러오고 있는지 한눈에 볼 수 있고 그저 새로운 객체를 생성해서 미리 만들어둔 클래스를 이용하게만 하면 여러개의 행동을 행동마다 함수로 구현하지 않고 하나의 객체 안에 간단하게 구현할 수 있다.
이번 2주차 과제로 객체지향 프로그래밍을 간단하게 해보았는데 무언가 내 마음대로 세계를 설계하고 객체에게 생명을 주는, 나만의 세계를 만드는 기분이었다.  처음 Java를 접했을 때는 Javascipt나 python에 비해 코드가 많고 복잡해서 정이 안 갔는데 객체지향 프로그래밍을 해보고 공부해볼수록 객체지향 프로그래밍 언어에 대해 더 깊이 알고 나아가서 더 큰 나만의 세계를 구현해보고 싶다는 생각이 들었다!

객체지향 프로그래밍

객체지향이란?

  • 객체(Object)
    • 현실세계의 실체 및 개념을 반영하는 상태(Status)와 행위(Behavior)를 정의한 데이터의 집합
  • 객체지향(Object-Oriented) 프로그래밍
    • 각자의 역할을 지닌 객체들끼리 서로 메시지를 주고받으며 동작할 수 있도록 프로그래밍 하는 것

객체지향의 장점(강점)

객체를 중심으로 프로그래밍하기 때문에,

  • 사람의 관점에서 프로그램을 이해하고 파악하기 쉽다.
  • 강한 응집력(Strong Cohesion)과 약한 결합력(Weak Coupling)을 가진다.
  • 재사용성, 확장성, 융통성이 높다.

이러한 장점 때문에 디버깅과 유지보수가 용이하고 설계과 분석이 비교적 쉽다.

객체지향의 단점(한계)

  • 객체 간의 정보 교환이 모두 메시지 교환을 통해 일어나므로 실행 시스템에 많은 overhead가 발생하게 된다.
    • 처리속도가 상대적으로 느리다.
    • 하지만 하드웨어의 발전으로 이러한 단점은 어느정도 해소되었다.
  • 객체가 상태를 갖기 때문에 예상치 못한 부작용이 발생할 수 있다. 변수가 존재하고 이 변수를 통해 객체가 예측할 수 없는 상태를 갖게 되어 애플리케이션 내부에서 버그를 발생시킬 수 있다.
    • 이는 함수형 프로그래밍 등장의 패러다임이다.

객체지향적 설계원칙 SOLID

  • SRP(Single Responsibility Principle)단일 책임 원칙
    • 클래스는 단 하나의 책임을 가져야 하며 클래스를 변경하는 이유는 단 하나의 이유이어야 한다.
  • OCP(Open-Closed Principle) : 개방-폐쇄 원칙
    • 확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다.
  • LSP(Liskov Substitution Principle) : 리스코프 치환 원칙
    • 상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.
  • ISP(Interface Segregation Principle) : 인터페이스 분리 원칙
    • 인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.
  • DIP(Dependency Inversion Principle) : 의존 역전 원칙
    • 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다.

객체지향의 특징

  • 추상화
    • 공통의 속성이나 기능을 묶어 이름을 붙이는 것
    • 클래스를 정의하는 것
  • 캡슐화
    • 관련있는 변수와 메소드를 묶어주는 것
    • (JAVA)접근 제어 지시자를 통해 외부 접근을 제한하며 이를 정보은닉이라고 함
  • 다형성
    • 하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석되는 것
    • 오버로딩, 오버라이딩 개념
      • 오버로딩
        • 같은 클래스 내에서 동일한 이름의 함수를 여러 개 정의하고 매개 변수의 유형과 개수를 다르게 하는 것.
      • 오버라이딩
        • 부모 클래스의 메소드를 자식 클래스가 재정의 하는 것
  • 상속
    • 자식클래스는 상속을 통해 부모클래스의 속성과 기능을 물려받음
    • 상속받은 기능의 일부를 수정하여 사용 가능
  • 클래스(class)
    • 객체를 만들기 위해 상태(field)와 행위(method)를 정의한 틀
  • 메시지
    • 객체지향적으로 구현된 프로그램은 객체들끼리의 메시지를 주고받고 상호작용하며 동작한다. 코드적으로는 임의의 객체에게 인자(parameter)를 전달하여 메소드를 호출하며 반환값(return value)을 받아 처리를 한다.

알고 보면 재밌는 객체 지향 프로그래밍,

OOP 흝어보기객체지향프로그래밍 제대로 이해하기

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함