본문 바로가기
📍 DEV/JS & TS

[14JAN, 2021] OOP1)What is Object-oriented Programming?!

by briee 2021. 1. 15.

객체 지향??!!

나처럼 프로그래밍을 처음 접한 사람들에게는 이 객체지향이라는 말이 생소하게 느껴질 것이다. 우리의 일상생활에서 쓰이지 않는 말이기 때문이다. 나는 프로그래밍을 접하기 전, 이 단어를 딱 들었을 때 '객체가 뭐길래 지향한다?? 지향이면 그래도 선호한다는 건데..?'이라는 생각을 했다. 그래서 이 객체 지향을 이해하는 데에는 우선 객체가 무엇인지 이해를 해야 객체지향도 이해할 수 있다고 생각한다. 

객체(Object):

객체는 ''Thing', '어떤 것'으로 생각하면 조금 더 이해하기 쉽다. 그래서 객체는 사람이 될 수 있고, 자동차가 될 수도 있으며 컴퓨터, 책 등등 무엇이든 될 수도 있다.

클래스(Class):

그럼 자동차로 예를 들어보자. 자동차는 사람들이 이동할 때 타는 운송수단이다. 그런데 자동차마다 가지는  기능, 색깔, 브랜드 등 특징들이 다 다르다. 이를 그림으로 표현해보면 이렇게 나타낼 수 있다. 

 

여기서 자동차들이 각각 아래와 같은 특징을 가지고 있으면

* RedCar는 색상: Red, 브랜드: Jeep, 모델명: A111, 최고속도: 120을 가지고,
* GreenCar는 색상: Green, 브랜드: Volvo, 모델명: B222, 최고속도: 125을 가지며,
* YellowCar는 색상: Yellow, 브랜드: Benz, 모델명: C333, 최고속도: 130을 가진다고 하자.

 

각각의 특징들을  가진 RedCar, GreenCar, YellowCar라는 객체를 만들 수 있다. 그럼 이들은 자동차라는 공통된 개념이 있고, 구체적인 값은 다르지만 색상, 브랜드 등 분류할 수 있는 공통점이 있다. 이렇게 공통적인 개념(= 자동차)이 클래스라고 한다. 이 자동차라는 클래스에 공통으로 갖는 특징들을 적어주고 (=클래스 변수) 각각의 객체(= RedCar, GreenCar, YellowCar)를 만들어 구체적인 값들을 넣어주는 것이다.  더 나아가서, 자동차는 저렇게 특징도 가지고 있지만, 달리고, 멈추는 동작을 한다. 이러한 동작을 컴퓨터 세계에서는 함수로 표현한다. 

 

즉 객체지향 프로그래밍이란,

객체지향 프로그래밍(OOP)은 사람이 세계를 보고 이해하는 방법을 흉내 한 방법론이라고 한다. 우리가 자동차라는 것을 운전을 하며 타고 다니는 것 (객체를 생성하고, 객체의 동작을 나타내는 것)처럼 우리가 일상생활에서 어떠한 것들을 사용하고, 이를 이용해서 동작하는 것을 컴퓨터의 세계에서 표현한 것이라고 이해할 수 있다.

 


객체지향 프로그래밍의 4가지 특징:

1. Encapsulation (캡슐화):

 

객체에서 공통적으로 가진 속성, 함수(메소드)를 캡슐처럼 클래스에 담는 것을 캡슐화이다. 

출처: youtu.be/PFmuCDHHpwk

이렇게 model, make, color라는 속성(properry)과 start(), stop(), move()라는 메소드(method)를 정의해 놓으면 그래서 이 코드를 보면 함수를 위에서 정의해놓으면 객체를 정의할 때마다 같은 것을 또 정의하지 않고도 사용할 수 있다. (parameter들을 줄일 수 있다.) 또한 객체의 내부에 함수를 넣으므로 어떻게 실행되는지 외부에서 알 수없고, 직접적인 접근을 차단할 수 있다.

 

 

2. Abstraction (추상화): 

집에 커피머신이 있다고 하자. 이 커피머신을 사용할 때 우리는 버튼을 누르면 커피가 나온다는 사실을 알 수 있다, 하지만 커피머신이 내부에서 어떤 원리로 작동하는지 알 수 없다. 그리고 사실 이러한 과학적인 원리를 사용하는 데 알 필요성도 별로 없다. 이처럼 몰라도 되는 정보는 감추고 사용에 필요한 정보만을 드러내는 것이 추상화이다. 프로그래밍에서의 추상화도 같다. 객체들의 공통된 속성과 동작을 묶는 것이다. (이 내용은 해석해서 작성하려 하니 이상해져서 영어로 옮겨보겠다.) We can hide some of the properties and methods from the outside. We'll make the interface of those objects simpler using an understanding an object with a few properties and methods is easier than an object with several properties and methods.

 

 

3. Inheritance (상속):

상속은 우리가 일상에서 많이 접해본 말이다. 프로그래밍에서도 자식 클래스는 부모 클래스의 속성과 동작들을 상속받는다. 객체지향에서는 클래스를 많이 선언하게 되는데, 이 클래스들 간의 관계를 보다 명확하게 표현할 수 있고, 중복된 코드들을 줄일 수 있어 상속은 매우 중요하다. (상속의 내용은 추후 수정 및 추가 예정이다)

 

 

4. Polymorphism (다형성):

'Poly = Many', 'Morphism = Form'이라는 뜻이다. 즉, 다양한 형태를 가진다는 것이다. 자식 클래스가 부모로부터 상속을 받더라도 자식 클래스는 자신이 원하는 대로 다양한 형태를 만들 수 있다. 


Benefits of OOP:

(앞의 내용과 같기에 해석하지 않겠다. 그리고 이 영어로 이해하는 게 더 잘 이해될 것이라 생각한다. 해석해서 이해하려 하면 의역이 섞이게 되는 것 같다)

*Encapsulation (캡슐화) : Reduce complexity + increase reusability
*Abstraction (추상화) : Reduce complexity + isolate impact of changes
*Inheritance (상속) : Eliminate redundant code
*Polymorphism(다형성): Refactor ugly switch /case statements

밑에 첨부한 동영상에서 OOP는 'An essential skill for every developer' 이라고 한다.

그렇기에 중요한 부분이기에 1, 2, 3(+α)으로 나누어 객체 지향을 더 자세히 알아보겠다.

 

 

 

* 참고 영상: youtu.be/PFmuCDHHpwk

(+강의 내용이 이 동영상을 해석한 것 같았다. 이 영상에서는 더 많은 그림과 코드가 적절히 섞여 있어서 보는 것을 추천한다! 이해가 쉽다!!)