CS | OOP (Object Orientied Programming) ?

kihyeon8949·2021년 2월 18일
0

CS

목록 보기
2/2
post-thumbnail

TypeScript의 사용으로 얻을 수 있는 이점 중 하나를 기존의 JS를 통해 구현하면 OOP보다 강력한 프로그래밍을 사용할 수 있다는 것이었다.

OOP란 코딩을 하기 위한 방식, 패러다임 중 하나로 FP(함수형 프로그래밍), 절차지향형 프로그래밍 등 여러가지가 있다.

모두 좀 더 좋은 코드, 간결한 코드를 작성하기 위한 도구나 방법일 뿐 무엇이 더 좋고 나쁘다는 것은 없다. 이런 패러다임을 잘 이해하고 활용해서 구현의 질의 높이는 것이 더 중요한 것 같다.


OOP (Object Orientied Programming) : 객체지향 프로그래밍

OOP에 대한 정확한 컨셉

OOP의 관습

함수형 프로그래밍에 대해서 잠깐 공부하면서 봤지만, 실제로 많은 복잡한 내용들을 짧은 코드로 만들 수 있도록 해준다. 그래서 기존에 객체지향으로 했을 때 코드는 복잡해지지만 자료의 구조를 실상에서처럼 잘 구현하고 하던 부분에서 생길 수 있는 복잡함, 그것들을 해결해 줄 수 있는 방법이 되기도 한다. 근데 그건 기존의 개발 패러다임에서도 하나 둘 맞춰서 추가되고 있다. 그것을 그전부터 이해하던 사람들이 보기에는 생소하고 이해하기 어려워서 그렇지.


절차지향적 프로그래밍 (Imperative and Procedural Programming)

OOP를 알기 전에 보통 절차지향적 프로그래밍과 문제점을 이야기하고 OOP를 도입함으로 얻을 수 있는 이점을 설명한다.

처음 접하는 프로젝트라면 함수가 여러가지가 얽혀있고, 이 때문에 발생하는 여러 문제점들이 있다.

  • 먼저, 데이터가 다른 곳에서 나도 모르게 업데이트 될 수 있기 때문에 하나의 변경사항을 위해서 전체적인 어플리케이션에 대해서 잘 이해해야하더라도 사이드 이펙트가 발생할 확률이 높다. 그런 가능성 때문에 프로그래머가 한 함수의 작동에 영향을 받는 변수를 조사해야 할 때 모든 변수를 다 조사해야 하는 어려움에 봉착했다.

  • 다음으로는 한 눈에 어플리케이션을 이해하기 어렵기 때문에 절차지향적 프로그래밍은 유지보수가 어렵 확정성 ↓이 떨어진다.

  • 마지막으로 모델링이 복잡해질수록 스파게티와 같이 상호작용들이 꼬여서 대규모 어플리케이션의 개발이 힘들다. 단순한 프로젝트라면 잘 구조화 된 하향식(Top-down) 구조적 프로그래밍으로도 충분한 해결이 가능하다. (이는 잘게 쪼개진 함수/프로시저끼리 호출하는 방법으로 해결한다는 의미이다.)

    하지만 이러한 구조적 프로그래밍으로도 namespace나 context의 분리가 까다롭다는 단점이 아직 존재하며, 이러한 단점은 문제의 어플리케이션의 규모가 클 수록 더 크게 다가온다.

    	* namespace: 변수명, 클래스명, 메소드명, 파일명 등의 이름을 다 써서 이름을 짓기 어려운 상황

OPP가 뭐야?

객체 지향 프로그래밍은 컴퓨터 프로그래밍 패러다임중 하나로, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.

*(프로그램을 객체로 정의시키고 객체들 간에 의사소통하도록 디자인하고 코딩해나가는 것)

절차지향적 프로그래밍 처럼 프로그램을 데이터와 처리 방식만으로 나누는 것이 아닌, 데이터와 처리방식을 포함한 수많은 “객체(Object)”들로 정의해서 이들의 상호작용으로 프로그래밍 해나가는 것을 의미한다.

Object(객체)는 우리가 살면서 흔하게 볼 수 있는 물건들을 Object(객체)라고 이야기 한다. 그래서 사람과 가까운 생각을 하면서 Object를 구성할 수 있다.


OOP의 장단점?

