IMCAT.DEV
로그인 가입
C# 중급 객체지향

C# 객체 지향 프로그래밍(OOP) 심화

C# 객체 지향 프로그래밍(OOP) 심화 — 중급

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

1. 도입 (왜 배워야 하는가)

객체 지향 프로그래밍(OOP)은 현대 소프트웨어 개발에서 필수적인 패러다임입니다. OOP를 잘 활용하면 코드의 재사용성을 높이고, 유지보수성을 향상시키며, 협업 시에 이해도를 높일 수 있습니다. 실무에서는 복잡한 시스템을 구성하기 위해 객체 지향의 원칙을 적용해야 합니다. 만약 OOP를 모른다면, 코드가 복잡해지고 중복이 발생하며, 수정시 다른 부분에 영향을 미칠 수 있어 시스템의 안정성을 해칠 수 있습니다. 이는 결국 개발 기간을 늘리고, 비용을 상승시키는 결과를 초래할 수 있습니다.

2. 핵심 개념 설명

객체 지향 프로그래밍의 주요 개념은 다음과 같습니다:

  1. 클래스 (Class): 객체를 생성하기 위한 설계도. 예를 들어, "자동차"라는 클래스를 만들면, 이 클래스에서 "차량의 색상", "모델", "속도"와 같은 속성을 정의할 수 있습니다.
  2. 객체 (Object): 클래스의 인스턴스. 예를 들어 "내 차"라는 객체는 "자동차" 클래스의 인스턴스입니다.
  3. 상속 (Inheritance): 기존 클래스를 기반으로 새로운 클래스를 만드는 것. 예를 들어, "전기차"는 "자동차" 클래스를 상속받아 "배터리 용량" 속성을 추가할 수 있습니다.
  4. 다형성 (Polymorphism): 같은 인터페이스를 사용해 서로 다른 데이터 타입의 객체를 처리할 수 있는 능력. 예를 들어, "동물" 클래스를 상속하는 "개"와 "고양이" 클래스는 모두 "소리내기" 메소드를 가질 수 있지만, 각기 다른 방식으로 구현할 수 있습니다.
  5. 용어설명
    클래스객체를 정의하는 틀
    객체클래스의 인스턴스
    상속기존 클래스를 통해 새로운 클래스 생성
    다형성동일한 인터페이스로 다양한 객체 처리

    3. 기본 코드 예제

    아래는 클래스와 객체를 사용하는 간단한 예제입니다.

    // 차량 클래스 정의
    public class Car
    {
        public string Color { get; set; } // 색상 속성
        public string Model { get; set; } // 모델 속성
    
        // 차량의 정보 출력 메소드
        public void DisplayInfo()
        {
            Console.WriteLine($"차량 모델: {Model}, 색상: {Color}");
        }
    }
    
    // 메인 프로그램
    public class Program
    {
        public static void Main(string[] args)
        {
            Car myCar = new Car(); // Car 클래스의 인스턴스 생성
            myCar.Color = "파랑"; // 색상 설정
            myCar.Model = "현대 제네시스"; // 모델 설정
            myCar.DisplayInfo(); // 차량 정보 출력
        }
    }

    실행 결과:

    차량 모델: 현대 제네시스, 색상: 파랑

    코드 설명:

    • public class Car : Car라는 클래스를 정의합니다.
    • public string Color { get; set; } : 색상 속성을 정의합니다.
    • public void DisplayInfo() : 차량의 정보를 출력하는 메소드를 정의합니다.
    • Car myCar = new Car(); : Car 클래스의 객체 myCar를 생성합니다.
    • myCar.Color = "파랑"; : myCar 객체의 색상을 "파랑"으로 설정합니다.
    • myCar.DisplayInfo(); : 차량 정보를 출력합니다.
    • 4. 실전 활용 예제

      예제 1: 쇼핑몰에서 장바구니 구현

      쇼핑몰 시스템에서 장바구니를 구현할 때, 상품 클래스와 장바구니 클래스를 사용할 수 있습니다.

      public class Product
      {
          public string Name { get; set; }
          public decimal Price { get; set; }
      }
      
      public class ShoppingCart
      {
          private List<Product> products = new List<Product>();
      
          public void AddProduct(Product product)
          {
              products.Add(product);
              Console.WriteLine($"{product.Name}가 장바구니에 추가되었습니다.");
          }
      
          public void DisplayCart()
          {
              foreach (var product in products)
              {
                  Console.WriteLine($"상품명: {product.Name}, 가격: {product.Price}");
              }
          }
      }
      
      // 메인 프로그램
      public class Program
      {
          public static void Main(string[] args)
          {
              ShoppingCart cart = new ShoppingCart();
              Product product1 = new Product { Name = "티셔츠", Price = 15000 };
              Product product2 = new Product { Name = "바지", Price = 30000 };
      
              cart.AddProduct(product1);
              cart.AddProduct(product2);
              cart.DisplayCart();
          }
      }

      실행 결과:

      티셔츠가 장바구니에 추가되었습니다.
      바지가 장바구니에 추가되었습니다.
      상품명: 티셔츠, 가격: 15000
      상품명: 바지, 가격: 30000

      예제 2: 게임에서 캐릭터 구현

      게임에서 캐릭터를 구현할 때 상속을 사용하여 다양한 캐릭터 타입을 만들 수 있습니다.

      public class Character
      {
          public string Name { get; set; }
          public int Health { get; set; }
      
          public virtual void Attack()
          {
              Console.WriteLine($"{Name}이(가) 공격합니다!");
          }
      }
      
      public class Warrior : Character
      {
          public override void Attack()
          {
              Console.WriteLine($"{Name}이(가) 검으로 공격합니다!");
          }
      }
      
      public class Mage : Character
      {
          public override void Attack()
          {
              Console.WriteLine($"{Name}이(가) 마법으로 공격합니다!");
          }
      }
      
      // 메인 프로그램
      public class Program
      {
          public static void Main(string[] args)
          {
              Character warrior = new Warrior { Name = "전사", Health = 100 };
              Character mage = new Mage { Name = "마법사", Health = 80 };
      
              warrior.Attack();
              mage.Attack();
          }
      }

      실행 결과:

      전사가(가) 검으로 공격합니다!
      마법사가(가) 마법으로 공격합니다!

      5. 흔한 실수와 주의사항

      실수 1: 클래스와 객체의 혼동

    • 잘못된 코드:
    • Car myCar = Car(); // 잘못된 인스턴스 생성
    • 올바른 코드:
    • Car myCar = new Car(); // 올바른 인스턴스 생성

      실수 2: 접근 제어자 설정 실수

    • 잘못된 코드:
    • public class Product
      {
          string Name; // 접근 제어자가 없어서 외부에서 접근 불가
      }
    • 올바른 코드:
    • public class Product
      {
          public string Name { get; set; } // public으로 설정
      }

      6. 정리

    • 객체 지향 프로그래밍(OOP)은 코드의 재사용성과 유지보수성을 높이는 데 필수적이다.
    • 클래스, 객체, 상속, 다형성은 OOP의 핵심 개념이다.
    • 실무에서는 OOP 원칙을 적용해 복잡한 시스템을 효과적으로 관리할 수 있다.
    • 다음에 학습하면 좋은 주제: OOP의 원칙(SOLID), 디자인 패턴, 인터페이스와 추상 클래스.