1. OOP(Object Oriented Programming)
어떤 공통적인 특징을 가지고 있는 것에 각기 다른 특징을 부여해 하나의 물체를 만드는 프로그래밍이라고 할 수 있다.
예를 들어 A와 B가 함께 저녁 식사를 하려고 한다. A가 B에게 뭐 먹을 거냐고 물었다. B는 '고기'라고 말했다.
바로 여기서 이 '고기'가 공통적인 어떠한 것이다. A가 B에게 무슨 고기를 먹을 건지 구체적으로 대답해달라고 했다.
B는 '소고기'라고 답했다. 여기서 '소고기'가 고기는 고긴데 '소'라는 특징을 부여해 만들어진 물체라고 할 수 있다.
그리고 객체 지향 프로그래밍에서 공통적인 어떤 것을 'class'라고 하고 그것으로부터 추가적인 특성을 부여받은 것을 'instance'라고 한다.
따라서 위 예제에서는 '고기' -> 'class', '소고기' -> 'instance'가 될 것이다.
2. 프로퍼티와 메소드
클래스 내에서 선언된 공통적인 변수를 프로퍼티라 하고 공통적인 어떤 기능을 할 수 있는 함수를 메서드라 한다.
여기서 '공통적인'이라는 의미가 중요하다. 공통적이라는 말은 해당 특징과 기능을 모두 가지고 있다는 의미와 같다.
따라서 instance가 class의 프로퍼티와 메서드에 관한 모든 것을 갖고 있다고 봐도 무방할 것이다.
3. 객체 지향 프로그래밍의 4대 특성
객체 지향 프로그래밍 기법은 대표적인 4가지 특징이 있고 이 특징을 코드에 적용시키기 위해 프로그래밍 언어에 도입되었다고 할 수 있다.
이 특성들은 코드를 더 정돈되고 간결하게, 그리고 보다 안전하게 만들어준다.
3 - 1) 캡슐화(Encapsulation)
캡슐화란 연관된 변수들과 함수들을 하나의 '클래스'라는 캡슐로 묶어 제공함으로써, 개발자는 미리 정의된 클래스로부터 하나의 객체를 생성하기만 하면 클래스가 제공하는 모든 변수 및 메서드들을 사용할 수 있게 된다.
즉 어떤 특정 객체를 정의하기 위해서 해당 객체에 관한 변수와 메서드를 매번 만들 필요가 없단 말이다!
3 - 2) 정보 은닉(Information Hiding)
자바스크립트를 포함한 보통의 프로그래밍 언어에서는 기본적으로 외부에서 객체의 모든 변수들과 메서드들에 자유롭게 접근할 수 있는데, 이 자유로운 접근이 문제가 될 수 있다.
객체 지향 프로그래밍에서는 접근 제어 자라는
접근 제어자는 클래스의 프로퍼티 및 메서드에 대해 적용될 수 있고, 프로그래밍 언어에 따라 지원되는 접근 제어자의 종류가 다르나 가장 대표적인 두 가지는 다음과 같다.
- public: 외부에서 해당 변수 및 메서드에 접근할 수 있다. 대부분의 경우 접근 제어자가 명시되어 있지 않다면 기본값으로 public이다.
- private: 외부에서 해당 변수 및 메소드에 접근할 수 없으며 클래스 내부에서만 사용할 수 있다.
또한 보안의 관점에서 본다면 정보 은닉이라고 할 수도 있겠지만, 이러한 정보 은닉의 특성은 다른 관점에선 추상화라고 할 수 있다.
추상화(Abstraction)란 내부의 복잡한 로직을 사용자가 편하게 쓸 수 있도록 인터페이스를 구성한 것이라고 볼 수 있다.
예를 들어 내가 친구에게 전화를 건다고 생각해보자. 전화 연결이 대충 어떻게 이루어지는지는 알고 있지만 구체적으로 정확하게
어떤 로직에 의해서 서로 전화가 되는 것인지는 전문가가 아니라면 잘 알지 못한다.
하지만 우리는 단지 핸드폰에 상대방의 핸드폰 번호를 누르고 통화 버튼만 누르면 상대방과 전화를 할 수 있음을 알고 있다.
이러한 복잡한 것을 단순하게 구현하는 것이 추상화이다.
클래스의 접근 제어자를 통해서 접근할 수 있는 것이 있고 접근할 수 없는 것이 있을 텐데 바로 위 예시에서 접근할 수 있는 것은
전화번호를 입력하는 것과 통화 버튼을 누르는 것일 테고 그 외의 모든 것은 접근할 수 없는 것이 될 것이다.
3 - 3) 상속(Inheritance)
상속은 위의 두 가지 특성보다는 이해하기에 더 쉽다고 생각한다.
말 그대로 상속이란 부모 클래스에서 정의된 속성이나 메서드들을 물려받을 수 있다는 것이다.
어 그럼 인스턴스가 클래스의 자식인가요? 전혀 아니다 인스턴스는 해당 클래스의 복제품이지만 각기 다른 특성을 가지고 있는 것이고
상속 클래스는 부모 클래스의 특성을 그대로 물려받으면서 상속받은 자식만의 추가적인 특성을 가지고 있는 것이라고 할 수 있다.
사실 블로깅 하다 보니 맨 위의 고기 예제를 통해서 설명할 때 조금 헷갈리게 설명한 거 같긴 하다...
스마트폰으로 예를 들어보자.
가장 상위 class를 그냥 스마트폰이라고 하자.
그리고 자식 class로는 아이폰 계열과 갤럭시 시리즈가 있을 수 있다.
두 개의 자식 class는 스마트폰의 공통적인 프로퍼티와 메서드를 모두 사용할 수 있고 본인들만의 프로퍼티와 메서드가 추가되는 것이다.
아이폰은 애플의 제품이다, 갤럭시는 삼성의 제품이다 등이 각 자식 class만의 고유한 특성인 것이다.
또한 아이폰에는 다양한 시리즈가 있을 것이다 그러한 각 시리즈(6, 7, 8, 10, 12 등)가 아이폰 class의 고유한 자식이 될 것이다.
3 - 4) 다형성 (Polymorphism)
말 그대로 다양한 특성을 가질 수 있다는 말이다.
다형성은 상속과 관련이 있다. 부모 클래스로부터 상속된 자식 클래스는 프로퍼티와 메서드를 물려받는다고 했다.
맞는 말이다. 반대로 생각하면 물려받는 프로퍼티와 메서드는 절대로 수정할 수 없는 것인가?라고 생각할 수 있는데 결론은 아니다.
예를 들어 빵이라는 클래스가 있다고 해보자. 그리고 빵 클래스에는 먹다는 메서드가 있다. 먹다는 메서드를 호출하면
맛있다는 문장이 출력된다고 가정한다. 그리고 빵 클래스의 자식 클래스로 딱딱한 빵과 부드러운 빵이 있다.
나는 딱딱한 빵에서 먹다는 메서드를 호출하면 이 빵은 식감은 딱딱한데 맛있다 라고 출력하고 싶고
부드러운 빵에서 먹다는 메서드를 호출하면 이 빵은 식감도 부드럽고 맛있다고 출력하고 싶다.
이럴 때 자식 클래스의 먹다는 메서드가 부모 클래스의 먹다는 메서드를 덮어 씌운다라고 해서
메소드 오버 라이딩(method overriding)이라고 한다. 덮어 씌운다는 의미를 무조건 부모 클래스의 먹다는 메서드의 출력인
'맛있다'가 있어야 된다는 것을 의미하는 게 아니다. 그냥 자식 클래스에서 똑같은 메서드를 재정의 할 수 있다고 받아들이면 된다.
재정의 한다는 것 자체가 여러 가지를 표현할 수 있다는 의미이고 이것이 곧 다형성을 의미하는 것이다.
4. 요약
4 - 1) OOP의 개념 : OOP란 어떤 공통적인 특징을 가지고 있는 것에 각기 다른 특징을 부여해 하나의 물체를 만드는 프로그래밍이다.
4 - 2) OOP의 4가지 특징
- 캡슐화: 관련된 모든 속성 및 메서드들을 하나의 클래스에 모은다.
- 정보 은닉: 외부로 공개해서는 안 되는 정보들을 접근 제어자를 통해 숨긴다.
- 상속: 자식 클래스가 부모 클래스의 모든 것을 받는다.
- 다형성: 자식 클래스에서 부모 클래스의 메서드 재정의한다.
'CodeStates' 카테고리의 다른 글
IM 4일차 (Pesudoclassical) (0) | 2021.01.15 |
---|---|
IM 4일차 (자바스크립트에서 객체의 작동 원리) (0) | 2021.01.14 |
IM 3일차 (ESLint와 rules) (0) | 2021.01.13 |
IM 2일차 (ES6 문법) (0) | 2021.01.12 |
IM 1일차 (NVM, package.json, git remote, add, commit, push, pull, merge) (0) | 2021.01.11 |