⚡객체지향프로그래밍(Object-Oriented Programming)
객체지향프로그래밍이란 개념 자체가 추상적이다보니 다들 객체지향프로그래밍이 뭐냐고 물어보면
저마다의 답변이 나오는 것 같습니다.
저는 다들 객체지향이라는 개념에서 가장 중요하게 생각하는 개념이 각각이어서
저마다의 답변이 나온다고 생각해요
잘 만든 만화들은 캐릭터 인기투표하면 항상 주인공이 1등하는게 아니라
골고루 표가 나오면서 엄청 적은 표차이로 순위가 오가듯이
그만큼 객체지향의 매력밸런스가 황금이라는 것 아닐까요?
틀린 비유라면 ㅈㅅ
그런데 어차피 다들 자기만의 답을 갖고 있는거라면 저도 나만의 답을 가져도 되지 않을까요?
라는 생각도 드네요
하지만 공통된 답변들은 수집할 수 있었으며 모던 자바스크립트 딥다이브의 내용을 참고해보자면
객체 지향 프로그래밍은 실세계에 존재하고 인지하고 있는 객체(object)를 소프트웨어의 세계에서 표현하기 위해
객체의 핵심적인 개념 또는 기능만을 추출하는 추상화(abstraction)을 통해 모델링하려는 프로그래밍 패러다임
우리가 주변의 실세계에서 사물을 인지하는 방식을 프로그래밍에 접목하려는 사상
관계성 있는 객체들의 집합이라는 관점으로 접근하는 소프트웨어 디자인
각 객체는 메시지를 받을 수 있고, 데이터 처리도 가능하고, 다른 객체에게 메시지 전달도 가능합니다.
객체지향 프로그래밍은 유연하고 유지보수하기 쉬우며 확장성 측면에서 유리하다.
라고합니다.
위키 백과에 따르면
컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위 "객체" 들의 모임으로 파악하고자 하는 것
각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.
킹무위키에 따르면
명령형 프로그래밍의 일종으로 프로그램 설계 방법론
프로그램을 단순히 데이터와 처리방법으로 나누는 것이 아니라 프로그램을 수많은 객체라는 기본 단위로 나누고
이들의 상호작용으로 서술하는 방식
객체란 하나의 역할을 수행하는 메소드와 변수의 묶음으로 본다.
작은 문제들을 해결할 수 있는 객체들을 만든 뒤 이 객체들을 조합해서 큰 문제를 해결하는
상향식(bottom-up) 해결법
객체지향프로그래밍은 자바같은 클래스기반언어로 많이 구현되지만 자바스크립트 같은 경우엔
프로토타입 기반 객체지향언어입니다.
근데 왜 이런 객체지향 프로그래밍을 하는거고 또 요새는 객체지향은 한물 갔고
함수형프로그래밍이 대세라는 말이 나오는걸까요?
객체지향 이전에는 어떻게 프로그래밍을 했을까요..?
맥거핀이니까 알아서 찾아보세요
🔍S O L I D 원칙
두문자 | 약어 | 개념 |
S | SRP | 단일 책임 원칙(Single Responsibility principle) 모든 클래스는 하나의 책임만 가지며 그 책임을 완전히 캡슐화 해야한다 |
O | OCP | 개방 폐쇄 원칙(Open/closed principle) 시스템의 구조를 올바르게 리팩토링하여 소프트웨어 개체는 확장은 열려있고 수정에 대해서는 닫혀 있어야한다는 원칙 객체지향프로그래밍의 핵심 원칙이라고 할 수 있음 |
L | LSP | 리스코프 치환 원칙(Liskov Substitution principle) 자료형 S가 자료형 T의 서브타입이라면 속성 변경 없이 자료형 T의 객체를 자료형 S의 객체로 치환할 수 있어야한다는 원칙 |
I | ISP | 인터페이스 분리 원칙 (interface segregation principle) 클라이언트가 자신이 이용하지 않는 메서드에 의존하지 않아야한다는 원칙 |
D | DIP | 의존관계 역전 원칙(Dependency inversion principle) 상위 계층이 하위 계층에 의존하는 의존관계를 역전시킴으로써 상위 계층이 하위 계층의 구현으로부터 독립되게 하는 것 즉 상위 모델은 하위모듈에 의존하면 안됨 |
SOLID 원칙은 객체지향설계의 정수라고 할 수 있는 원칙입니다.
하나하나 파고들면 저 원칙 하나하나가 방대하고 심오한 내용을 가지고 있지만..
객체지향? 그거 그냥 붕어빵틀이라고 생각하면 됨이라는 말만 보다가
여기까지 보는 것도 어지러우니까 겉핥기만 해보고 하나씩 파고드는게 나을 것 같읍니다.
저 원칙을 다 지킬 수 있다면 좋겠지만
이론과 현실은 다른 법인걸까요? 저걸 완벽히 다 지킬 수 없는 경우 혹은
한 원칙을 잘 지키기 위한 설계를 한 결과 다른 원칙이 위배되어버리는 모순이 발생한다는
선지자들의 경험을 쉽게 찾아볼 수 있었습니다.
예컨대 객체의 자율성을 높이다 보면 또 다른 객체에서 의존이 발생한다.와 같은 상황
그런 모순을 견뎌내는것이 객체지향 프로그래밍이다
는 아니고 두 가치가 상충관계에 놓여있다면 적정 선을 잘 타는것이 최선이겠지요...
⚡객체지향 언어의 4가지 주요 특성
캡슐화(Encapsulation)는 뭔가요?
캡슐화는 관련있는 멤버 변수와 메소드를 클래스와 같은 하나의 틀 안에 담고
외부에 공개될 필요가 없는 정보는 숨기는 것을 말하며 다른 말로 정보 은닉 이라고한다.
캡슐화를 통해서 객체가 외부에 노출하면 안되는 정보 또는 기능을 접근제어자를 통하여
적절히 제어 권한이 있는 객체에서만 접근하도록 할 수 있어 보안적인 측면에서 강점을 가질 수 있다.
또한 코드의 재활용이 용이해질 수 있다.
JAVA의 경우에는 public과 private 키워드로 정보은닉을 하지만
자바스크립트는 public, private 등의 키워드가 없습니다.
하지만 자바스크립트는 클로저와 스코프개념을 이용해서 정보 은닉을 구현할 수 있습니다.
상속은 뭔가요?
상속은 파생 클래스가 기초 클래스의 기능을 받아 쓰는 것이라고 할 수 있다.
파생 클래스는 기초 클래스의 기능을 받았으므로 기초 클래스의 기능도 쓸 수 있게 된다.
상속은 새롭게 정의할 클래스가 기존에 있는 클래스와 매우 유사할 때 코드 재사용 관점에서 매우 유용하다.
만약 위와 같은 경우 상속을 통해 두 클래스 간의 다른 점만 구현하면 된다.
하지만 정보은닉의 파괴, 유연성 부족, 결합도의 증가 등의 문제점을 안고 있다.
즉 상속을 이용하면 캡슐화가 위반되어버리는 모순에 빠져버리고
부모 클래스와 자식 클래스가 강하게 결합되기 때문에 부모클래스를 변경하면 자식 클래스도 변경될 확률이 커진다.
한번에 둘 이상의 클래스를 파생 받는 다중상속은 권장 되지 않는 방법이다.
why ? 다중상속을 받으면 동시에 둘 이상의 상속을 받은 자식 클래스는 어느 부모의 메소드를 따라야 하는지 명확히 정해지지 않는 문제점이 생긴다.
다형성은 뭔가요?
다형성(polymorphism) 이란 하나의 객체가 여러가지 타입을 가질 수 있는 것을 의미합니다.
다형성을 구현하는 방법에는 여러가지가 있을 수 있지만 오버로딩, 오버라이딩, 함수형 인터페이스 등의 방법으로 구현할 수 있습니다.
오버로딩은 한 클래스 내에 이미 사용하는 이름의 메소드가 있더라도 특정 규칙을 지킨다면 동일한 이름의 메소드를 정의하도록 허용하는 기술을 말합니다.
오버라이딩은 상위 클래스의 메소드를 재정의 하는 것을 의미합니다. 클래스 상속, 인터페이스 상속 등을 통해 구현할 수 있습니다.
하나의 객체가 여러가지 타입을 가질 수 있는 것
쉽게 예로 생각을 하면 move에 대해서
사람은 걷다. 비행기는 날다. 자동차는 주행한다. 등으로 move라는 개념은 같지만
여러가지로 적용시킬 수 있는 것을 다형성이라고 한다는 설명이 제일 와닿은 것 같습니다.
추상화는 뭔가요?
어떤 종류의 대상들에 대해 그것이 가져야 할 핵심적인 특징들을 가지는 모델
복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것
공통의 속성이나 기능을 묶어 이름을 붙이는 것으로 객체 지향적 관점에서 클래스를 정의하는 것
과정 추상화 : 자세한 수행 과정은 정의 x 전반적인 흐름만 파악할 수 있게 설계하는 방법
데이터 추상화 : 데이터의 세부적인 속성이나 용도를 정의하지 않고 데이터 구조를 대표할 수 있는 표현으로 대체
제어 추상화 : 이벤트 발생의 정확한 절차나 방법을 정의하지 않고 대표할 수 있는 표현으로 대체하는 방법
🔍장단점
장점
😊코드의 재사용성이 높아진다.
잘 설계한 객체 지향은 다형성과 상속, 캡슐화 등을 통해 재사용성이 높다.
😊유지보수가 용이해진다.
기능 확장의 여지를 열어둘 수 있어 유지보수 측면에서 유리하다.
😊대형프로젝트에 적합하다.
클래스 단위로 모듈화 시켜 개발할 수 있으므로 분담이 쉽다.
단점
🙄 초기 설계에 많은 노력이 필요하다.
처음부터 완벽하게 추상화하고 설계하는게 쉽지않다.
🙄 절차지향에 비해 느리고 용량이 많이 든다.
객체 지향은 모든 것을 객체로 생각하기 때문에 추가적인 포인터 크기의 메모리와 연산에 대한 비용이 들어감
🙄 소규모 프로젝트의 경우 절차지향이 더 효율적일 수 있다.
얼마 안되는 내용을 추상화하고 객체별로 나눌 경우 오히려 더 복잡해질 수 있음
🔍나의 결론
단순히 한마디로 요약할만큼 얕은 내용이 아니라는 걸 느꼈습니다.
그럼에도 불구하고 만약 지금의 나에게 객체지향 프로그래밍이 무엇인지 설명해보라는 질문을 한다면
옳은 답변인지는 모르겠지만 짧게 대답해야한다면 이렇게 답할 것 같습니다.
객체지향프로그래밍 (OOP) 이란 코드의 재사용성을 높이고 유지보수를 용이하게 해주기 위한 패러다임입니다.
이 대전제를 실현시키기 위해 객체지향은 캡슐화, 다형성, 추상화, 상속 등의 특징과 SOLID 원칙과 같은 규칙을 지닙니다.
참고자료
https://yozm.wishket.com/magazine/detail/1396/
https://poiemaweb.com/js-object-oriented-programming
https://tecoble.techcourse.co.kr/post/2020-10-27-polymorphism/
https://jeong-pro.tistory.com/95
https://ko.wikipedia.org/wiki/%EA%B0%9C%EB%B0%A9-%ED%8F%90%EC%87%84_%EC%9B%90%EC%B9%99
https://devkingdom.tistory.com/95
'CS' 카테고리의 다른 글
웹 표준을 케이크처럼 어렵게 먹는 법 (1) | 2023.04.28 |
---|---|
비트와 바이트 (bit, byte) (0) | 2022.12.20 |