▶장점

  • 코드 재사용 용이
    : 남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 확장해서 사용할 수 있음.
    : 여러번 반복되는 것이 있다면 관련된 오브젝트를 재사용 할 수도 있다.

  • 유지보수가 쉬움
    : 절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수혹은 메서드로 있기 때문에 관련있는 오브젝트만 이해하고 수정하면 된다.

  • 대형 프로젝트에 적합
    : 클래스단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러명, 여러회사에서 개발이 필요할 시 업무 분담하기 쉽다.
    또, 새로운 기능이 필요해지면 새로운 오브젝트를 생성하면 되니까 확장성도 높다.

✅ 생산성 ↑, 높은 퀄리티, 문제해결 및 유지보수

✅ etc...

  • Error, Exception, Event 등로 오브젝트로 만들고 관리할 수 있다.

▶단점

  • 처리 속도가 절차 지향 프로그래밍에 비해 상대적으로 느리다.

  • 객체가 많으면 용량이 커질 수 있다.

  • 객체가 갖는 것들(속성, 행위)에 대해 고민이 필요하기 때문에 설계 시 많은 노력과 시간이 필요하다.

  • 데이터 클래스의 상속이라는 개념은 굉장히 뛰어나지만 마찬가지로 굉장히 복잡한 특성을 지니게 해준다.
    : 면밀한 자료 분석, 개발시간 단축, 좀더 정확한 코딩을 보증하지만 ⇨ 코드 난이도 급상승↑

그래서 최근에는 "어떤 함수를 어디에서 사용하여 구현할까?", 즉 함수의 행위에만 집중한 FP또한 주목받고있다고 한다.


Object ?

  • 오브젝트는 하나의 객체로 꼭 명사를 이용해서 작성하여야한다.
  • 오브젝트의 속성을 가진 데이터들을 fields 혹은 properties라고 부른다.
  • 오브젝트 안의 함수들은 보통 method라고 부른다.

🌟 class & object

프로그래밍 언어마다 다를 수 있지만, 보통은 class를 통해서 object를 구현한다.
흔히 class = "붕어빵 틀" 에 비유하고 object = "팥 붕어빵" 에 비유한다.

classobject
template🌟 instance of a class
declare "once"created "many times"
data Xdata O


객체지향(OOP)의 특징!

OOP는 네 가지의 원칙(특징)을 가진다.

  • ✏️캡슐화 (Encapsulation)
  • ✏️추상화 (Abstraction)
  • ✏️상속 (Inheritance)
  • ✏️다형성 (Polymorphism)

✏️캡슐화 (Encapsulation)

: 관련있는 변수와 함수를 하나의 단위(한 오브젝트)로 묶는 것을 의미한다.
: class를 만들 때 외부에서 접근할 수 있는 것, 내부적으로만 가져야하는 데이터 등을 결정한다.

즉, 데이터의 번들링(Bundling)이다. 대개 프로그래밍 언어에서 이 번들링은 클래스를 통해 구현되고, 해당 클래스의 인스턴스 생성을 통해 클래스 안에 포함된 멤버 변수와 메소드에 쉽게 접근할 수 있다. 클래스는 객체 지향 프로그래밍을 지원하는 거의 대부분의 언어가 제공하는 제1요소이다.

  • 목적
    • 코드의 재사용
    • 캡슐화를 통한 정보 은닉
      : 외부에 보일 필요가 없는 데이터를 숨겨놓는것.
      : 🚫 '캡슐화 !== 정보 은닉'
      보통 캡슐화와 정보 은닉을 묶어서 생각하는 경우가 많은데, 정보 은닉캡슐화로부터 파생된 보조 개념이지 '캡슐화 !== 정보 은닉' 이다.

✏️추상화 (Abstraction)

: 오브젝트 내부의 복잡한 구현사항을 다 이해하지 않고 외부에서 보이는 간단한 인터페이스(함수, 메소드)를 통해서 오브젝트 사용할 수 있게 하는 것.
즉, 사용자가 헷갈리지 않고 쉽게 오브젝트를 사용할 수 있게 해주는 것

ex) 컴퓨터를 사용할 때, 안의 모든 것을 이해하지 않아도 키보드나 마우스등을 이용하여 간단하게 컴퓨터를 사용할 수 있다.

❗️추상화의 방법

