객체 지향 언어, 객체 지향언어...! 내가 개발 공부를 시작하면서 가장 많이 들은 단어 중 하나인 것 같다. 상속...캡슐화...등등 확실히 많이 듣다보니 익숙해지고 그 개념에 대해서 조금씩 이해가 되고 있지만 정확하게 정리하면 좋을 거 같아서, 객체지향언어라는 개념 자체에 대해 정리해보려한다. (이후 각 언어 별 class 사용에 대해서 세부적으로 정리하려 한다.)
이 개념을 정리하게 된 가장 큰 이유는 파이썬과 자바스크립트 둘 다 class로 객체지향을 기반으로 하는데 무슨 차이가 있을까? 부터에서 시작한 것이다. 요즘 핫한 타입 스크립트가 객체지향언어라는 것에 대해 이전의 자바스크립트와는 무슨 차이가 있을까 공부했고 한 번 정리해두면 좋을 거 같다고 생각했다.
객체 지향 언어가 무엇인지에 대해 정리하고, 그 다음에 위에서 내가 궁금해서 공부했던 부분들을 추가적으로 정리하려 한다!
객체지향이란?
OOP(Object Oriented Programming) 이라고 한다. 이는 기본적으로 프로그래밍 하는 방식 중 하나이다. 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.
객체제향에 대해 설명할 때, 많이들 프로그래밍 방식을 사물에 대입하여 진행하는 것이라고 하기도 한다. 그리고 이에 대해 가장 많이 볼 수 있는 예시가 붕어빵 틀이다. 이 두개의 설명과 예시를 통해 추측하고 이미 코드에 대한 경험이 조금 있어서 익숙한 사람들의 경우에는, 대략적으로 개념이 와닿을 수도 있다.
코드들을 쭉 나열하기 보다는, 그 코드들의 전체적인 설계도(class) 내에 공통된 데이터(property)나, 행위(method)를 묶어서 정의를 해놓고, 그때그때 필요에 의해 이 설계도를 가져다가 사용하는 것
나의 경우는 위와 같이 객체 지향을 이해했다. 실질적으로 "객체"와 "객체지향"에 대해 깊이 파악하고 이해하는 것은 어렵다.
객체 지향에 대해 이해할 때 "전체적인 틀/설계도"로 프로그래밍 코드를 정의하여, 이를 마치 하나의 사물이나 도구처럼 가져다 쓰는 것으로 이해하면 될 것이다.
대표적으로 java, python 등이 있다.
객체지향의 특징
1. Class + Instance
클래스 : 집단에 속하는 속성(attribute)과 행위(behavior)를 변수와 메서드로 정의한 것. 즉 위에서 설명한 설계도/틀인 것.
인스턴스(객체) : 클래스에서 정의한 것을 토대로 실제 메모리상에 할당된 것으로 실제 프로그램에서 사용되는 데이터
2. 캡슐화 (Encapsulation)
말 그대로, 프래그래밍 코드들을 하나의 캡슐처럼 묶음으로 정리된 것이다. 캡슐화로 인해 관련된 기능과 특성을 한 곳에 모으고 분류함으로써 코드의 재활용이 용이해졌다. 기능과 특성의 모음을 "class"라는 "캡슐"에 넣은 것이다.
3. 상속 (Inheritance)
객체지향 방법의 큰 장점 중 하나로, 캡슐로 정의한 하나의 객체를 다른 곳에서 이어 받아서 즉 가져다가 새로운 기능을 추가하여 새로운 객체를 만들 수 있는 것이다. 부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게하고 기능의 일부분을 변경해야 할 경우 상속받은 자식클래스에서 해당 기능만 다시 수정(정의)하여 사용할 수 있다.
* 절자 지향 프로그래밍에서도 "라이브러리"를 통해서 남이 짜놓은 소스 코드를 가져와 사용할 수 있었다.
하지만 내 의도에 맞게 수정하게되면 다른 라이브러리가 되어 버전에 따라 동작하지 않을 수 있고 불필요한 코드의 수정작업을 해야한다는 것이다.
4. 다형성(Polymorphism)
하나의 클래스에서 상속된 자식클래스들이 서로 다른 특징을 지닐 수 있다는 의미이다. 즉 하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것이다. 즉 오버라이딩(Overriding), 오버로딩(Overloading)이 가능하다는 얘기다.
오버라이딩 : 부모클래스의 메서드와 같은 이름, 매개변수를 재정의 하는것.
오버로딩 : 같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것.
5. 추상화(Abstraction)
불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 공통의 속성이나 기능을 묶어 이름을 붙이는 것이다.
물고기, 사자, 토끼, 뱀이 있을 때 우리는 이것들을 각각의 객체라 하며 이 객체들을 하나로 묶으려 할 때, 만약 동물 또는 생물이라는 어떤 추상적인 객체로 크게 정의한다고 하자. 이때 동물 또는 생물이라고 묶는 것을 추상화라고 한다. 추상화는 다른 객체들과 구분되는 핵심적인 특징들에만 집중함으로써, 복잡도를 관리할 수 있도록 한다. 주의할 점은 추상화는 문제 영역과 관점에 의존적이라는 것이다. 그래서 어떤 영역에서 중요한 것이 다른 영역에서는 그렇지 않을 수도 있다.
6. 은닉화(Hiding)
객체지향 언어를 보면, private, public, getter, setter을 본 적이 있을 것이다. 이 것이 객체 지향의 은닉화와 관련되있다고 볼 수 있다. 외부에서 조작하지 않았으면 하는 class의 내부 구조는 private로 숨겨두고, 외부에서 조작가능한 부분은 public으로 정의할 수 있다. private로 정의한 속성의 경우, 자료로의 접근을 제한하고 데이터를 수정,조작하는 동작은 내부에 두고 접근(getter),설정(setter)하는 메소드로 결과만 받는것이다. 이렇게 되면 외부에서는 내부적인 움직임을 알수가 없으며 데이터에 어떤값이 있는지 또는 어떤 변화가 일어나는지 알수없다. 단지 데이터의 접근을 메서드(setter , getter)를 통해 결과만 받을뿐이다.
객체지향의 장.단점
장점
1. 코드 재사용이 용이 : 남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 확장해서 사용할 수 있음.
2. 유지보수가 쉬움 : 절차 지향 프로그래밍에서는 코드를 수정해야할 때 일일이 찾아 수정해야하는 반면 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수혹은 메서드로 있기 때문에 해당 부분만 수정하면 됨.
3. 대형 프로젝트에 적합 : 클래스단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트처럼 여러명, 여러회사에서 개발이 필요할 시 업무 분담하기 쉽다.
단점
1. 처리속도가 상대적으로 느림
2. 객체가 많으면 용량이 커질 수 있음
3. 설계시 많은 시간과 노력이 필요
실제로 객체 지향언어도 두 갈래로 나뉘어서 정의할 수 있다. class 기반 객체 지향 언어와 프로토타입언어이다. 이에 대해서는 추가적으로 정리해보려 한다.
절차지향이란?
객체 지향에 대해서 설명할 때 가끔 언급되는 절차지향은 무엇일까? 객체 지향 처럼 절차지향 또한 프로그래밍 방식 중 하나이다. 객체 지향과는 달리 마치 물이 위에서 아래로 흐르는 것과 같이 순차적인 처리로 코드를 짜는 방식이다. 실제로 절차 지향언어는 컴퓨터의 작업처리 방식과 유사하기 때문에 객체 지향언어를 사용하는 것보다 훨씬 더 빨리 처리된다.
대표적으로 C언어가 절차지향언어이다.
절차지향의 장.단점
장점
위에서도 이미 언급한 바와 같이 컴퓨터의 처리구조와 유사해 실행속도가 빠르다.
단점
1. 유지보수가 어렵다.
2. 실행 순서가 정해져 있으므로 코드순서가 바뀌면 결과가 다르게 나올 가능성이 있다.
3. 디버깅이 어렵다.
마무리
자칫 절차지향과 객체지향을 서로 반대되는 개념으로 이해하기 쉽다. 하지만 둘은 반대되는 개념은 아니다. 단지 프로그래밍 방식들 인 것이다. 절차지향은 데이터 중심이며 객체 지향은 기능중심적인 프로그래밍 방식이라고 기억하면 될 듯하다.
Reference
'SW Engineering > Dev' 카테고리의 다른 글
Web Browser Security_CORS/XSS/CSRF (0) | 2021.02.14 |
---|---|
객체지향언어(OOP)_Class 기반/프로토타입 기반 (0) | 2021.02.06 |
Web Architecture 개념 이해하기 (1) | 2021.01.26 |
Web Server vs WAS 이해하기 (0) | 2021.01.25 |
What is HTTPS? (0) | 2021.01.17 |