개발공부/디자인패턴

[디자인 패턴] 객체지향의 4대 특징

개발자 찐빵이 2021. 10. 31. 12:46
728x90

객체지향이란?

객체를 만들고 조작하며 객체끼리 관계를 맺어서 다수의 객체가 함께 수행될 수 있게 하는 것 ↔ 절차 지향 언어
ex) C++, C#, Java, Python 등

절차 지향 언어
각 명령어를 작성한 순서로 실행하는 언어
ex) C언어

객체지향 언어(Object-oriented Language)

컴퓨터 프로그래밍의 한 가지 기법으로 객체를 만들고 객체를 사용하는 프로그래밍 방법

특징

  • 프로그램에 다수의 객체를 만든다.
  • 객체의 상호작용을 통해 프로그램을 구현한다.

객체지향 언어의 장점

  1. 재사용성
    상속을 통해 프로그래밍 시 코드의 재사용을 높일 수 있다.
  2. 생산성 향상
    잘 설계된 클래스를 만들어서 독립적인 객체를 사용함으로써 개발의 생산성을 향상할 수 있다.
  3. 자연적인 모델링
    우리 일상생활의 모습의 구조가 객체에 자연스럽게 녹아들어 있기 때문에 생각하고 있는 것을 그대로 자연스럽게 구현할 수 있다.
  4. 유지보수 우수성
    프로그램 수정 시 추가, 수정을 하더라도 캡슐화를 통해 주변 영향이 적기 때문에 유지보수가 쉬워서 매우 경제적이라 할 수 있다

객체지향 언어의 단점

  1. 개발 속도가 느릴 수 있다.
    객체가 처리하려는 것에 대한 정확한 이해가 필요하기에 설계단계부터 많은 시간이 소모된다.
  2. 실행 속도가 느릴 수 있다.
    절차 지향 언어에 비해 실행 속도가 느리다.
  3. 코딩 난이도 상승
    코드가 복잡해져 난이도가 상승할 수 있다.

객체와 인스턴스

클래스 : 설계도
인스턴스 : 실체
객체 : 클래스가 인스턴스가 되었을 때 객체라고 부른다.

객체지향의 4대 특성

1) 추상화 abstraction (모델링)

구체적인 것을 관심 영역(애플리케이션, 서비스 도메인)에 있는 특성만을 가지고 재조합하는 것

2) 캡슐화 encapsulation (정보 은닉)

접근제어자 (Private, Protected, Public)을 사용해 객체 외부에서 내부 데이터의 접근을 통제하는 것

Private 접근제어자

Private을 사용하여 선언된 클래스 멤버는 외부에 공개되지 않으며 외부에서 접근할 수 없다.
즉, 같은 클래스에서만 접근을 허용한다.

Protected 접근제어자

부모 클래스에 대해서 Public 멤버처럼 취급되며, 외부에서는 Private 멤버처럼 취급된다.

Protected 멤버에 접근할 수 있는 영역

  1. 이 멤버를 선언한 클래스의 멤버
  2. 이 멤버를 선언한 클래스가 속한 패키지의 멤버
  3. 이 멤버를 선언한 클래스를 상속받은 자식 클래스의 멤버

Public 접근제어자

Public을 사용하여 선언된 클래스 멤버는 외부로 공개되며, 프로그램 어디에서나 해당 객체에 직접 접근할 수 있다.
Public 메서드는 Private 멤버와 프로그램 사이의 인터페이스 역할을 수행한다고 할 수 있다.

3) 상속성 inheritance (재사용 + 확장)

상위 개념의 특징을 하위 개념이 물려받는 것

상속관계에서 만족해야 하는 조건

  1. 하위 클래스는 상위 클래스이다.
  2. 하위 클래스는 상위 클래스의 한 종류이다.

4) 다형성 polymorphism

오버 로딩

메서드의 이름만 같고 반환형, 파라미터의 개수 등은 다른 것.

아래 예제에서는 함수 이름은 같지만 파라미터 개수가 다른 것을 알 수 있다.
(예제에서는 리턴 타입은 같지만 달라도 된다.)

public int add (int a, int b)
{
    return a + b;
}

public int add (int a, int b, int c)
{
    return a + b + c;
}

오버 라이딩

상위 클래스의 메서드와 같은 시그니처(이름, 반환형, 인자)로 메서드를 재정의하는 것.

즉, 이름, 반환형, 인자 개수는 같아야 하지만 함수 내부 내용은 달라도 된다.

//상위 클래스
public int add (int a, int b)
{
    return a + b;
}

//하위 클래스
public int add (int a, int b)
{
    return a * b;
}

참고사이트

객체지향의 4대 특성
객체지향 언어란?

반응형