객체지향 프로그래밍

효딩딩·2023년 6월 19일
0

OOP 반대

IPP(Imperative and Procedural Programming)

  • 명령어와 절차적인 프로그래밍
  • 하나의 어플리케이션을 만든다면 어플리케이션을 동작하기 위한 데이터와 함수들 위주로 구성하는것을 말한다.
  • 정의된 순서대로 절차적으로 함수가 하나씩 호출되는 것을 절차지향적 프로그래밍이라고 한다.

단점

  • 하나를 수정하려면 전체적으로 어플리케이션이 어떻게 동작하는지 이해가 필요하다.
  • 하나를 수정했을 때 다른 사이드임팩트가 발생할 확률이 높다.
  • 한눈에 어플리케이션을 이해하기 어렵다
  • 유지보수가 힘들다.
  • 확장하기 힘들다.

객체지향 프로그래밍

  • OOP(Object Oriented Programming)
  • 프로그래밍 패러다임이다.

* 패러다임: 프로그래밍을 하는 여러가지 스타일 중 하나인데 OOP는 객체들을 컨셉으로 프로그래밍을 해나가는 방식이다.

  • 프로그램을 객체로 정의해서 객체들끼리 서로 의사소통 하도록 디자인하고 코딩하는것을 말한다.
  • 서로 관련있는 데이터와 함수를 여러가지 오브젝트로 정의해서 프로그래밍하는것을 말한다.

장점

  • object 단위로 만들어 나가기 때문에 한곳에서 문제가 생긴다면 관련있는 오브젝트만 이해하고 수정하면된다.
  • 여러번 반복되는것이 있다면 관련된 오브젝트를 재사용할 수 있다.
  • 새로운 기능이 필요하면 오브젝트를 만들면 되니 확장성도 용이하다.

잘 정의된 객체지향 프로그래밍은
1. 생산성(Productivity)을 높여준다.
2. 더 높은 퀄리티(Higher-quality)의 프로그래밍을 만들 수 있도록 도와준다
3. 더 빠르게(Faster)구현하고 새로운 기능을 추구하고 문제를 해결하고 유지보수가 가능하게 도와준다.

object

  • 관련된 데이터나 코드들을 함께 묶을 수 있는것을 말한다.
  • 데이터(data)와 코드를 수행할 수 있는 함수(function)로 구성되있다.
예)
MediaPlayer object : music(data), play(function), stop(function)
  • 하나의 객체로 명사를 이용해서 이름을 지정할 수 있다.
  • error, exception, event 이런것들도 object로 만들고 관리할 수 있다.
  • object 안에 들어있는 data 들을 fields 나 property 라고 부르고 function 은 methods 라고 부른다. 그리고 이것을 class 로 정의할 수 있다.
  • object 는 class의 인스턴스다.
  • class 에 데이터를 넣어서 만드는 것이 object이다.

class

  • 데이터가 들어있지 않은 그냥 템플릿 같은 것이다.
  • class를 이용하면 다른 데이터를 넣어서 object 를 많이 생성할 수 있다.
  • 관련된 속성과 함수를 묶어서 어떤 모양의 데이터가 될거라는것을 정의하는 것이다.

Class level 과 Instance(object) level

Instance(object) level

  • class를 이용해서 실제로 데이터를 넣어서 object를 만들 수 있는데
    object 마다 새로 만들어져야되는 데이터가 있다면 instance(object) level 로 멤버 변수로 만들면 된다.
  • static를 안붙이면 class level에 있는 함수를 이용할 수 없고 만들어진 object 안에서 함수를 호출할 수 있다.

class level (앞에static 붙여주기)

  • static 키워드는 멤버 변수 뿐 아니라 함수에서도 적용이 가능하다.
  • class에서 정해진 것으로 변하지 않고 class를 이용해서 만드는 object 마다 데이터가가 들어있다. object를 만들때 마다 중복적으로 데이터가 생성되서 메모리에 낭비된다. 그래서 이것을 사용하지 않을 경우 class level로 변경해주면된다.

: class level 로 변경해주면 class로 연결이 되어 있기 때문에 object 마다 만들어지거나 생성되지 않는다. 사용 시 this. 안에 있는것이 아니라 class 자체에 있기 때문에 class의 이름. 을 하면되고 앞에 static을 붙여준다.

예1)
Math 안에있는것은 다 class level 안에 있는것이기 때문에 object를 생성하지 않고도 함수를 호출할 수 있다. 
Math.abc / Math.cell 등등

예2)
constructor 호출하지 않고 새로운 커피기계를 만들때
static makeMachine(coffeeBeans: number): CoffeeMaker {
      return new CoffeeMaker(coffeeBeans);
      }

