코딩을 배우고 , 여러가지 지식을 배우면서 엄청 많이 들어본 단어 OOP (객체지향) 분명 객체지향을 공부했지만 남들에게 객체지향을 설명해봐! 라고 하면 원활한 설명을 하지 못하는게 내 현실이기에 이번 기회에 다시 한번 정리하는 시간을 가질려고 한다.
우선 객체 지향을 공부하기전 객체지향이 탄생하게된 이유와 배경을 먼저 공부해볼려고한다.
여기서 앞서 절차적 프로그래밍과 구조적 프로그래밍이라는 단어가 나오는데 각각에 대해 공부를 하고 어떤 이유로 OOP 까지 넘어 왔는지 연관지어 공부해보겠습니다.
절차적 프로그래밍
자료 위키백과
https://namu.wiki/w/%EC%A0%88%EC%B0%A8%EC%A0%81%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D
자료를 찾아보면서 배운 내용
여러자료들을 찾아보며 읽기전에는 절차적 프로그래밍은 말그대로 절차적 위에서 아래로 절차적으로 내려오는 프로그래밍인줄 알았는데
자료들을 찾으면 찾을수록 조금 다른 느낌인게 PP 에서 앞의 P가 절차의 의미가아닌 프로시저로써 사용된다는점?
프로시저 콜, 즉 함수 호출을 통해서 추상화와 재사용성을 얻어내는 것이 본질이기 절차적 프로그래밍의 본질이라고 한다.
객체지향의 반대의 개념으로 절차적 프로그래밍을 알고있었는데
- 프로시저
- 루틴, 하위프로그램, 서브루틴, 메서드, 함수라고도 함
- 수행되어야할 연속적인 계산과정을 포함
절차적 프로그래밍 장점
- 함수를 통해 코드의 재활용성이 높아지게 된다.
- 짧은 코드의 함수의 호출을통해 전체적인 프로그램의 흐름을 볼수 있기에 코드의 가독성이 높다.
- 컴퓨터의 처리구조와 유사해 실행 속도가 빠르다.
- 모듈화 구조화가 더 용이해지므로 대규모 프로젝트에 많은 프로그래머들이 투입될 경우 모듈화가 쉽다
절차적 프로그래밍 단점
- 유지보수가 어렵다.
- 정해진 순서에 의해 프로그램이 처리되기에 코드를 변경하기가 힘들다 -> 코드 수정이 어려움
- 코드가 길어지면 가독성이 무척 떨어지며 이해하기가 힘들다.
일단 지금까지 자료를 찾아보면서 공부를 정리해보면
~~지향 프로그래밍이라는게 방식 또는 방법론의 차이일 뿐이다.
프로시저를 호출하는 것은 그냥 코드를 쓰는 것보다 시간이 매우 많이 소모(자세하게 내부적으로는 이유는 추가 공부가 필요하다)
컴퓨터의 관점에서 봤을때 속도가 빠르다
절차적 프로그래밍 , 객체형 프로그래밍은 반대가아니다.
규모가 커지며 순서도로 나타내는 것이 불가능할 정도로 꼬인 "스파게티 코드"가 생기게 되고 유지보수가 어려워진다
이런 문제를 보완하기위해 에츠허르 다익스트라가 1968년 GOTO문의 해로움이라는 논문에서 프로그램을 프로시저(procedure) 단위로 나누고 프로시저끼리 호출을 하는 구조적 프로그래밍 방식을 제안하면서 이러한 위기를 벗어나게 된다. 프로그램이라는 큰 문제를 해결하기 위해 그것을 몇개의 작은 문제들로 나누어 해결하기 때문에 하향식(Top-down) 방식이라고도 한다.
하지만 함수는 데이터의 처리 방법을 구조화했을뿐, 데이터 자체는 구조화하지 못했다. 이는 전역 네임스페이스 포화 문제(변수 이름을 다 써서 이름 짓기도 힘든 상황를 낳게 되었다. 게다가 실행 콘텍스트를 저장할 마땅한 방법이 없어지는 문제가 생겼다. 실행 콘텍스트는 특히 GUI에서 중요해지는데 어떤 창의 현재 상태에 따라 함수가 실행해야 하는 동작 방식이 달라지기 때문이다. 또한 엉뚱한 데이터가 엉뚱한 함수에 전달돼서 데이터를 오염시키는 문제가 발생하고 그런 가능성 때문에 프로그래머가 한 함수의 작동에 영향을 받는 변수를 조사해야 할 때 모든 변수를 다 조사해야 하는 어려움에 봉착했다. 변수의 갯수가 수백 개 이하인 코드에서야 이게 사람의 힘으로 가능했지 코드의 덩치가 커지면서 함수가 접근할 수 있는 데이터의 범위에 명시적인 제한을 걸어야 하는 상황이 도래했다. 이를 지역 변수나 구조체(struct) 등으로 어찌 제어하고 있기는 했지만 더 근본적인 해결책이 필요했다.
- 객체지향 프로그래밍 나무위키 참고
이렇게 OOP의 탄생배경과 PP를 간단하게 공부 해보았고
생각보다 시간이 많이 지나 OOP는 다시 시간을 가지고 정리하여 글을 쓸려고한다.
'CS공부' 카테고리의 다른 글
Restful API 에서 Rest는 뭐의 줄임말일까? (0) | 2022.04.22 |
---|---|
프레임워크와 라이브러리 차이점 (0) | 2022.04.17 |
객체지향 프로그래밍 OOP (3) (0) | 2022.03.28 |
객체지향 프로그래밍 OOP (2) (0) | 2022.03.17 |
객체지향 프로그래밍 OOP (0) | 2022.03.16 |