Java/객체지향

객체 지향과 디자인 패턴 Chapter 02 (1) - 절차 지향과 객체 지향

_Jin_ 2024. 8. 26.

 

 

더보기

 

'개발자가 반드시 정복해야 할 객체 지향과 디자인 패턴'을 읽고 학습합니다. ( 최범균 저 )

 

앞서 Chapter 01 에서는 '절차 지향적' 코드의 작성이 수정사항에 맞춰 변화에 어려운 코드임을 보여주었다. 그리고 변화에 잘 대응하는 소프트웨어의 구조와 기법으로 객체 지향 프로그래밍에 대한 소개한다.( Chapter 02부터 본격적으로 객체 지향에 대해 알아보기에 Chapter 02부터 정리한다. )

 

 

 절차 지향과 객체 지향

 

 

'소프트웨어를 구현한다는 점은 결국 최종적으로는 소프트웨어를 구성하는 데이터와 데이터를 조작하는 코드를 작성하는 것이다.'(p.29)

 

위의 말처럼 소프트웨어는 데이터를 가지고 조작 형태를 구현하여 필요한 기능을 만드는 것으로 생각할 수 있다. 

와중에 데이터를 어떻게 조작하고 처리하는 형식을 갖추냐에 따라서 크게 '절차 지향 프로그래밍'과 '객체 지향 프로그래밍'으로 구분할 수 있다. 

 

 

절차 지향 프로그래밍( Procedural Oriented )

 

절차 지향 프로그래밍은 흔히 뭔가 순서에 따른 프로그래밍 방식으로 고려될 수 있으나, 여기서의 절차란 Procedural을 우리말로 옮긴 것뿐이다. 데이터를 조작하는 함수나 프로시저와 같은 형태를 구현하고, 각 프로시저들이 데이터를 조작하는 방식으로 코드를 작성하는 것이 절차 지향 프로그래밍이다. 

 

아래의 그림은 절차 지향 방식의 전형적인 구조로 각 프로시저는 데이터를 사용해서, 기능을 구현하고, 필요에 따른 프로시저를 사용하고 있다. 즉 여러 프로시저가 필요에 따라서 동일한 데이터를 공유할 수 있는 구조인 것이다.

( 프로시저는 pl/sql에서만 들어봤는 데, 코드 구현 수준에서도 사용하는 것은 처음 들어봤지만 의미상 함수와 거의 똑같은 것 같다. ) 

 

예를 들어 아래와 같은 상황을 가정해보자. 

 

 

 평균 계산 프로시저는 각 과목의 점수가 보관된 데이터를 읽어서 합을 구한 뒤, 평균값을 계산한다.
 화면 출력 프로시저는 평균 계산 프로시저가 생성한 평균값 데이터와 과목 점수 데이터를 이용해서 화면에 성적을 출력한다. 

 

이 경우에 ' 평균 계산 프로시저 '와 ' 화면 출력 프로시저 '는 데이터를 공유해서 사용한다. 이처럼 다수의 프로시저들은 데이터를 공유하는 방식으로 만들어지는 절차 지향 프로그램은 자연스럽게 데이터 중심의 구현이 이뤄진다. 

 

하지만, 프로그램 규모가 커지고 데이터가 종류가 증가하고 이를 사용하는 프로시저가 증가하면, 아래와 같은 문제들이 발생한다. 

 

 데이터 타입이나 의미를 변경해야 할 때, 함께 수정해야 하는 프로시저가 증가한다. 
 화면 출력 프로시저는 평균 계산 프로시저가 생성한 평균 값 데이터와 과목 점수 데이터를 이용해서 화면에 성적을 출력한다.

 

 

이는 단적으로 한 데이터를 사용하는 프로시저가 많아질수록 그 데이터의 타입을 변경하기 어려워진다.

예를 들어, 전자 장비의 꺼짐/켜짐 상태를 저장하기 위해 boolean 타입이 고 이름이 isOn이라는 데이터를 사용한다고 가정해 보자. 

이 데이터를 사용하는 프로시저는 모두 isOn을 boolean 타입으로 처리할 것이다. 그런데 요구 사항이 변경되어 꺼짐/켜짐 상태뿐만 아니라 대기 상태를 추가해야 한다면?

그럼 boolean 타입에서 열거 타입으로 변경하게 되면, 이 데이터를 사용하는 모든 프로시저도 함께 수정해 주어야 한다. 

게다가 프로그램 규모가 커진다면, 같은 데이터를 서로 다른 의미로 사용하는 경우 더욱  프로그램의 유연성이 떨어진다. 
만약, 서비스 만료일 데이터가 null인 경우 이를 오류로 처리하도록 만료 데이터 확인 프로시저를 만들었는데, 회원 정보 수정 프로시저에서 서비스를 무한정 사용한다는 의미로 서비스 만료일 데이터의 값을 null로 설정할 수도 있다. 
이런 경우, 만료 확인 프로시저는 서로 다른 의미 null 값으로 인해 예기치 않은 오류를 발생시킬 수도 있다. 

이처럼, 절차 지향 개발은 데이터 중심의 개발로 새로운 요구사항에 따른 이를 사용하는 모든 프로시저의 변경을 유발하며 요구사항의 변경에 따른 유지 보수를 어렵게 만든다는 단점이 존재한다. 

 

 

 ♣ 객체 지향 프로그래밍( Object-Oriented )

 

객체 지향은 절차 지향과 달리 ' 객체 '라고 불리는 단위로 데이터 그리고 데이터와 관련된 프로시저를 묶어서 프로그램을 구성하는 프로그래밍 방법이다. 

 

 

위의 그림처럼, 객체 지향 기법으로 작성된 프로그램은 객체들로 구성이 된다. 

각 객체는 자신만의 데이터와 프로시저를 갖고 있다. 따라서 객체는 자신만의 기능(프로시저)을 제공하며, 각 객체들은 다른 객체와 연결되어(상호작용) 다른 객체가 제공하는 기능을 사용할 수 있게 된다. 

 

객체는 다른 객체에 기능을 제공하기 위해 프로시저를 사용하는데, 이때 프로시저는 자신이 속한 객체의 데이터에만 접근할 수 있으며, 다른 객체 속한 데이터에는 접근할 수 없다. 

 

앞서, 모든 데이터를 공유하던 절차 지향과 달리 객체 지향은 객체 별로 데이터와 프로시저를 알맞게 정의하여 객체 간의 상호작용을 통해서 프로그래밍을 구성한다. 

 

이처럼 객체 지향적으로 프로그래밍을 구현하면, 요구사항의 변경에 따른 수정에 유연하고 변화된 요구 사항을 빠르게 반영할 수 있게 된다. 

 

 

댓글