- 함수들은 class 내부에 있는 어떤 값도 필요하지 않기 때문에 static을 붙여준다. 
- makeMachine() 통해 얼마나 많은 coffeeBean를 추가할것인지 초기값을 받아올수 있고 이 함수는 CoffeeMaker 를 만들어서 return 하는 함수이다.
- 외부에서도 class를 만들지 않고 CoffeeMaker class를 이용해서 간단하게 makeMachine을 만들 수 있다. 

객체지향 프로그래밍을 결정하는 중요한 4가지 원칙

1. Encapsulation(캡슐화)

  • class를 만들때 외부에서 맘대로 사용하지못하도록 데이터를 보호하는 역할
  • 연관 있는 것들을 캡슐화하는것으로 data(데이터), function(데이터를 활용하는 함수)를 캡슐 또는 컨테이너 안에 두는 것을 의미한다.
  • 캡슐은 class를 의미한다.
  • 어떤 데이터는 외부에서 볼 수 있고 볼 수 없는지 생각하고 만드는것이다.
예) 강아지의 상태들은 외부에서 설정하거나 변경할 수 없다. 내부에 있는 상태이기 때문이다. 그러나 play, food 라는 외부 function 을 통해 강아지의 내부 상태를 변경 시킬 수 있다.
  • 내부에 상태를 private하게 숨겨놓고 외부에서는 public 함수를 이용해서 내부에 상태를 변경할 수 있도록 만들어준다 전달받는 인자가 유효한지 유요하지 않은지 검사함으로써 좀더 안정성을 높여서 코딩을 할 수 있다.

  • static 이라는 키워드를 붙여서 무언가 오브잭트를 만들수 있는 함수를 제공한다면 누군가가 생성자를 이용해서 생성하는것을 금지하기 위해 쓴다. 이럴 경우 constructor를 private하게 만들어서 항상 static 메소드를 이용할 수 있도록 권장하는것이 좋다.

  • public(default), private, protected 다양한 레벨에 정보를 은닉 할 수 있다.

  • 캡슐화를 만들때 외부에서 접근할수 있는것이 무엇인지 내부적으로만 가지고 있어야되는 데이터는 무엇인지 이런것들을 결정할 수 있다.

  • 외부에 노출해도 되는것이 무엇인지 잘생각해서 class를 디자인해야함.

public : 기본적으로 외부에서 다 볼 수 있게 공개적으로 설정이 되어있다.
private : 외부에서 절대 볼 수 없고 접근할 수 없는 상태로 만든다.
protected : 나중에 상속을 할 때 외부에서 접근할 수 없지만 class를 상속한 자식 class에서만 접근이 가능하도록 설정할 수 있다.

2. Abstraction(추상화)

  • class를 간편하게 쓰기위해서 어떻게 꾸며야하는지, 공통점을 찾고 불필요한 세부사항은 제거해서 class 를 간단하게 만드는 단계이다.
  • 구현 세부 정보를 숨기는 일반 인터페이스를 지정하는 행위이다
  • 내부에 복잡한 기능을 다 이해 하지 않고 외부에서 간단한 인터페이스를 통해 쓸 수 있는것을 말한다.
  • 추상화를 통해 내부에서는 어떻게 동작하는지 신경쓰지 않고 외부에서만 보이는 인터페이스 함수를 이용해서 object를 사용하는것이다.
예) 커피머신이 어떻게 동작하는지 내부구조를 몰라도 기계에서 제공하는 버튼만 누르면 커피를 만들 수 있다.

3. Inheritance(상속)

  • 상속을 이용해서 class를 재사용해서 사용할 수 있다.
  • 상속의 관계는
    parent class - child class /
    super class - sub class /
    base class - derived class
  • IS-A 관계라고도 말한다
  • 상속을 받은 자식 class 는 부모 class라고도 말할 수 있다

4. Polymorphism(다형성)

  • 다양한 형태(다형성)을 말한다.
  • 상속에서 부모 class 의 속성이 자식 class에 상속되는 것을 기억해야한다.
예) <animel> makeSound() 함수를 통해 
강아지, 고양이, 토끼 등 어떤 동물인지 상관하지 않고 공통적으로 makeSound() 함수를 호출 할 수 있다.

Getter 와 Setter
fullName 이 설정된 뒤로 firstName 과 lastName 이 변경되어도 다시 fullName이 계산되지 않고 한번 할당되면 계속 이렇게 지정되있기 때문이다.이럴경우 getter 가 유용하게 사용된다.

profile
어제보다 나은 나의 코딩지식

0개의 댓글