-
고급 객체지향 프로그래밍(1)객체지향 2020. 1. 17. 21:14
객체지향의 개념을 배워보기에 앞서
객체지향 프로그래밍이 어떻게 생겨나게 되었고 이를 왜 사용하는지에 대해서 알아보자
1.1. 소프트웨어 위기와 객체 기술
소프트웨어 위기는 소프트웨어 기술 발전 속도가 컴퓨터 하드웨어 기술 발전 속도보다 뒤떨어짐으로써 발생되는 문제이다. 즉, 하드웨어 품질은 좋아지면서 가격은 성능대비 낮아지고 있는데, 소프트웨어는 품질이 크게 개선되지 않으면서 오히려 개발 및 운영 비용은 증가하고 있다는 것이다.
소프트웨어 위기의 두가지 원인은 점점 증가하는 소프트웨어 복잡도와 높은 비용이다.
소프트웨어의 개발 요구사항은 복잡해져 가는데, 이 복잡도를 효과적으로 해결할 수 있는 기술이 크게 발전하지 못하면서, 개발 및 운영 비용이 증가하는 것이다.
소프트웨어 위기 문제를 해소하기 위해 개발 기간과 인원을 늘리면 비용이 그만큼 증가하고, 많은 인원들 간의 의사소통, 회의, 산출물 간의 일관성 유지 등 상당한 노력이 소요된다. 이를 해결하는 대표적인 방법은 효과적인 개발 방식의 채택, 소프트웨어 재사용을 통한 개발생산성 향상 및 유지보수 효율성이 높은 소프트웨어의 설계가 있다.
1.1.1 객체지향 패러다임
객체지향 패러다임은 유지 보수성 높은 SW, 효과적인 SW 재사용, 개발 패러다임은이러한 세 가지 해결 방법들을 제공해 주는 핵심기술이다. 상속 등 여러 장치들을 활용하여 소프트웨어 재사용성을 높여주며, 정보 은닉 등 여러 장치들을 통하여 효율적인 소프트웨어 유지보수를 가능하게 한다. 그 결과, 객체지향 기술은 소프트웨어 위기 해결의 효과적인 수단으로 정착되었고, 현재 산업계에서 사용되고 있는 프로그래밍 언어, 운영체제, 인터페이스 정의, 재사용 라이브러리, 클라우드 서비스 등은 거의 대부분 객체지향 방식을 채택하여 개발된 것이다.
1.2. 절차적 프로그램
소프트웨어에 대한 절차적 시각과 객체지향적 시각을 비교해 보면, 객체지향 프로그래밍의 특징과 개념을 쉽게 파악할 수 있다.
절차적 프로그램은 한 프로그램에서 필요로 하는 모든 속성들을 데이터 부분으로 한군데에 모아놓고, Main()을 포함한 모든 오퍼레이션들을 기능 부분으로 별도로 모아둔다. 모든 절차적 프로그램은 그 크기와 무관하게 데이터 부분과 기능 부분이 별도로 정의되는 구조를 가진다.
* 그룹핑 장치 결여로 인한 개발생산성 저하
C언어의 구조체인 struct 장치는 관련된 속성들만 모을 수 있고, struct 데이터를 사용하는 오퍼레이션들은 함께 묶어서 표현할 수 없다. 예를 들어, 원이라는 도형을 설계할 때, 중앙점의 좌표를 나타내는 x와 y, 반지름을 나타내는 radius는 다른 속성들과 함께 데이터 부분에 모여 있고, 이 속성들을 사용하는 move(), resize() 등의 오퍼레이션들은 속성들과는 떨어져서 별도로 모여 있다. 즉, 원과 관련된 속성들과 오퍼레이션들만을 하나의 단위 안에 그룹핑할 수 있는 장치가 없다.
복잡한 기능을 제공하는 중·대형 프로그램에서 관련된 속성들과 오퍼레이션들이 여러 곳에 분산되어 있으면, 개발자가 관련된 항목들을 식별하거나 추적하기 어려워진다. 이런 구조를 가진 프로그램은 독립적인 모듈로 분리하기 어렵기 때문에 여러 개발자가 개발 업무를 나누어 병렬로 개발할 수 없다. 그럼에도 불구하고 병렬 개발을 진행하면, 개발자들이 작성한 코드 간의 의존도가 높아져 일관성 유지를 위한 의사소통 비용이 높아지며 그 결과 개발 생산성이 떨어진다.
* 구성요소들 간의 높은 결합도로 인한 유지보수성 저하
절차적 프로그램에서 선언된 속성과 오퍼레이션은 전역 변수의 영역을 가지므로 어떤 제약도 없이 구성요소들 간의 상호 참조가 가능해 진다. 그 결과 프로그램의 구성요소들 간의 결합도가 높아진다.
예를 들어 데이터 속성 D1은 F1, F2, F3 오퍼레이션들에 의해 참조 되고 있고, 오퍼레이션 F4는 D2, D3 속성들을 참조하고 있다. 이처럼 한 프로그램 안에서 데이터 속성들과 오퍼레이션들의 참조 관계를 모두 선으로 표현하면, 스파게티 누들색들이 얽혀있는 모양을 상상할 수 있다. 특히, 대형 과제의 프로그램에서 이런 스파게티 형태의 참조 관계는 개발 비효율성과 유지보수의 어려움을 가중시킨다.
만약 년도를 나타내는 프로그램을 수정한다고 가정하면 두 자리의 년도 수에서 네 자리 수의 년도 수를 표현하도록 변경하는데 상당히 많은 비용과 노력이 필요할 것이다.
* 데이터 무결성 보장의 어려움
데이터의 무결성이란 어떤 속성, 즉 변수가 항상 유효한 값을 가지고 있는 특성을 나타낸다. 예를 들어 짝수 값을 가지는 정수 변수를 int a; 라고 선언하면 이 변수는 2, 4, 6, 8, 10 등의 유효한 짝수 값을 가져야 한다. 이 변수가 3, 7등의 유효하지 않은 값을 가지고 있으면, 이 변수의 데이터 무결성이 지켜지지 않은 것이다. 절차적 프로그램에서 전역 변수에 유효하지 않은 값을 저장하려 할 때, 이를 근본적으로 막을 수 있는 체계적인 장치가 없다.
'객체지향' 카테고리의 다른 글
2주차 과제: 자바 데이터 타입, 변수 그리고 배열 (0) 2021.01.19 1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. (0) 2021.01.17 고급 객체지향 프로그래밍(3) (0) 2020.01.20 고급 객체지향 프로그래밍(2) (2) 2020.01.17