객체 지향 프로그래밍(Object-Oriented Programming, OOP)
- 컴퓨터 프로그래밍의 패러다임 중 하나
- 프로그래밍: 하나 이상의 관련된 추상 알고리즘을 특정한 프로그래밍 언어를 이용해 구체적인 컴퓨터 프로그램으로 구현하는 기술을 말한다.
- 패러다임: 어떤 한 시대 사람들의 견해나 사고를 근본적으로 규정하고 있는 테두리로서의 인식의 체계, 또는 사물에 대한 이론적인 틀이나 체계를 의미하는 개념이다.
- 컴퓨터 프로그램을 여러개의 독립된 단우, 즉 '객체'들의 모임으로 파악하고자 하는 것
- 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.
- 프로그램을 유연하고 변경이 쉽게 만든다.
- 소프트웨어 개발과 보수를 간편하게 하며, 보다 직관적인 코드 분석을 가능하게 하는 장점이 있다.
- 대규모 소프트웨어 개발에 많이 사용된다.
기본 구성 요소
- 클래스(class)
- 사용자 정의 자료형
- 같은 종류(또는 문제 해결을 위한)의 집단에 속하는 속성(attribute)과 행위(behavior)를 정의한 것
- OOP의 기본적인 사용자 정의 데이터형(user defined data type)
- 클래스는 다른 클래스 또는 외부 요소와 독립적으로 디자인하여야 한다.
- 객체(Object)
- 기능을 가진 데이터
- 클래스의 인스턴스(실제로 메모리상에 할당된 것)
- 자신의 고유의 속성(attribute)을 가지며 클래스에서 정의한 행위(behavior)를 수행할 수 있다.
- 객체의 행위는 클래스에 정의된 행위에 대한 정의를 공유함으로써 메모리를 경제적으로 사용한다.
- 메서드(Method)
- 한 객체의 서브루틴(subroutine) 형태로 객체의 속성을 조작하는 데 사용된다.
- 메시지(Message)
특징
OOP는 자료 추상화를 기초로 하여 상속, 다형 개념, 동적 바인딩이 시스템의 복잡성을 제어하기 위해 서로 맞물려 기능하는 것이다.
- 자료 추상화(abstraction)
- 불필요한 정보는 숨기고 중요한 정보만을 포현함으로써 프로그램을 간단히 만드는 것이다.
- 자료 추상화를 통해 정의된 자료형을 추상 자료형이라고 한다.
- 추상 자료형: 자료형의 자료 표현과 자료형의 연산을 캡슐화한 것으로 접근 제어를 통해서 자료형의 정보를 은닉할 수 있다.
- 캡슐화(encapsulation)
- 객체의 속성(data fields)과 행위(메서드, methods)를 하나로 묶고, 실제 구현 내용 일부를 외부에 감추어 은닉한다.
- OOP에서 일반적으로 추상 자료형을 클래스, 추상 자료형의 인스턴스를 객체, 추상 자료형에서 정의된 연산을 메서드(함수), 메서드의 호출을 생성자라고 한다.
- 상속(Inheritance)
- 새로운 클래스가 기존의 클래스의 자료와 연산을 이용할 수 있게 하는 기능이다.
- 상속을 받는 새로운 클래스를 '부클래스'|| '파생 클래스' || '하위 클래스' || '자식 클래스' 라고 한다.
- 새로운 클래스가 상속하는 기존의 클래스를 '기반 클래스' || '상위 클래스' || '부모 클래스'라고 한다.
- 기존의 클래스를 상속받은 하위 클래스를 이용해 프로그램의 요구에 맞추어 클래스를 수정할 수 있다.
- 클래스 간의 종속 관계를 형성함으로써 객체를 조직화할 수 있다.
- is-a 상속(상속, inheritance)
- 추상화들 사이의 포함 관계를 의미하며, 한 클래스 A가 다른 클래스 B의 서브 클래스(파생 클래스)임을 이야기한다.
- 상위 클래스의 기능을 하위 클래스가 물려받아 사용할 수 있다.
- 밀접한 결합
- has-a 상속(구성, composition)
- 구성 관계를 의미하며 한 오브젝트가 다른 오브젝트에 속하는 것을 말한다.
- 더 많은 유연성을 제공한다.(명세에 변경이 발생하더라도 구성요소를 쉽게 변경할 수 있다.)
- 느슨한 결합
- 다중 상속(Multiple inheritance)
- 클래스가 2개 이상의 클래스로부터 상속받을 수 있게 하는 기능이다.
- 클래스의 상속 관계에 혼란을 줄 수 있다.(ex. 다이아몬드 상속)
- Java는 지원하지 않는다.
- 다형성 개념(polyomrphism)
- 어떤 한 요소에 여러 개념을 넣어 놓는 것이다.
- 일반적으로 오버라이딩이나 오버로딩을 의미한다.
- 오버라이딩: 같은 이름의 메서드가 여러 클래스에서 다른 기능을 하는 것
- 오버로딩: 같은 이름의 메서드가 인자의 개수나 자료형에 따라서 다른 기능을 하는 것
- 다형성 개념을 통해서 프로그램 안의 객체 간의 관계를 조직적으로 나타낼 수 있다.
- 동적 바인딩
- 실행 시간 중에 일어나거나 실행 과정에서 변경될 수 있는 바인딩으로 컴파일 시간에 완료되어 변화하지 않는 정적 바인딩과 대비되는 개념이다.
- 바인딩: 프로그램의 어떤 기본 단위가 가질 수 있는 구성요소의 구체적인 값, 성격을 확정하는 것을 말한다.
- 프로그램의 한 개체나 기호를 실행 과정에 여러 속성이나 연산에 바인딩함으로써 다형 개념을 실현한다.
- 즉 동적바인딩은 런타임 시점에 해당 메서드를 구현하고 있는 실제 객체 타입을 기준으로 찾아가서 실행될 함수를 호출한다.
장점
- 강한 응집력(Strong Cohesion)
- 하나의 문제 해결ㅇ르 위한 데이터를 클래스에 모아 놓은 데이터형을 사용함으로써 응집력을 강화한다.
- 약한 결합력(Weak Coupling)
- 클래스간의 독립적인 디자인을 함으로써 결합력윽 약화한다.