객체 지향 프로그래밍(Object Oriented Programming, OOP)
객체 지향이란 실제 세계를 모델링하여 소프트웨어를 개발하는 방식을 말한다. 컴퓨터 부품을 하나씩 조립하여 완성품인 컴퓨터를 만드는 것과 같은 방식으로 객체 지향 프로그래밍에서는 데이터와 그 처리 절차를 하나로 묶어서 생각한다. 이는 여러 개의 독립된 객체들의 모임을 파악하고자 하는 컴퓨터 프로그램의 패러다임 중 하나로, 컴퓨터 프로그램을 명령어로 바라보는 관점에서 벗어난 것이다. 객체란 보고 만질 수 있는 것, 지성적으로 이해할 수 있는 것 등을 의미한다. 쉽게 말하자면 사람이 말로 표현 가능한 모든 것을 객체라 할 수 있다. 시스템의 관점에서는 어떤 상태(State)를 나타내는 데이터의 구조와 동작을 수행하는 함수로 이루어진 프로그램의 요소이다. 객체 지향에서는 함수 대신에 메소드(Method)라는 용어를 사용한다. 이렇게 객체의 상태는 데이터에 의해 결정되고 동작은 메소드에 의해 결정되는 것이다. 소프트웨어 공학의 관점에서 볼 때 소프트웨어의 질을 향상하기 위해서는 강한 응집력(Strong Cohesion)과 약한 결합력(Weak Coupling)을 지향하는데, 객체 지향 프로그래밍의 경우 문제 해결을 위한 데이터를 하나의 클래스에 모아둔다. 이렇게 클래스에 모아 놓은 데이터를 사용함으로써 응집력을 강화하고 클래스 간에는 독립적으로 구조를 유지함으로써 결합력을 약하게 하여 공학적인 측면에서의 목적을 이룰 수 있게 되는 것이다. 또한, 객체 지향 프로그래밍은 주로 대규모 프로젝트에 사용되는데 따로 독립된 객체들은 수정이나 변경이 유연하기 때문이다. 프로그래밍을 소프트웨어의 설계와 개발, 유지 보수하는 과정을 간편하게 하고 이해하기도 쉽게 구성하여 직관적인 코드 분석을 가능하게 해 준다는 장점이 있다. 그러나 지나친 객체화는 실제 세계의 모습을 제대로 반영하지 못한다는 단점도 있다.
객체 지향 프로그래밍의 특징
객체 지향에는 3대 속성이 존재한다. 캡슐화(Encapsulation), 상속(Inheritance), 다형성(Polymorphism)이 그것이다. 이 외에도 자료 추상화, 동적 바인딩 등이 있으며 객체 지향 프로그래밍은 자료의 추상화를 기초로 하여 다형성, 동적 바인딩 등이 서로 맞물려 기능하면서 시스템의 복잡성을 제어한다. 캡슐화란 관련 데이터와 데이터를 처리하는 알고리즘이 하나의 묶음으로 정리된 것을 의미하며 이는 사용이 편리하다. 주요한 데이터를 숨긴 채 외부 상황과 상호작용하도록 메소드를 이용하는 방법으로, 라이브러리로 만들 수도 있고 메시지를 보내서 메소드를 실행시킴으로써 통신도 가능하게 한다. 상속은 이미 작성된 클래스를 이어받아서 새로운 클래스가 기존 클래스의 데이터와 연산을 이용할 수 있게 하는 기능이다. 객체 기술의 가장 핵심이 되는 코드의 재활용에 초점을 맞춘 것으로 프로그램을 쉽게 확장할 수 있도록 해주는 강력한 수단이 된다. 상속을 통해서 원래의 클래스를 상속받은 하위 클래스를 이용해 프로그램의 요구사항에 맞추어 클래스를 수정할 수 있고, 클래스 간의 종속 관계를 형성하여 객체를 더욱 효과적으로 조직화 할 수 있다. 다형성이란 어느 한 요소가 많은 상황에 유연하게 대처하는 기법이다. 일반적으로 오버라이딩이나 오버로딩을 의미한다. 오버라이딩은 같은 이름의 메소드가 여러 클래스에서 다른 기능을 하는 것이고, 오버로딩은 같은 이름의 메소드가 데이터의 개수나 자료형에 따라서 다른 기능을 하는 것을 말한다. 개념적으로 같은 작업을 실행하는 함수들에 똑같은 이름을 부여할 수 있으므로 코드가 간결해지는 효과가 있다. 자료의 추상화는 필요하지 않은 정보는 숨긴 채 중요한 정보만을 표현함으로써 프로그램을 이해하기 쉽고 간단하게 만드는 것이다. 자료의 추상화를 통해 정의된 자료형을 추상 자료형이라 하는데 추상 자료형은 자료형의 데이터와 연산 과정을 캡슐화한 것이다. 객체 지향 프로그래밍에서 추상 자료형은 일반적으로 클래스, 추상 자료형의 인스턴스를 객체, 추상 자료형에서 정의된 연산을 메소드, 메소드의 호출을 생성자라고 한다. 동적 바인딩이랑 정적 바인딩과 대비되는 개념으로, 프로그램의 실행 과정 중에 변경될 수 있는 바인딩이다. 이는 프로그램의 실행 과정에서 여러 속성이나 연상에 바인딩함으로써 다형성을 실현한다.
'소프트웨어 공학' 카테고리의 다른 글
소프트웨어(Software, SW) 관련 신기술과 각 특징 (1) (0) | 2021.11.24 |
---|---|
UI(User Interface)분석 및 설계 시 고려사항과 UI 지침 (0) | 2021.11.23 |
소프트웨어 설계 시 요구사항의 개념 및 특징 (0) | 2021.11.21 |
운영체제(Operating System)의 개념과 구성 및 종류 (0) | 2021.11.20 |
관계형 데이터베이스의 제약 조건 (0) | 2021.11.19 |
댓글