객체지향 프로그래밍 (object-oriented programming)

이학성·2022년 2월 4일
0
post-thumbnail

객체지향 프로그래밍이란?

컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체(Object)"들의 모임으로 파악하고자 하는 것이다. 우리가 실생활에서 쓰는 모든 것을 객체라 하며, 프로그램 구현에 필요한 객체를 파악하고 각각의 객체들의 역할이 무엇인지를 정의하여 객체들 간의 상호작용을 통해 프로그램을 만드는 것을 말한다.

클래스를 이용해 연관있는 처리부분과(함수) 데이터부분(변수)을 하나의 객체(인스턴스)로 묶어 생성, 사용, 작은 문제를 해결하는 객체를 생성해 큰문제를 해결하는 Bottom-Up 방식이다.

OOP의 기본 구성 요소

클래스(Class)

  • 같은 종류의 집단에 속하는 속성과 행위를 정의한 것. 다른 클래스와 독립적으로 디자인해야 한다.

객체(Object)

  • 클래스의 인스턴스(Instance). 상위 클래스의 속성을 가지고 있으면서 개별적인 특성과 행위(메소드 : Method) 또한 가지고 있다.

메서드(Method)

  • 클래스로부터 생성된 객체를 사용하는 방법. 객체의 속성을 조작하는 데 사용된다.

OOP의 특성

객체 지향 프로그래밍의 중요한 특성은 강한 응집력(Strong Cohesion)약한 결합력(Weak Coupling)을 지향한다는 점이다.

응집력(cohesion) : 프로그램의 한 요소가 해당 기능을 수행하기 위해 얼마만큼의 연관된 책임과 아이디어가 뭉쳐있는지를 나타내는 정도. 프로그램의 한 요소가 특정 목적을 위해 밀접하게 연관된 기능들이 모여서 구현되어 있고, 지나치게 많은 일을 하지 않으면 그것을 응집력이 높다고 표현한다.

결합력(coupling) : 프로그램 코드의 한 요소가 다른 것과 얼마나 강력하게 연결되어 있는지, 얼마나 의존적인지를 나타내는 정도. 결합력이 낮다는 것은 한 요소가 다른 요소들과 관계를 크게 맺고 있지 않은 상태를 의미한다.

클래스에 하나의 문제 해결을 위해 데이터를 모아 놓은 객체를 활용한 프로그래밍을 지향하므로 응집력을 강화하며, 클래스 간에 독립적으로 디자인함으로써 결합력을 약하게 할 수 있다.

1. 추상화 (abstraction)

대상을 관찰하여 핵심적인 특징(속성과 행위)을 뽑아내는 과정이다.
이때 관련있는 것들을 묶게되면 캡슐화가 되고 묶은 개념은 추상화가 되고 주체는 클래스가 된다.
중요한 것은 속성 위주가 아닌 동작 위주로 정의하는 작업을 하는 것이다.
'객체'는 클래스로 부터 실체화 된것으로 눈에 보이며 실체한다.
'클래스'는 추상적이기에 눈에 보이지 않고 개념적으로만 존재한다.

2. 캡슐화 (Encapsulation)

특징(속성과 행위)가 관련있는 것끼리 묶는다. (데이터와 알고리즘을 하나로 묶는 것)
접근이 필요한 부분을 제외하고 구체적인 로직은 내부로 숨긴다(=은닉성)
구체적인 로직을 내부로 은닉하기 위함이다.
- 클래스 내부 구현의 '응집도'를 증가시킨다.
- 외부 클래스와의 '결합도'를 감소시킨다. (일반적인 객체지향언어는 '접근 제한자'를 지원한다.{public, private, protected})

3. 상속 (Inheritance)

대상이 되는 클래스의 모든 특징을 물려받는 것, 자식 클래스로 부터 부모 클래스가 대체되어도 의미가 성립되어야한다.(계층형 구조)
-부모와 자식은 '상속관계'
-관계가 내려갈수록 고유 특징이 증가하여 '구체화'된다.
- 관계가 올라갈수록 '일반화'된다. (더 많은 객체에 영향을 준다)

4. 다형성 (Polymorphism)

상속과 연관이 있는 개념으로 한 객체가 다른 여러형태(객체)로 재구성 되는 것이다.
쉽게 말하면 한부모의 밑에서 태어난 자식(쌍둥이포함)이 똑같지는 않는 것과 같다.

OOP의 장단점

장점

  • 재사용성이 좋다.
    - 상속과 모듈화를 통해 코드의 재사용성을 높일 수 있다.
  • 유지보수가 쉽고 확장성이 좋다.
    - 독립적인 객체를 사용하여서 개발의 생산성을 향상시킬 수 있다.
    - 클래스 내부에 변수 혹은 메서드로 있기에 해당 부분만 수정하고 만들어진 객체를 발전시키면 되서 확장성이 좋다.

단점

  • 개발속도가 느리다.
    - 생성하고자 하나 객체를 정확하게 이해하고 넓게 생각해야하기에 설계 단계부터 많은 시간이 소모 된다.
  • 실행속도가 느리다.
    - 모든 것을 객체로 생각하기 때문에 추가적인 메모리와 연산에 대한 비용이 들어가게 된다.
profile
좋은 개발자가 되기 위해

0개의 댓글