1. 접근제어자를 통한 캡슐화(정보은닉)
: 외부에서 필요한 함수만을 노출해서 사용자가 사용하기 쉽게 만듬.

2. interface를 사용

﹡여러방법과 언어마다의 차이가 있을 수 있다.

*인터페이스(interface) 사전적 정의
: 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고받는 경우의 접점이나 경계면이다. 즉, 사용자가 기기를 쉽게 동작시키는데 도움을 주는 시스템을 의미한다. - 위키백과

캡슐화와 추상화는 그 의미에서 밀접한 부분이 많은 것 같다. 특히 "정보 은닉(Information Hiding)"의 측면에서 그런 것 같다.아래의 글을 읽어보면 둘이 밀접하다는 것을 알 수 있다.

*✅ 정보 은닉
: 프로그램의 세부 구현을 외부로 드러나지 않도록 특정 모듈 내부로 감추는 것이다. 내부의 구현은 감추고 모듈 내에서의 응집도를 높이며, 외부로의 노출을 최소화하여 모듈 간의 결합도를 떨어뜨려 유연함과 유지보수성을 높이는 개념은 거의 모든 현대 프로그래밍 언어에 녹아 있다. 많은 객체 지향 언어에서 사용되는 클래스를 기준으로 보면, 클래스 외부에서는 바깥으로 노출된 특정 메소드에만 접근이 가능하며 클래스 내부에서 어떤 식으로 처리가 이루어지는지는 알지 못하도록 설계된다.

일반적으로 세 종류의 접근제어자 사용된다.

접근제어자 (Access Modifier)

  • public: "모두 접근 가능"
    : 클래스의 외부에서 사용 가능하도록 노출시키는 것이다.
    : 따로 작성하지 않으면 public.
  • protected: "상속받은 자식만 접근 가능!"
    : 외부에서는 접근 불가능, 해당 클래스를 상속받은 자식 클래스에게는 노출되는 것이다.
  • private: "어떤 누구라도 접근 불가능"
    : 클래스의 내부에서만 사용되며 외부로 노출되지 않는다.

✏️상속 (Inheritance)

: 상속은 자식 클래스가 부모 클래스의 특성과 기능을 그대로 물려받는 것을 말한다.

  • 코드의 재사용 용이
    :캡슐화를 유지하면서 클래스의 재사용이 용이하도록 해 준다.

  • 코드 추가 및 변경 용이

    • 오버라이딩
      :기능의 일부분을 변경해야 할 경우 자식 클래스에서 상속받은 그 기능만을 수정해서 다시 정의하게 되는데, 이러한 작업을 '오버라이딩(Overriding)'이라고 한다.

=> 부모 클래스의 작업을 그대로 재사용하면서 자식 클래스에서만 특화된 작업을 추가하여 진행할 수 있다!!!

*부모 클래스 & 자식 클래스
= super & sub
= base & derived

*super
: super라는 키워드를 통해서 부모 키워드의 함수들에 접근하거나 호출 할 수 있다.
: 자식 클래스에서 constructor를 쓸 경우에 꼭 super을 호출해주어야한다.

: 자식 클래스의 constructor에서 super을 호출하지 않으면,위와 같은 에러가 뜬다.

*IS-A관계 라고도 불린다.


✏️다형성 (Polymorphism)

:하나의 변수명, 함수명 등이 상황에 따라서 다른 의미로 해석 될 수 있는 것.

즉, 오버라이딩, 오버로딩이 가능하다.

  • 오버라이딩 (Overriding)

    • 부모 클래스에 있는 메서드와 이름과 매개변수가 같고, 내용만 다른 함수를 구현하는 것을 말한다.
  • 오버로딩 (Overloading)

    • 하나의 클래스에서 이름만 같은 메소드를 여러개를 구현하는 것을 말한다.
    • 자바스크립트의 경우, 제일 아래에 선언된 함수가 위의 함수를 덮어씌우기 때문에 자바스크립트에서는 없는 개념이다.

*Poly(many)morphism(형태) -> 다양한 형태....!


참고자료 | 나무위키 - OOP
참고자료 | 기본기를 쌓는 정아마추어 코딩블로그
참고자료 | snaag.log - OOP

profile
함께 일하고 싶은 개발자를 목표로 매일을 노력하고, 옷을 좋아하는 권기현 입니다.

0개의 댓글