오늘은 OOP 에 대해 정리할 예정입니다. 늘 그렇듯 제 나름대로 이해한 글을 풀어서 써보려고 하구요. 정확한 정보는 언제나 공식 문서에서 찾으실 수 있다는 점을 말씀드리면서, 페어 분을 통해 배운 목차를 활용해 글을 써보도록 하겠습니다. 참고로 나무위키에도 정리가 잘 되어있습니다.
OOP (Object Oriented Programming, 이하 객체 지향 프로그래밍) 는 한국어로 객체 지향 프로그래밍이라고 하는 프로그래밍 방법론의 하나입니다. 자바스크립트가 객체 지향 언어인지에 대해서는 논쟁이 좀 있는 것 같은데요. ES6 에서 클래스를 도입하는 등 여러 문법적인 기능을 제공함에 따라(물론 없이도 가능하지만), 자바스크립트로도 얼마든지 객체 지향 프로그래밍이 가능하다 라고 이해할 수 있습니다.
객체 지향 프로그래밍에는 추상화 (Abstraction), 캡슐화 (Encapsulation), 상속 (Inheritance), 다형성 (Polymorphism) 이라고 하는 4 가지 개념 (또는 컨셉, 요소, 특성) 을 가집니다. 경우에 따라서는 추상화를 따로 떼어놓고 3 가지로 압축하기도 합니다만 이 글에서는 제가 배운대로 4 가지의 개념으로 설명하도록 하겠습니다.
추상화는 구현하고자 하는 것의 핵심을 찾고, 사용자들에게는 최대한 단순하고 쉬운 접근을 제공하고자 하는 것입니다. 스마트폰은 내부적으로 정말 복잡한 기계적 구성을 지니고 있지만, 대부분의 사용자가 이를 굳이 알 필요까지는 없죠. 이처럼 추상화를 통해 정말로 필요한 기능만을 전달할 수 있게 되는데요.
딸기 판매를 예로 들어보겠습니다. 딸기를 판매한다고 할 때 품종과 당도가 어떤지를 알려줄 수는 있지만, 딸기의 생육조건이 어떻고 생산성이 어떤지를 굳이 알려줄 필요는 없겠죠.
구현하고자 하는 것 === 딸기 판매
단순하고 쉬운 접근 === 품종: 설향, 당도: 12 brix, 가격: 10,000원
이런 식으로 추상화할 수 있다는 것입니다. 12 브릭스라고 하는 당도를 맞추기 위해 농부가 어떻게 노력했는지 까지 굳이 알 필요는 없다는 것이죠. 딸기를 판매하는데 있어서는 불필요한 정보니까요.
우리가 어떤 사물을 이렇듯 추상화해서 파악하듯이 객체 지향 프로그래밍은 구현하고자 하는 것을 추상화해서 이를 클래스로 묶어 처리합니다.
캡슐화는 변수와 메소드를 하나로 묶는 것입니다. 일반적으로 클래스로 묶게 되는데요. 어떠한 기능을 위한 데이터 및 함수가 하나로 묶여있기 때문에 유지보수에 있어서 매우 용이하다고 할 수 있습니다.
특히 캡슐화로 인해 생기는 정보 은닉 (Information Hiding) 이라는 특징이 있습니다. 외부에서 사용해야 하는 메소드를 제외한 모든 데이터로의 접근을 제한하는 것인데요. 클래스 내부에 변수가 있다고 할 때, 외부에서 이 변수에 접근하는 것을 막아 코드의 안정성을 높이는 것이라고 할 수 있습니다.
클래스 내부의 속성 (변수) 과 기능 (메소드, 함수) 은 하위 클래스로 상속이 가능합니다. 상위 클래스에서 구현한 속성과 기능을 다시 구현할 필요가 없이 사용할 수 있는 것이죠. 이는 재사용성과 확장성을 높여주게 됩니다.
상속 관계에서 헷갈리지 않아야 할 것은 is-a 관계와 has-a 관계 여부입니다. 바나나는 과일이다. 사람은 동물이다. 이런 문장이 is-a 관계라고 할 수 있다면, has-a 관계를 자동차-바퀴, 사람-팔 등을 예로 들 수 있는데요. has-a 관계도 상속은 가능하지만, 무리하게 상속하게 되는 경우 혼란이 올 수 있다고 합니다. 따라서 is-a 관계인지를 파악해 상속을 사용하는 것이 중요하다고 하네요.
다형성은 클래스 내부의 변수 또는 메소드가 상황에 따라 다르게 적용될 수 있는 것을 말합니다. 특히 하위 클래스에서 상위 클래스의 메소드를 다시 재정의하여 사용하게 될 경우, 상위 클래스의 메소드와는 다른 방식의 동작을 구현할 수 있게 되는데, 이렇게 상속을 이용해 메소드를 재정의하는 것을 overriding 이라고 합니다.
참고
https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Inheritance
https://gracefulprograming.tistory.com/130