Post

객체 지향(OOP) 프로그래밍

객체 지향(OOP) 프로그래밍

객체 지향 프로그래밍(Object-Oriented Programing) 이란?

소프트웨어를 객체라는 단위로 나누어 개발하는 프로그래밍 패러다임으로,
객체들이 상호작용하는 방식으로 프로그램을 구성합니다.
코드 재사용성이 좋고, 유지보수에 용이합니다.


  • 프로그래밍 언어에서 객체란
    객체 = 인스턴스(실제 메모리에 할당된 상태) + 클래스(자료형)


클래스와 인스턴스의 차이?

클래스는 객체를 생성하기 위한 설계도, 인스턴스는 그 설계도로부터 생성된 실제 객체 입니다.

  • 클래스 자체는 메모리에 할당되지 않지만 인스턴스는 메모리에 할당됩니다.
  • 하나의 클래스는 여러 개의 인스턴스를 가질 수 있습니다.



장점

  1. 유지보수
    각 객체가 독립적으로 동작하므로, 수정 시 영향을 최소화 할 수 있습니다.
  2. 코드 재사용성
    상속을 통해 기존 코드를 재사용합니다.


단점

  1. 관계가 많아지면 구성하는데 복잡하다고 느낄 수 있다.
  2. 용량 비대화가 생길 수 있다.


다형성을 제공하지만 절차지향보다 오버헤드가 조금 더 발생한다.

하지만 그만큼 다형성이 프로그래머에게 도움을 굉장히 많이 주기 때문에
오버헤드를 감수하고 객체지향을 사용합니다.



추상화

프로그래밍의 추상화란 실제 사물을 보고 코드로 만들기 위해 공통된 요소들을 추출하는 작업입니다.

이 추상화를 완성하기 위한 클래스의 3대 특성이 있습니다.
바로 캡슐화(은닉화), 상속성, 다형성입니다.


추상화를 완성하기위한 클래스의 3대 특성

캡슐화(은닉화) 객체 내부 상태와 구현을 숨기고,
외부에서는 지정된 인터페이스를 통해서만 접근할 수 있도록 해서
사용자는 내부 구현을 몰라도, 필요한 기능만으로 객체를 사용할 수 있게 합니다.
상속성 자식 클래스는 부모 클래스의 속성과 함수를 물려받아,
코드의 재사용성과 확장성을 높입니다.
다형성 동일한 함수나 연산자가 여러 형태로 동작하는 특성입니다
(가상함수, 캐스팅 등)



캡슐화

캡슐화란 객체의 내부 데이터와 이를 처리하는 함수들을 하나의 단위로 묶고,
외부에서 내부 상태에 직접 접근하는 것을 제한하는 개념입니다.
사용자가 굳이 알 필요 없는 내용을 숨겨서 필요한 부분에만 집중 할 수 있도록 합니다.

어떤 내용물이 들어있는지는 몰라도 플레이어와 관련된 일은
플레이어 클래스에 있을 것이라고 알릴 수 있습니다.



상속성

상속이란 베이스 클래스(부모 클래스)의 특성을 파생 클래스(자식 클래스)가 물려받는 기능입니다.
파생 클래스는 베이스 클래스의 성분을 가지고 생성됩니다.


상속을 왜 쓰는가?

상속을 활용하면 부모 클래스의 속성과 함수를 자식 클래스에서 재사용하면서
새로운 기능을 추가하거나 기존 기능을 확장할 수 있습니다.


상속의 주요 특징

  1. 코드 재사용성
    부모 클래스에서 정의된 속성과 함수를 자식 클래스에서 재사용 가능
  2. 확장성
    부모 클래스를 기반으로 새로운 기능 추가 가능
  3. 다형성
    다형성은 상속을 기반으로 구현되는 개념으로,
    자식 클래스가 부모 클래스의 함수를 다르게 동작하도록 재정의 할 수 있다. (오버라이딩)


자식 객체 생성/소멸 과정

1
2
3
4
자식 객체 생성 과정
1. 메모리 할당
2. 부모 생성자 호출
3. 자식 생성자 호출


1
2
3
4
자식 객체 소멸 과정
1. 자식 소멸자 호출
2. 부모 소멸자 호출
3. 메모리 반환



상속의 관계

  1. is - a 관계
    위로 갈수록 일반화, 아래로 갈수록 구체화
    ↑일반화 / ↓구체화
  2. has - a 관계 (다중 상속)
    하나의 클래스가 여러 부모 클래스를 상속 받는 경우.
    이 때 모호성 문제가 발생할 수 있다.


다중 상속

하나의 클래스가 두 개 이상의 기본 클래스로부터 상속을 받는
객체 지향 프로그래밍의 개념입니다. (c++가능, C#불가능)

  • 이름 충돌과 다이아몬드 문제(중복 상속)와 같은 문제를 일으킬 수 있다
    -> 가상 상속으로 해결
  • 다중 상속을 사용할 때는 설계가 명확하고 충돌을 최소화 하는 방식으로 사용해야 한다.


가상 상속

  • virtual 키워드를 사용하여 부모 클래스를 가상으로 상속합니다.
  • 부모 클래스가 여러번 상속될 경우, 부모 클래스의 인스턴스를 하나만 생성하도록 보장합니다.
  • class B : virtual public A


public, private, protected 상속의 차이점은?

부모가 public으로 선언한 함수일지라도 private으로 상속받은 경우,
클래스 외부에서는 사용할 수 없다. 클래스 내부에서만 사용 가능하다.

protected는 외부에서 부모의 public함수를 사용하지 못한다.



다형성

다형성이란 하나의 인터페이스(함수, 클래스 등)가 여러 형태로 동작할 수 있게 하는 특성 입니다.
코드의 재사용성과 유연성, 유지보수성 향상에 목적을 둡니다.


정적 다형성과 동적 다형성

  • 정적 다형성
    • 컴파일 타임에 어떤 함수가 호출될지 결정합니다.
    • 함수 오버로딩 : 동일한 이름의 함수를 매개변수 타입이나 개수로 구분
    • 연산자 오버로딩 : +, * 등을 사용자 정의 타입에 맞게 정의


  • 동적 다형성
    • 런타임에 어떤 함수가 호출될지 결정합니다.
    • 함수 오버라이딩 : 부모 클래스로부터 상속받은 함수를 자식 클래스에서 재정의


오버로딩과 오버라이딩의 차이

매개변수 목록이 다른 함수를 같은 이름으로 중복 정의 하는 것이 오버로딩,
상속 받은 멤버 함수를 재정의 하는 것이 오버라이딩 입니다.

This post is licensed under CC BY 4.0 by the author.