객체 지향 프로그래밍(복습)

2023. 12. 28. 12:00[C++]

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

여러 독립적인 부품(객체)들의 조합, 프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.

 

객체(object)

 

객체는 프로그램에서 사용되는 데이터 또는 식별자에 의해 참조되는 공간을 의미하며 값을 저장할 변수작업을 수행할 메소드를 서로 연관된 것들끼리 묶어서 만든 것객체라고 한다. 

예시로 가장 많이 사용하는 것은 자동차와 레고이다.
자동차의 부품이 객체라고 했을 때 부품들의 결합과 연결로 하나의 자동차가 만들어지는 것.
레고 조각이 객체라고 했을 때, 각 레고 조각들이 모여서 하나의 작품이 완성되는 것은 객체지향이라고 설명한다.

 

using System;

public class Car
{
    // 속성
    public string Company { get; set; }
    public string Model { get; set; }
    public string Color { get; set; }
    public int Wheels { get; set; }

    // 기능
    public void StartEngine()
    {
        Console.WriteLine("시동 걸기");
    }

    public void MoveForward()
    {
        Console.WriteLine("전진");
    }

    public void OnBreak()
    {
        Console.WriteLine("브레이크");
    }

    public void MoveBackward()
    {
        Console.WriteLine("후진");
    }
}
// Car 클래스를 상속받는 K3 클래스
public class K3 : Car
{
    // 추가적인 K3 모델 특성 설정 가능
    public K3()
    {
        Company = "Kia";
        Model = "K3";
        Color = "Red";
        Wheels = 4;
    }

    // K3 모델 특유의 기능이나 추가 메서드 구현
}

// Car 클래스를 상속받는 아반떼 클래스
public class Avante : Car
{
    public Avante()
    {
        Company = "Hyundai";
        Model = "Avante";
        Color = "Blue";
        Wheels = 4;
    }

    // 아반떼 모델 특유의 기능이나 추가 메서드 구현
}

// Car 클래스를 상속받는 테슬라 모델 클래스
public class TeslaModel : Car
{
    public TeslaModel()
    {
        Company = "Tesla";
        Model = "Model S";
        Color = "Black";
        Wheels = 4;
    }

    // 테슬라 모델 특유의 기능이나 추가 메서드 구현
}

 


객체 지향의 4가지 특징

객체 지향 프로그래밍은 크게 추상화 , 캡슐화 , 상속 , 다형성의 네가지 특징을 가진다.

1. 추상화(Abstration)

  • 객체에서 공통된 속성과 행위를 추출 하는 것
  • 공통의 속성과 행위를 찾아서 타입을 정의하는 과정
  • 추상화는 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단하게 만드는 것

k3, 아반떼, 테슬라는 모두 자동차이다. 자동차라는 추상화 집합을 만들어두고 공통적인 특징을 만들어 사용한다.

 

추상화가 필요한 이유

  • 다른 종류의 자동차가 추가될 수도 있다. 이때 추상화로 '자동차'를 구현 해놓으면 다른 곳의 코드를 수정할 필요 없이 추가로 만들 부분만 새로 생성해주면 된다.

 

2. 캡슐화(Encapsulation)✨✨

  • 클래스 안에 서로 연관되어있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것
  • 데이터 구조와 데이터를 다루는 방법들을 결합 시켜 묶는 것 (변수와 함수를 하나로 묶는 것을 뜻함)
  • 낮은 결합도를 유지할 수 있도록 설계하는 것

캡슐화가 필요한 이유

  1. 정보 은닉 (Information Hiding):
    • 캡슐화는 객체의 상세 내용을 외부로부터 숨긴다. 객체는 자신의 내부 데이터를 보호하고 외부에서 직접 접근하는 것을 제한한다. 오직 객체의 메서드를 통해서만 데이터에 접근하거나 수정할 수 있도록 설계됩니다.
  2. 접근 제어 (Access Control):
    • 캡슐화는 접근 제어 메커니즘을 통해 객체의 상태를 보호한다. 객체 내부의 데이터에 대한 접근을 제한하거나 허용하기 위해 접근 제한자를 사용한다. 이를 통해 데이터의 무결성을 유지하고 오용을 방지할 수 있다.
  3. 유연성과 재사용성 향상:
    • 캡슐화를 통해 객체의 내부 구현을 외부로부터 숨기므로, 외부 코드는 객체의 내부 구현에 영향을 받지 않고 객체의 인터페이스에만 의존할 수 있다. 이는 유연하고 모듈화된 코드를 작성할 수 있게 해주며, 객체 내부의 변경이 외부 코드에 미치는 영향을 최소화하여 코드의 유지보수 및 재사용을 용이하게 만든다.

