객체 지향 방법론(OOP)란 무엇인가.

개발 시작하면서 정말 많이 들었던 단어가 아닐까 싶습니다. 

정리차원에서 OOP 가 무엇이고 왜 그렇게 언급되는지 알아볼까합니다. 

 

 

OOP 는 모든 것을 객체로 보고 객체들 간의 상호작용으로 프로그램을 구성하는 개발 방식입니다. 

OOP 는 디자인 패턴은 아니며 개발 방법론 중 하나입니다. 

그럼 OOP 는 왜 등장하게되었을까요.

단순합니다. "코드가 너무 복잡해져서 유지보수하기 힘들다" 등장 이유 입니다. 

OOP 는 유지보수가 왜 쉬울까요. 

그건 OOP 의 특징 4가지를 보면 알 수 있습니다. 

 

 

추상화(Abstraction) 는 중요한 부분만 뽑애내고 복잡한 것은 숨기는 것을 의미합니다. 

사용자에게 불필요한 기능은 제거하고 필요한 기능만 공개하고 내부는 감춥니다. 

이는 복잡한 시스템을 쉽게 접근할 수 있게하고 필요한 것만 집중할 수 있게합니다. 

예를들면 소비자가 음식점에서 결제할 때, 결제 방법만 알고 결제 프로세스는 몰라도되는 것과 유사합니다. 

"이게 왜 유지보수를 쉽게 한다는거지?" 추상화를 공부하면서 제가 느꼈던 감정입니다. 

필요한 부분만 노출하고 내부 구조는 숨기는게 추상화의 핵심인데 그래서 이게 왜 유지보수를 쉽게하냐고!

정답은 "내부 구조를 변경해도 외부 코드를 수정할 필요가 없기 때문입니다." 정리 됩니다. 

아래 코드에서 찾아보면 사용자는 다필요없고 Pay 메서드 하나만 알면 장땡입니다. 

구현화(추상화 Pay 메서드를 구현한 소스) 어떻게 변경되든 외부에서 사용되는 Pay 메서드는 변경되지 않기에 개발자 입장에서는 내부 소스만 관리하게됩니다.  

다시 한번 정리하면 추상화는 필요한 부분만 외부에 노출하고 복잡한 내부동작은 숨기는 것 이라고 정의합니다. 

    public abstract class PaymentService
    {
        public abstract void Pay(int price);
    }

    public class CreditCardPayment : PaymentService
    {
        public override void Pay(int price)
        {
            Console.WriteLine("크레딧 결제");
        }
    }

    public class CashPayment : PaymentService
    {
        public override void Pay(int price)
        {
            Console.WriteLine("현금 결제");
        }
    }

 

 

캡슐화(Encapsulation) 데이터와 메서드를 하나로 묶고 외부에서 직접 접근을 차단합니다. 

풀어서 설명하면 데이터를 보호하고 제어된 방식으로만 데이터를 읽거나 수정할 수 있는 일종의 보안입니다. 

외부에서 내부 데이터를 변경할 수 있으면 어떤 문제가 발생할까요?

아래 코드를 보면 내가 가진돈(money) 1만원이있고 1만원 중 5000원만 출금하려고 합니다. 

그런데! 내가 가진돈을 누군가 -1000 처리해버렸습니다. 

그리고 출금을 하면?.. 정상이라면 5천원이 나와야하지만 누군가의 데이터조작으로 오히려 -6000원을 떠안게 되었습니다. 

이런 불상사를 방지하기위한게 캡슐화입니다. 

    public class BankService
    {
        public int money = 10000;

        public int Withdraw(int price)
        {
            return money - price;
        }
    }

    public static void Main()
    {
        BankService service = new BankService();
        service.money = -1000; // 데이터 조작 발생

        service.Withdraw(5000);
    }

 

캡슐화를 적용하면 어떻게 될까요?

여기서 접근제한자 개념이 등장하는데요. 이건 따로...

private 설정하므로써 외부에서의 접근을 차단하고 ChangeMoney 메서드를 제공해서 money 변수에 간접적으로 접근할 수 있도록 합니다. 

이렇게 처리하면 money 변수가 음수될 확률이 없어지므로 프로세스 오류를 막을 수 있습니다. 

    public class BankService
    {
        private int money = 10000; // 캡슐화

        public int Withdraw(int price)
        {
            return money - price;
        }

        public void ChangeMoney(int price)
        {
            if (money - price < 0)
            {
                Console.WriteLine("음수 발생");
            }
            else
            {
                money = money - price;
                Console.WriteLine("정상 처리");
            }
        }
    }

    public static void Main()
    {
        BankService service = new BankService();
        int price = service.Withdraw(5000);
        service.ChangeMoney(price);
    }

 

어찌보면 데이터를 숨기고 보호하는 점에서 추상화 , 캡슐화는 헷갈리기 쉬운 개념일 것 입니다. 

추상화 "필요한 정보만 공개하고 나머지는 숨기는 것", 인터페이스와 추상클래스를 사용합니다. 

캡슐화 "정보를 감추고 외부 접근을 통제하는 것", 접근제한자를 사용합니다. 

추상화를 통해 필요한 메서드만 공개하고 그 메서드 내부는 캡슐화로 데이터를 보호한다고 이해하면 좋을 것 같습니다. 

인터페이스, 추상클래스, 접근제한자는 따로 포스팅하겠습니다.

 

 

