-
[TIL] 객체 지향 언어란? (feat. 절차지향)TIL 2021. 2. 26. 10:48
어제 class 공부를 하면서 객체 지향과 절차 지향의 차이가 뭐였더라....? 생각하며 잠들었는데
오늘 객체 지향 언어를 공부하게 되다니... 무섭다 나란남자...
아무튼 객체 지향을 알기 전에 절차 지향 언어가 뭔지 알고 둘의 차이점을 적어 보려 한다.
1. 절차 지향 프로그래밍이란?
절차 지향의 사전적 의미는 프로시저 호출의 개념을 바탕으로 하고 있는 프로그래밍 패러다임을 뜻한다.
말이 어려운데 프로시저는 순서에 따라 실행되는, 즉 함수와 같이 정해진 순서대로 명령을 실행하여여 프로그램을 동작 시키게 하는 것을 뜻한다고 해석했다. 이 글에서는 프로시저란 단어를 함수로 통일하려 한다.
절차 지향 프로그래밍의 특징은 모듈화를 하거나 구조화가 가능하다.
절차 지향의 모듈화란 함수에 어떤 입력과 출력이 이뤄지는지 명확한 규칙을 정해 구현할 수 있음을 뜻한다.
이는 함수의 시작과 끝인 스코프가 있기 때문인데 스코프 안에서 선언된 변수는 다른 함수에서 접근을 불허하게 만들 수 있게 한다. 하지만 접근을 불허하게끔 구현하는 것이지 변수를 전역 변수로 선언하거나 변수들끼로 소통하게 만든다면 모듈화는 깨지게 되므로 무조껀 모듈화가 되는 것은 아니다.
절차 지향의 구조화의 특징은 저수준 관점에서 순차, 선택, 반복으로 나뉜다.
순차란 구문 순서에 따라서 순서대로 실행되는 것을 의미한다.
선택이란 조건문을 사용하여 필요한 동작을 선택하는 것을 의미한다.
반복은 반복문을 사용하여 동작을 반복하는 것을 의미힌다.
고수준 관점에서 본다면 큰 조각의 코드를 이해하기 쉬운 작은 하부 프로그램으로 나눠야 한다.
전역 변수는 거의 사용하지 않도록 하며 하부 프로그램들은 지역 변수나 값의 참조에 의한 인자를 받아야 된다.
이를 통해 코드의 재사용성의 증가를 요할 수 있고 가독성 증가와 모듈화, 구조화의 이점으로 대규모 프로그래밍에서 이점을 갖는다. 다만 프로시저 호출 시 메인 프로시저에서 호출하는 것보다 느리다고 한다.
예전에 함수형 프로그래밍이라는 개발 기법이 뜨고 있다는 것을 봤는데 다시 한 번 찾아봐야겠다.
2. 객체 지향 프로그래밍이란?
객체 지향의 사전적 의미는 프로그램을 수많은 객체라는 기본 단위로 나누고 이들의 상호작용으로 서술하는 방식이다
여기서 말하는 객체는 하나의 역할을 하는 메소드와 변수의 묶음으로 봐야 한다고 한다.
그렇다면 객체 지향이라는 개념이 왜 생겼는지 확인해볼 필요가 있는데 기존의 절차 지향 프로그래밍은 큰 문제를 해결하기 위해 그것을 몇개의 작은 문제들로 나누는(구조화) 하는 하향식 방식을 사용했는데 데이터 처리 방법을 구조화 했을뿐 데이터 자체는 구조화 하지 못했다. 그리하여 네임스페이스 포화 문제를 낳게 되었고 변수 하나의 값이 변경되면 다른 프로그램에서 영향을 받게 되는 불상사가 발생하기도 했다.
이를 해결하기 위해 객체 지향 프로그래밍이 개발 되었다. 작은 문제들을 해결할 수 있는 객체들을 만든 뒤 이 객체들을 조합해서 문제를 해결하는 상향식 해결법을 도입한 것이다. 객체는 만들어 놓으면 재사용이 무한정 가능하므로 개발 기간의 단축과 비용이 대폭 줄어드는 장점을 보유한다.
객체 지향 프로그래밍의 특징은 캡슐화, 상속, 다형성, 추상화가 가능하다.
캡슐화란 변수와 함수를 하나의 단위로 묶는 것을 의미한다. 이는 클래스를 통해 구현이 가능하다.
또 캡슐화를 통해 은닉화가 가능한데 프로그램의 동작은 보이지만 내부에서 이뤄지는 동작은 볼 수 없는 것을 뜻한다.
상속이란 자식 클래스가 부모 클래스의 특성과 기능을 그대로 물려 받는 것을 말한다. 즉 부모가 가진 속성을 하위 인스턴스들이 사용할 수 있게 상속된다는 뜻이다.
다형성이란 변수, 또는 함수가 상황에 따라 다른 의미로 해석될 수 있는 것을 말한다.
쉬운 예로 동물이라는 부모 클래스가 있으면 그 하위에 인간, 사자, 뱀 같은 하위 인스턴스들이 존재하는데 각각 동물이라는 특징을 가지고는 있지만 전혀 다른 종이므로 다형성이 있다고 볼 수 있다. 이를 가능하게 하는 것이 상속이며 하위 인스턴스들을 부모의 속성을 상속 받아 같은 속성을 가지고는 있지만 각 인스턴스마다 다른 속성을 부여할 수 있기 때문이다.
추상화란 주어진 작업이나 객체를 속성들의 일부분을 가지고 필요한 만큼 묘사할 수 있는 방법을 지원하는 것을 말한다.
즉 객체에 저장된 속성들을 모두 사용하지 않고 필요한 것들만 사용하여 원하는 결과물을 만드는 것을 말한다.
3. 두 페러다임의 차이점
예전에는 절차 지향 언어와 객체 지향 언어라는 말이 있어서 두 개가 공존하지 못하는 언어라 생각했었는데 사실은 언어를 사용하는 방법, 즉 패러다임을 뜻하는 단어로써 객체 지향 언어도 절차 지향 언어로 사용할 수 있고 반대도 가능하다고 볼 수 있을 것 같다.
절차 지향 언어의 경우 컴퓨터의 관점으로 봤을 때 빠르게 처리가 가능하다. 위에서 아래로 내려오는 하향식 개발 방법을 택하기 때문에 간단한 구조를 가지고 있다. 반대로 객체 지향은 복잡한 구조를 가지고 있기에 프로그램 성능에 영향을 준다. 하지만 하드웨어의 발전을 통해 이는 무색해지고 있다고 한다.
객체 지향 언어의 경우 다형성을 통해 코드의 재사용화가 보다 쉽게 이뤄지고 절차 지향과 달리 순서에 영향을 받지 않아 개발의 비용과 시간을 단축할 수 있다는 장점이 있다.
이렇게 두 페러다임의 차이점을 알아 보았다. 이전에는 c언어는 절차지향 c++언어 부터는 객체지향이라고 생각하고 살았는데 다시 공부해보니 개발 방법의 차이지 어떤 것을 선택할지는 개발자 본인의 선택이라는 것을 깨달았다.
다음에는 함수형 프로그래밍에 대해 알아보도록 할 예정이다.
'TIL' 카테고리의 다른 글
[TIL] react rifecycle - hook (0) 2021.07.06 [TIL] CSRF, XSS (0) 2021.07.04 [TIL] 비동기 (0) 2021.03.16 [TIL] Prototype Chain (0) 2021.02.26 [반응형웹] 껍데기 만들기 #01 (0) 2021.02.22