개발을 배우기 시작하면서 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();
출처 하단 youtube 링크
- 첫번째 절차지향적 프로그래밍에서는 사원 한명에 대한 월급을 계산 하고 필요한 정보를 각각 입력해서 월급을 구한다.
- 하지만 두번째 객체지향적 프로그래밍에서는 employee라는 객체를 만들어 캡슐화 하고, 이 객체 안에 baseSal, ovetime, rate 라는 속성을 정의한 뒤 월급을 구하는 함수를 만든다. 그래서 employee.getWage()를 할때 속성 없이 바로 월급을 구할 수 있다.
3. 상속성(Inheritance)
- 상위 클래스의 속성과 기능을 그대로 이어받아 사용 할수 있게 하고, 기능의 일부분을 변경해야 할 경우 상속받은 하위클래스에서 해당 기능만 다시 수정하여 사용할 수 있게 하는 것이다.
- 상속이 필요한 이유는 복잡도를 줄여주고, 코드의 종복을 없애기 위함이다.
4. 추상화(Abstraction)
- 목적과 관련이 없는 부분을 제거하여 필요한 부분만을 표현하기 위한 것을 의미한다.
- 객체는 실제 그 대상이지만, 클래스는 객체들이 어떤 특징이 있어야 한다고 정의하는
추상화된 개념이다.
5. 다형성(Polymorphism)
- 앞서 상속에서 하위 클래스는 상위클래스의 속성과 기능을 물려받고, 하위클래스에서 수정 할 수 있다고 했다.
다형성은 같은 이름을 가진 메소드라도 각 하위클래스의 상황에 맞게 다르게 구현될 수 있게 하는 것을 말한다.
- 즉 하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것이다. 형태가 같은데 다른 기능을 한다. 이를 통해 코드의 재사용, 코드의 길이가 감소되어 유지보수가 용이하다.
즉, 오버라이딩(Overriding), 오버로딩(overloading)이 가능하다는 의미이다.
오버라이딩(overriding)
- 상위클래스의 매서드와 같은 이름, 매개변수를 재정의 하는것이다. 상위클래스에서 만들어진 메서드는 입맛대로 다시 재창조해서 사용하는 것을 말한다.
오버로딩(overloading)
- 같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게하는 것이다.
- 메서드끼리 이름은 같지만 매개변수의 갯수나 데이터타입이 다르면 오버로딩이 적용되어 메서드 이름이 같아도 문법 에러가 나지 않는다.
객체지향의 장단점
장점
- 코드의 재사용성이 용이하다.
- 상속을 통해 프로그래밍 시 코드의 재사용을 높일 수 있다
- 코딩이 간단하고, 유지보수가 쉽다.
- 대형 프로젝트에 적합하다.
- 클래스 단위로 모듈화 시켜서 개발 할 수 있다.
단점
- 처리속도가 대체적으로 느리다.
- 설계 단계부터 많은 시간과 노력이 소모된다.
- 객체가 많으면 용량이 커질 수 있다.
마치며..
- 이처럼 객체와 클래스를 이용해서
객체지향프로그래밍의 특징을 살펴보았다. 하지만.. 내가 사용하는 javascript에는 다른 언어에 있는 class라는 개념이 없다. ES6에서 class라는 문법이 새로 추가되었지만 prototype으로 그 기능을 구현하였다.
- 그렇다면
prototype은 무엇을까... 이 부분은 다음에 정리해 보겠다.
참고