상속(Inheritance) 부모 클래스의 속성과 메서드를 자식 클래스가 물려받아 재사용하거나 확장하는 것

상속... 저는 받을게 없으니다만 부모님의 재산을 물려받는 개념은 동일합니다. 

상속은 왜 사용할까요? 

Parent 상속받는 Son 은 부모 클래스의 Money 와 Play 모두 사용할 수 있습니다. 

반면 Me 는 Study 만 사용할 수 있습니다. 

상속받지 않은 Me 가 Money 기능을 사용하려면 따로 구현해야하기 때문에 코드 중복이 생겨버립니다. 

다시 질문으로 돌아가면 상속은 확장성 및 코드 중복 제거 장점을 가지고 있습니다. 

  #region 상속

  public class Parent
  {
      public void Money()
      {
          Console.WriteLine("돈");
      }
  }

  public class Son : Parent
  {
      public void Play()
      {
          Console.WriteLine("놀다");
      }
  }

  public class Me
  {
      public void Study()
      {
          Console.WriteLine("공부");
      }
  }

  #endregion



  public static void Main()
  {
      Son son = new Son();
      son.Money();
      son.Play();

      Me me = new Me();
      me.Study();

  }

 

 

다형성(Polymorphism) 같은 이름의 메서드를 호출해도 객체에 따라 다른 결과가 나오는 것을 의미합니다. 

종류로는 오버로딩(Overloading), 오버라이딩(Overriding) 존재합니다. 

오버로딩 메서드명이 같고 파라미터 타입이나 개수가 다른 것

오버라이딩 부모 타입으로 자식 객체를 참조하고 호출할 때 자식 메서드가 실행

주로 실무에서는 오버로딩보다는 오버라이딩을 많이 사용합니다. 

 

오버로딩은 메서드명은 같고 파라미터가 다른 것이라고 설명드렸는데요. 

주로 특정 데이터에 의해 메서드를 구분할 때 사용합니다. 

파라미터를 1개 던지면 1번째 Over 호출되고 파라미터를 2개 던지면 2번째 Over 가 호출되는 구조입니다. 

    public void Over(int a)
    {
        Console.WriteLine("오버로딩1");
    }

    public void Over(int a, int b)
    {
        Console.WriteLine("오버로딩2");
    }

 

오버라이딩은 인터페이스, 클래스 상속받아서 사용되는 기술인데요. 

아래 코드 기준 2명의 아들이 모두 상속을 받은 상태입니다. 

3명 모두 기능이 다른 OverMoney 메서드를 생성했습니다. 

메서드명은 같지만 기능이다른 형태를 오버라이딩이라고하며 사용하기 위해서는 몇가지 키워드가 필요합니다. 

부모 메서드의 virtual 자식 메서드의 override 가 그 키워드입니다. 

virtual 은 이 메서드는 나중에 자식 클래스가 재정의할 수 있음을 의미합니다. 

override 는 재정의를 의미하며 virtual 선언된 메서드와 명칭 파라미터 모두 동일해야합니다. 

override 선언된체 단독으로 메서드를 생성할 경우 오류가 발생하니 이부분 기억해주세요. 

저는 주로 인터페이스 상속과 오버라이딩을 사용하는데 인터페이스는 따로 포스팅하겠습니다. 

    public class OverParent
    {
        public virtual void OverMoney()
        {
            Console.WriteLine("부모 돈");
        }
    }

    public class OverSon : OverParent
    {
        public override void OverMoney()
        {
            Console.WriteLine("자식 돈");
        }
    }

    public class OverSon2 : OverParent
    {
        public override void OverMoney()
        {
            Console.WriteLine("자식2 돈");
        }
    }
    
        public static void Main()
    {
        OverParent son = new OverSon();
        OverParent son2 = new OverSon2();
        son.OverMoney();
        son2.OverMoney();
    }

 

 

OOP 핵심 4가지 추상화, 캡슐화, 상속, 다형성에 대해서 정리할 수 있는 좋은 포스팅이네요. 

알고쓰는 것과 모르고쓰는 것은 다르다. 

메모리!

'IT' 카테고리의 다른 글

완벽하지 않아도 괜찮다.  (1) 2025.07.13
일을 하던 대로만 계속 잘하는 건 사실 일을 잘하고 있는게 아니다!  (5) 2025.07.03
AWS MFA 분실했을 경우, 해결 방법  (1) 2025.05.16
공장에서 사용하는 MES란 무엇인가.  (2) 2025.05.09
JWT 토큰이란 무엇인가.  (0) 2025.04.02
'IT' 카테고리의 다른 글
  • 일을 하던 대로만 계속 잘하는 건 사실 일을 잘하고 있는게 아니다!
  • AWS MFA 분실했을 경우, 해결 방법
  • 공장에서 사용하는 MES란 무엇인가.
  • JWT 토큰이란 무엇인가.
memoryman
memoryman
memoryman 님의 블로그 입니다.
  • memoryman
    MEMORYMAN STACK
    memoryman
  • 전체
    오늘
    어제
    • 분류 전체보기 (55)
      • Dart (11)
      • Python (2)
      • C# (1)
      • DB (5)
      • Algorithm (1)
      • Project (4)
      • IT (12)
      • .NET (7)
      • Flutter (12)
  • 블로그 메뉴

    • 프로필
    • 방명록
    • 메모장
    • 자소서
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    D
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
memoryman
객체 지향 방법론(OOP)란 무엇인가.
상단으로

티스토리툴바