[OOP]객체지향프로그래밍

GyungHo Go·2020년 8월 8일
0
post-thumbnail
post-custom-banner

개발을 배우기 시작하면서 OOP를 접할 수 있었다. 실제로 Java, Javascript, C#, python 등 같은 다양한 언어들이 OOP를 지향하고 있다. 그렇기 때문에 기술면접에 반드시 나온다고 하니 OOP의 개념에 대해서 짚고 넘어갈 필요가 있다.

OOP(Object Oriented Programing)란?

  • 객체지향프로그래밍(OOP)은 어떠한 도구나 언어가 아니고, 객체를 기반으로 하는 프로그래밍 패러다임의 하나이다.
  • 여기서 객체란 말 그대로 대상을 나타내는 단어이다.
  • 프로그래밍에서 필요한 데이터를 추상화 시켜 상태행위를 가진 객체를 만들고, 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 방법이다.
  • OOP에서는 모든게 객체로 구성되어 있다. 서로 관계가 있는 속성과 기능들을 묶어 놓은 것을 class라고 부르고 각 속성과 기능을 정의해서 우리가 실제 사용하는 객제(Object)를 만든다.
  • 코드의 재사용성과 중복제거가 가장 큰 목적이다.

OOP의 5가지 키워드

객체지향프로그래밍(OOP)의 바탕이 되는 중요한 개념들이 있다.

1. 클래스 + 인스턴스(객체)

클래스

  • 어떤 문제를 해결하기 위한 데이터를 만들기 위해 추상화를 거쳐 집단에 속하는 속성행위변수메서드로 정의하는 것을 의미한다.

인스턴스(객체)

  • 클래스에서 정의한 것을 토대로 실제 메모리상에 할당된 것으로 실제 프로그램에서 사용되는 데이터를 말한다.

2. 캡슐화(Encapsulation)

  • 하나의 객체에 대해 그 객체가 특정한 목적을 위해 필요한 변수나 메소드를 하나로 묶는 것을 의미한다. 기능과 특성을 class라는 캡슐에 분류해서 넣는 것이다.
  • 캡슐화는 복잡한 코드를 간단하게 만들어 주고, 재사용에 용이하다.
  • 그리고 캡슐화를 하면 불필요한 정보를 감출 수 있기 때문에, 정보은닉을 할 수 있다는 특징이 있다.

절차지향적

let vase = 30_000;
let over = 10;
let rate =  20;
function getWage(base, over, rate){
  return base  + (over * rate);
}

객체지향적

let employee = {
  baseSal : 30_000,
  overtime:10,
  rate:20,

  getWage: function(){
    return this.baseSal + (this.overtime * this.rate);
  }
};

employee.getWage();  //30200

출처 하단 youtube 링크

  • 첫번째 절차지향적 프로그래밍에서는 사원 한명에 대한 월급을 계산 하고 필요한 정보를 각각 입력해서 월급을 구한다.
  • 하지만 두번째 객체지향적 프로그래밍에서는 employee라는 객체를 만들어 캡슐화 하고, 이 객체 안에 baseSal, ovetime, rate 라는 속성을 정의한 뒤 월급을 구하는 함수를 만든다. 그래서 employee.getWage()를 할때 속성 없이 바로 월급을 구할 수 있다.

3. 상속성(Inheritance)

  • 상위 클래스의 속성과 기능을 그대로 이어받아 사용 할수 있게 하고, 기능의 일부분을 변경해야 할 경우 상속받은 하위클래스에서 해당 기능만 다시 수정하여 사용할 수 있게 하는 것이다.
  • 상속이 필요한 이유는 복잡도를 줄여주고, 코드의 종복을 없애기 위함이다.

4. 추상화(Abstraction)

  • 목적과 관련이 없는 부분을 제거하여 필요한 부분만을 표현하기 위한 것을 의미한다.
  • 객체는 실제 그 대상이지만, 클래스는 객체들이 어떤 특징이 있어야 한다고 정의하는 추상화된 개념이다.

5. 다형성(Polymorphism)

  • 앞서 상속에서 하위 클래스는 상위클래스의 속성과 기능을 물려받고, 하위클래스에서 수정 할 수 있다고 했다. 다형성은 같은 이름을 가진 메소드라도 각 하위클래스의 상황에 맞게 다르게 구현될 수 있게 하는 것을 말한다.
  • 즉 하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것이다. 형태가 같은데 다른 기능을 한다. 이를 통해 코드의 재사용, 코드의 길이가 감소되어 유지보수가 용이하다.

즉, 오버라이딩(Overriding), 오버로딩(overloading)이 가능하다는 의미이다.

오버라이딩(overriding)

  • 상위클래스의 매서드와 같은 이름, 매개변수를 재정의 하는것이다. 상위클래스에서 만들어진 메서드는 입맛대로 다시 재창조해서 사용하는 것을 말한다.

오버로딩(overloading)

  • 같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게하는 것이다.
  • 메서드끼리 이름은 같지만 매개변수의 갯수나 데이터타입이 다르면 오버로딩이 적용되어 메서드 이름이 같아도 문법 에러가 나지 않는다.

객체지향의 장단점

장점

  • 코드의 재사용성이 용이하다.
    - 상속을 통해 프로그래밍 시 코드의 재사용을 높일 수 있다
  • 코딩이 간단하고, 유지보수가 쉽다.
  • 대형 프로젝트에 적합하다.
    - 클래스 단위로 모듈화 시켜서 개발 할 수 있다.

단점

  • 처리속도가 대체적으로 느리다.
  • 설계 단계부터 많은 시간과 노력이 소모된다.
  • 객체가 많으면 용량이 커질 수 있다.

마치며..

  • 이처럼 객체와 클래스를 이용해서 객체지향프로그래밍의 특징을 살펴보았다. 하지만.. 내가 사용하는 javascript에는 다른 언어에 있는 class라는 개념이 없다. ES6에서 class라는 문법이 새로 추가되었지만 prototype으로 그 기능을 구현하였다.
  • 그렇다면 prototype은 무엇을까... 이 부분은 다음에 정리해 보겠다.

참고

profile
기록하는 습관
post-custom-banner

0개의 댓글