C#의 접근 제어자

  • public : 어떤 클래스나 멤버도 이 접근 제어자로 선언된 멤버에 접근할 수 있다. 다른 어셈블리에서도 접근할 수 있다.
  • private : 같은 클래스 내부에서만 접근할 수 있다. 다른 클래스나 메서드에서는 접근할 수 없다.
  • protected : 동일한 클래스 내부 또는 해당 클래스를 상속한 하위 클래스에서 접근할 수 있다.
  • internal : 같은 어셈블리 내의 클래스에서만 접근할 수 있다. 다른 어셈블리에서는 접근할 수 없다.
  • protected internal : 같은 어셈블리 내에서는 internal과 동일하게 작동하며, 하위 클래스에서도 접근할 수 있다.
  • private protected : 같은 어셈블리 내에서 선언된 하위 클래스에서만 접근할 수 있다.

 

3. 상속(Inheritance)

  • 클래스의 속성과 행위를 하위 클래스에 물려주거나 상위 클래스의 속성과 행위를 하위 클래스가 물려받는 것을 말한다
  • 새로운 클래스가 기존의 클래스의 데이터와 연산을 이용할 수 있게 하는 기능

상속의 장점

  • 재사용으로 인한 코드가 줄어든다
  • 범용적인 사용이 가능하다
  • 자료와 메서드의 자유로운 사용 및 추가가 가능하다

상속의 단점

  • 상위 클래스의 변경이 어려워진다
  • 불필요한 클래스가 증가할 수 있다
  • 상속이 잘못 사용될 수 있다

 

4. 다형성

  • 같은 이름의 메서드나 함수가 여러 객체 타입에서 다른 동작을 할 수 있는 능력
  • 어떠한 요소에 여러 개념을 넣어 놓는 것
  • 다형성은 코드의 유연성을 높이고, 객체 간의 관계를 간단하게 만들어주는 특성

 

정적 다형성 (Static Polymorphism) - 오버로딩 (Overloading):

  • 같은 이름의 메서드가 서로 다른 매개변수의 타입, 개수 등을 가지도록 하는 것

 

동적 다형성 (Dynamic Polymorphism) - 오버라이딩 (Overriding)

  • 부모 클래스에서 정의된 메서드를 자식 클래스에서 다시 정의하는 것

객체 지향 프로그래밍의 장단점

장점

  • 클래스 단위로 모듈화시켜서 개발하기 때문에 업무 분담이 편리하고 대규모 소프트웨어 개발에 적합하다.
  • 클래스 단위로 수정이 가능하기 때문에 유지 보수가 편리하다.
  • 클래스를 재사용하거나 상속을 통해 확장함으로써 코드 재사용이 용이하다.

단점

  • 처리속도가 상대적으로 느리다.
  • 객체의 수가 많아짐에 따라 용량이 커질 수 있다.
  • 설계시 많은 시간과 노력이 필요하게 될 수 있다.

SOLID (객체 지향 설계 원칙)

객체 지향적으로 설계하기 위해 SOLID 라 불리는 다섯 가지 원칙이 있다.


1. 단일 책임 원칙 (SRP, Single Responsibility Principle)

  • 하나의 클래스는 단 하나의 책임만 가져야 한다.
  • 단일 책임 원칙을 지키지 않을 경우 한 책임의 변경에 의해 다른 책임과 관련된 코드에 영향이 갈 수 있다.

2. 개방-폐쇄 원칙 (OCP, Open/Closed Principle)

  • 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
  • 기능을 변경하거나 확장할 수 있으면서 기능을 사용하는 코드는 수정하지 않는다.

3. 리스코프 치환 원칙 (LSP, Liskov Substitution Principle)

  • 프로그램 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
  • 상위 타입의 객체를 하위 타입의 객체로 치환해도, 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다.

4. 인터페이스 분리 원칙 (ISP, Interface Segregation Principle)

  • 범용 인터페이스 하나보다 클라이언트를 위한 여러 개의 인터페이스로 구성하는 것이 좋다.
  • 인터페이스는 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.
  • 클라이언트가 필요로 하는 인터페이스로 분리함으로써 각 클라이언트가 사용하지 않는 인터페이스에 변경이 있어도 영향을 받지 않도록 만들어야 한다.

5. 의존관계 역전 원칙 (DIP), Dependency Inversion Principle)

  • 추상화에 의존해야지 구체화에 의존하면 안된다.
  • 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안되고 저수준 모듈은 고수준 모듈에서 정의한 추상 타입에 의존해야 한다

https://kjy1ho.tistory.com/267

 

[Spring] SOLID 원칙

SOLID : 좋은 객체 지향 설계의 5가지 원칙 SRP: 단일 책임 원칙(single responsibility principle) OCP: 개방-폐쇄 원칙 (Open/closed principle) LSP: 리스코프 치환 원칙 (Liskov substitution principle) ISP: 인터페이스 분리

kjy1ho.tistory.com

 

반응형