객체지향에 관하여

강성현
∙∙조회 22
객체지향에 관하여

▶ 객체지향 프로그래밍 (OOP)이란?

객체들 간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법입니다.

  • 장점
  1. 코드 재사용 용이
  2. 생산성 향상
  3. 유지보수 용이
  • 단점
  1. 실행속도 느림
  2. 프로그램 용량이 커질 수 있음
  3. 설계에 많은 시간 소요

 


1. 객체와 인스턴스

설계도에 해당되는 클래스(class),

그 설계도로 만들어낸 것을 객체(object) 또는 인스턴스(instance)라고 합니다.

 


2. 객체지향의 네가지 특성

 

2-1) 캡슐화 (Encapsulation)

안쪽 데이터를 감추고, 정해진 통로로만 다루게 하여 아무나 건드리지 못하게 합니다.

같은 객체 안에서는 응집도를 높이고 서로 다른 객체끼리는 낮은 결합도를 유지할 수 있도록 설계합니다.

 


2-2) 상속 (Inheritance)

공통된 부분을 한 곳에 두고, 차이만 따로 정의 하는 것입니다.

코드의 중복을 없애고, 확정성을 높입니다.

csharp
public class Job
{
    public virtual void Attack()
    {
        Console.WriteLine("공격");
    }
}

public class Knight : Job
{
    public override void Attack()
    {
        Console.WriteLine("검 휘두르기");
    }
}

 


2-3) 다형성 (Polymorphism)

같은 명령을 내려도 받는 쪽에 따라 다르게 동작 하는 것입니다.

csharp
public class Job
{
    public virtual void Attack()
    {
        Console.WriteLine("공격");
    }
}

public class Knight : Job
{
    public override void Attack()
    {
        Console.WriteLine("검 휘두르기");
    }
}

public class Magician : Job
{
    public override void Attack()
    {
        Console.WriteLine("파이어볼");
    }
}
  • 각 직업별로 Attack( )을 호출하였을 때 출력되는 결과값이 다르다.

 


2-4) 추상화 (Abstraction)

비슷한 특징을 가진 변수, 데이터, 함수를 묶어 클래스로 정의내리는 것,

쓰는 쪽에 필요한 것만 드러내는 것입니다.

 


▶ SOLID 원칙

 

단일 책임 원칙 ( SRP )

한 객체가 한가지 일만 맡는 것입니다.

  • 즉, 하나의 클래스는 하나의 기능을 담당하여 하나의 책임을 수행하기 위해 클래스를 여러개 설계하라는 원칙이다.
  • 프로그램의 유지보수 성을 높이기 위한 기법이다.

 


개방 폐쇄 원칙 ( OCP )

기능을 늘리는 것은 열어 두고, 기존 코드를 고치는 것은 막습니다.

  • 추가하려고 할 때 클래스는 확장을 통해 손쉽게 구현하면서 확장에 따른 클래스 수정은 최소화 하도록 하는 설계 기법입니다.
  • 추상화 사용을 통한 관계 구축 권장을 의미한다.

 


리스코프 치환 원칙 ( LSP )

같은 자리에 들어갈 수 있다고 했으면 실제로 대신 쓸 수 있어야 합니다.

  • 다형성의 특징을 이용하기 위한 원칙으로 업캐스팅된 상태에서 부모의 메서드를 사용해도 동작이 의도대로 흘러가야합니다.

 


인터페이스 분리 원칙 ( ISP )

인터페이스를 각각 사용에 맞게 잘게 분리해야한다는 원칙입니다.

  • SRP 원칙이 클래스의 단일 책임을 강조한다면, ISP는 인터페이스의 단일 책임을 강조한 것입니다.
  • 클라이언트의 목적과 용도에 적합한 인터페이스 만을 제공 하는것이 목표입니다.

※ 주의) 한번 인터페이스를 분리하여 구성해놓고 나중에 무언가 수정사항이 생겨서 또 인터페이스들을 분리하는 행위 는 피해야 합니다.

 


의존 역전 원칙 ( DIP )

참조해야할 Class에 직접 참조하는 것이 아닌, 그 대상의 상위요소(추상 클래스 or 인터페이스) 로 참조 하라는 원칙

  • 구현 클래스에 의존하지 말고, 인터페이스에 의존하라는 뜻