오늘의 TIL은 과제를 하기 앞서 객체지향 프로그래밍과
절차적 프로그래밍에 대해 알아보았다.🕵
객체지향(OOP: Objected Oriented Programming) 과 절차지향(Procedure Programming)
객체지향언어와 절차지향언어는 절대 반대되는 개념이 아니다. 그렇다면 객체지향언어와 절차지향언어는 무엇인가? 우리는 보통 Java, Phython, C# 등의 언어를 객체지향 언어라고 부르며 C언어는 절차지향언어라고 부른다. 하지만 어디까지나 이 언어들이 지향하는 것이지 C언어는 절차적 프로그래밍만 가능하고 Java나 Phython 등은 객체적 프로그래밍만 가능하다는 것이 아니다. 어떤 언어를 사용하든 상관없이 절차지향적 프로그래밍을 할 수 있다. 반대로 C언어를 사용하더라도 객체지향적으로 코딩을 할 수 있는 것이다.
사실 절차지향적 언어라 하는 것은 잘못된 것이다. 모든 프로그래밍 언어가 절차를 기반으로 두고 있는데 절차를 지향한다는 말은 앞뒤가 맞지 않는다. 하나의 예를 비유하자면 역도라는 스포츠는 바벨을 이용한 운동을 기반으로 하는 것인데 바벨을 지향하는 스포츠라고 하는 것과 같은 맥락이다. 그럼 역도를 덤벨로 해야 하나….? 다시 말해 ‘절차지향’이 아닌 ‘절차적 프로그래밍’이 맞는 것이다.
객체지향 프로그래밍(OOP)와 절차적 프로그래밍(PP)는 어디까지나 프로그래밍을 하는데 있어 접근 방식의 차이가 있을 뿐 반대 개념은 아니라고 생각하면 될 것 같다! 절차적 프로그래밍은 ‘데이터를 중심으로 함수’를 만들어 사용하는 편이며, 객체지향은 ‘데이터와 기능(함수)들을 묶어 하나의 객체’ 로 만들어 사용한다고 한다.
<절차적 언어와 객체지향언어를 구분하는 기준>
여러가지 방식이 있겠지만 큰 틀에서는 아래와 같이 나뉜다.
1.캡슐화,다형성, 클래스 상속을 지원하는가?
2.데이터 접근 제한을 걸 수 있는가?
대게 위 기준을 만족하면 객체지향 성향이 강해진다고 보면 된다.
<절차적 프로그래밍>
절차적 프로그래밍은 말 그대로 ‘절차적’으로 코드를 구성한다는 것이다.
데이터에 대한 순서를 파악하고 필요한 기능을 함수로 만들어 절차적(순서대로) 진행시키는 방식
<객체지향 프로그래밍>
객체지향 프로그래밍의 경우 기능들을 묶어 하나의 객체로 만든다.
다시 말하면 각각의 객체를 생성하고 그 객체마다 할 수 있는 행위(기능)들과 데이터를 하나로 묶어주는 것이다.
Ex) 자동차가 할 수 있는 행위(기능)를 하나로 묶어 자동차 객체를, 기사가 할 수 있는 행위를 묶어 기사라는 객체를, 승객이 할 수 있는 행위를 묶어 승객이라는 객체를 묶어 주고 각 객체의 메소드나 필드를 호출하면서 서로 간의 상호작용을 통해 알고리즘을 구성하는 방식이다.
<그럼 어떤 방식이 더 좋은가?!?!>
정답은 없다. 필요에 맞게 사용을 하고 자신이 선호하는 스타일을 사용하면 된다. 과거에는 현재처럼 큰 규모의 하드웨어와 소프트웨어가 필요치 않았다. 오래된 언어인 C, 포트란, 코볼 같은 절차적 언어의 대표라 할 수 있는 언어들이 사용되어졌다.
현대에 들어서면서 점점 소프트웨어 발전이 빨라졌고 이에 따라 코드들도 복잡 해져갔다. 그러다 보니 복잡한 알고리즘들이 꼬이기 시작했고 작성한 코드를 사람이 읽었을 때 이해하기 힘들거나 이해할 수 없는 ‘스파게티 코드’가 되어버린 것이다. 이러한 문제의 대안으로 객체지향적 프로그래밍이 나온 것이다.
다만 현재 기준 객체지향 프로그래밍이 우세하게 사용되어지고는 있다. 그 이유는 복잡한 프로그래밍 일수록 절차적 프로그래밍을 사용한다면 코드들이 꼬이기 쉽고, 확장성 측면에서도 유지 보수를 할 때 메리트가 떨어지기 때문이다.
<절차적 프로그래밍 장단점>
1. 장점
객체나 클래스 생성 없이 바로 프로그래밍
필요한 기능을 함수로 만들어 복붙하지 않고 호출하여 사용
프로그램 흐름을 쉽게 추적
2. 단점
각 코드들의 끈끈한 우정 때문에 수정이 힘들다(유기성이 높아 추가,수정이 힘듦)
디버그(오류검사)가 힘듦
<객체지향 프로그래밍 장단점>
1. 장점
모듈화, 캡슐화로 유지보수가 편함
객체지향적으로 현실 세계와 유사성에 의해 코드를 이해하기 쉽다
객체는 그자체가 하나의 프로그램으로 다른 프로그램에서도 재사용이 가능
2. 단점
대부분의 객체 지향 프로그램은 속도가 상대적으로 느려지고 많은 양의 메모리를 사용하는 경향이 있음
현실세계와 유사성에 의해 코드를 이해하기 쉽게 만들기 위해 설계 과정에 있어 많은 시간이 들어간다
<정답은 없다! 적재적소에 맞추어 사용하자!>
절차적 프로그래밍을 하는 경우는 보통 프로젝트 규모가 크지 않고 재사용할 일이 크지 않는 경우에 많이 사용된다. 프로그램 자체가 가벼워지고 객체지향으로 만드는 것 보다 개발시간과 인력도 줄어든다.
반대로 큰 규모의 프로젝트에서 코드들을 재사용해야 한다면 초기 개발비용을 제외하고 객체지향 프로그래밍이 적합하다. 이후에 유지보수 측면을 바라보았을 때도 안정적이다.
🔚끝🔚
오늘은 이렇게 객체지향 프로그래밍과 절차적 프로그래밍에 대해 알아보았다.
아직은 깊이있는 내용에 대해서는 알지 못하지만 여러 글들을 찾아보며 객체지향과 절차적 프로그래밍에 대한
큰 틀을 이해하고 넘어가고 다음번에 좀 더 깊이있게 들어가보자 한다!