비구조적 프로그래밍
은 하나의 함수나, 코드 몸체에 연속된 코드를 작성하는 프로그래밍 패러다임입니다. 이 방식은 구조(함수, 서브루틴 등)를 따로 두지 않고, 하나의 큰 코드 안에 전체 프로그램 코드가 들어있는 형태로 작성하는 프로그래밍 방식입니다. 이 방식은 주로 초기에 작성하던 방식이기 때문에 초기에 많이 사용되던 방식이었고, 초기 프로그래밍 언어(초기 고급언어나, 어셈블리어)들에서 이러한 비구조적인 문법들을 찾아볼 수 있습니다.
대표적으로 비구조적 프로그래밍
의 흐름 제어로는 GOTO
문이 있는데, GOTO
문을 이용하면 코드의 특정 위치로 건너뛸 수 있게 해줍니다. 사실 말로만 하면 굉장히 멋있고 좋아보이지만 로직이 꼬이게 되고, 이는 곧 흐름을 방해하기 때문에 오히려 더 복잡해지는 경향이 있습니다.
이처럼 비구조적 프로그래밍
은 유지보수가 어렵고, 흐름이 복잡해져 코드의 파악이 어려우며, 코드 재사용성을 떨어뜨린다.라는 문제점을 갖게 됩니다.
구조적 프로그래밍
혹은 절차적 프로그래밍
이라고 하는 방법은 비구조적 프로그래밍의 문제점을 보완하고자 등장한 패러다임입니다. 이는 프로그램이 실행될 때 코드의 위에서 아래방향으로만 진행되도록 절차와 순서를 갖게 하는 패러다임입니다.
위에서 절차와 순서를 갖는다고 했는데, 구조적 프로그래밍
은 순차, 선택, 반복의 구조를 반복해나가면 코드를 진행합니다.
순차: 코드를 순서대로 진행한다.
선택: 조건문, 선택문 (if 문, switch~case 문)
반복: 반복문 (for, while, do~while 문)(대표적인 구조적 프로그래밍 기반 언어인 C 기준)
구조적 프로그래밍
은 흐름을 어지럽히는 흐름 제어를 사용하지 않음으로써 코드 가독성을 높입니다. 그리고 기능을 함수 등으로 모듈화시키면서 비구조적 프로그래밍 방식보다 유지보수가 더 쉽고, 코드 의미 파악이 쉬우며, 코드의 재사용성도 높여준다는 장점을 갖게됩니다.
구조적 프로그래밍 자체도 개발에 있어서 좋은 점들을 가져다 줬지만, 갈수록 협업이 중시되며 여러 사람이 함께 작업을 하자, 구조적 프로그래밍에서도 문제점이 발견되게 됩니다.
바로 어떤 표현에 대한 속성과 행위가 개별로 분리된다는 점 입니다. 코드가 점점 거대화 되면서 분리된 속성과 행위를 바로 알아내기 힘들어졌고, 이에 대한 대책으로 이들을 하나의 개념으로 묶어서 표현하자는 개념인 객체지향 프로그래밍
이 등장하게 되었습니다.
위 이야기를 좀 더 풀어서 설명하자면, 자동차라는 것을 코드로 표현할 때 구조적 프로그래밍에서는 자동차의 색, 종류와 같은 속성과 시동을 건다/끈다와 같은 코드 자체는 분리가 됩니다. 하지만, 구조적 프래그래밍의 특성상 같은 파일에 위치하더라도 코드가 방대해지면 속성과 행위가 연관이 있다는 것을 쉽게 알 수가 없게됩니다.
C에서 구조체를 보면, 속성을 먼저 선언해두고, 나중에 그에 대한 행위 함수를 작성하게 됩니다. 이러한 코드들이 늘어나면 연관이 있다고 개념적으로 알아보기 어렵다라는 이야기 입니다.
객체지향 프로그래밍
은 어떤 개념의 속성과 행위(메소드/함수)들을 하나로 묶어서 표현합니다. 이 덕에 각 객체들을 이해하기 사용하기에 훨씬 쉬워졌습니다. 그리고 객체는 만들면 분리가 가능해서 다른 코드에 갖다 사용할 수도 있고(독립성 향상), 향상된 독립성으로 인해 유지보수도 매우 간편해졌습니다.