학습
C# 객체 지향 프로그래밍(OOP) 심화
C# 객체 지향 프로그래밍(OOP) 심화 — 중급
객체 지향 프로그래밍(OOP) 심화
1. 도입 (왜 배워야 하는가)
객체 지향 프로그래밍(OOP)은 현대 소프트웨어 개발에서 필수적인 패러다임입니다. OOP를 잘 활용하면 코드의 재사용성을 높이고, 유지보수성을 향상시키며, 협업 시에 이해도를 높일 수 있습니다. 실무에서는 복잡한 시스템을 구성하기 위해 객체 지향의 원칙을 적용해야 합니다. 만약 OOP를 모른다면, 코드가 복잡해지고 중복이 발생하며, 수정시 다른 부분에 영향을 미칠 수 있어 시스템의 안정성을 해칠 수 있습니다. 이는 결국 개발 기간을 늘리고, 비용을 상승시키는 결과를 초래할 수 있습니다.
2. 핵심 개념 설명
객체 지향 프로그래밍의 주요 개념은 다음과 같습니다:
- 클래스 (Class): 객체를 생성하기 위한 설계도. 예를 들어, "자동차"라는 클래스를 만들면, 이 클래스에서 "차량의 색상", "모델", "속도"와 같은 속성을 정의할 수 있습니다.
- 객체 (Object): 클래스의 인스턴스. 예를 들어 "내 차"라는 객체는 "자동차" 클래스의 인스턴스입니다.
- 상속 (Inheritance): 기존 클래스를 기반으로 새로운 클래스를 만드는 것. 예를 들어, "전기차"는 "자동차" 클래스를 상속받아 "배터리 용량" 속성을 추가할 수 있습니다.
- 다형성 (Polymorphism): 같은 인터페이스를 사용해 서로 다른 데이터 타입의 객체를 처리할 수 있는 능력. 예를 들어, "동물" 클래스를 상속하는 "개"와 "고양이" 클래스는 모두 "소리내기" 메소드를 가질 수 있지만, 각기 다른 방식으로 구현할 수 있습니다.
public class Car: Car라는 클래스를 정의합니다.public string Color { get; set; }: 색상 속성을 정의합니다.public void DisplayInfo(): 차량의 정보를 출력하는 메소드를 정의합니다.Car myCar = new Car();: Car 클래스의 객체 myCar를 생성합니다.myCar.Color = "파랑";: myCar 객체의 색상을 "파랑"으로 설정합니다.myCar.DisplayInfo();: 차량 정보를 출력합니다.- 잘못된 코드:
- 올바른 코드:
- 잘못된 코드:
- 올바른 코드:
- 객체 지향 프로그래밍(OOP)은 코드의 재사용성과 유지보수성을 높이는 데 필수적이다.
- 클래스, 객체, 상속, 다형성은 OOP의 핵심 개념이다.
- 실무에서는 OOP 원칙을 적용해 복잡한 시스템을 효과적으로 관리할 수 있다.
- 다음에 학습하면 좋은 주제: OOP의 원칙(SOLID), 디자인 패턴, 인터페이스와 추상 클래스.
| 용어 | 설명 |
|---|---|
| 클래스 | 객체를 정의하는 틀 |
| 객체 | 클래스의 인스턴스 |
| 상속 | 기존 클래스를 통해 새로운 클래스 생성 |
| 다형성 | 동일한 인터페이스로 다양한 객체 처리 |
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(); // 차량 정보 출력
}
}
실행 결과:
차량 모델: 현대 제네시스, 색상: 파랑
코드 설명:
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으로 설정
}