C# - κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°(OOP) + ν΄λμ€μ κ°μ²΄ + μμκ³Ό λ€νμ±
|2025. 7. 7. 17:11
λ°μν
π§± ν΄λμ€μ κ°μ²΄μ ν΅μ¬ κ°λ μ 리
π κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°(OOP)μ 4κ°μ§ ν΅μ¬ μμΉ
- μΊ‘μν(Encapsulation)
κ΄λ ¨λ λ°μ΄ν°μ κΈ°λ₯μ νλμ λ¨μλ‘ λ¬Άκ³ μΈλΆλ‘λΆν° μ¨κΈ΄λ€. νλμ λ©μλλ₯Ό ν΄λμ€ λ΄λΆμ κ°μΆ° μμ μ±κ³Ό μ μ§λ³΄μμ±μ λμΈλ€. - μμ(Inheritance)
κΈ°μ‘΄ ν΄λμ€μ μμ±κ³Ό κΈ°λ₯μ λ¬Όλ €λ°μ μλ‘μ΄ ν΄λμ€λ₯Ό λ§λ λ€. μ½λμ μ¬μ¬μ©μ±μ λμ΄κ³ κ³μΈ΅μ μΈ μ€κ³λ₯Ό κ°λ₯νκ² νλ€. - λ€νμ±(Polymorphism)
κ°μ μ΄λ¦μ λ©μλκ° λ€μν λ°©μμΌλ‘ λμν μ μλλ‘ νλ€. μ€λ²λΌμ΄λ©κ³Ό μ€λ²λ‘λ©μ ν΅ν΄ μ μ°ν μ½λ ꡬνμ΄ κ°λ₯νλ€. - μΆμν(Abstraction)
λΆνμν μΈλΆ μ¬νμ μ¨κΈ°κ³ ν΅μ¬ κΈ°λ₯λ§ λ ΈμΆνλ€. μ¬μ©μ μ μ₯μμ νμν μ λ³΄λ§ μ κ³΅ν΄ μ½λμ κ°κ²°μ±κ³Ό λͺ νμ±μ λμΈλ€.
π§© ν΄λμ€μ κ°μ²΄
- ν΄λμ€(Class)
κ°μ²΄λ₯Ό λ§λ€κΈ° μν μ€κ³λμ΄λ€. νλ(μμ±)μ λ©μλ(νλ)λ‘ κ΅¬μ±λλ€. μ: λΆμ΄λΉ΅ ν - κ°μ²΄(Object)
ν΄λμ€μ κΈ°λ°ν΄ λ§λ€μ΄μ§ μ€μ²΄μ΄λ€. κ° κ°μ²΄λ λ 립μ μΈ μνλ₯Ό κ°μ§λ€. μ: λΆμ΄λΉ΅
π οΈ ν΄λμ€μ κ΅¬μ± μμ
- νλ (Field): κ°μ²΄μ λ°μ΄ν°λ₯Ό μ μ₯νλ λ³μ
- λ©μλ (Method): κ°μ²΄κ° μννλ λμ
- μμ±μ (Constructor): κ°μ²΄λ₯Ό μ΄κΈ°νν λ μ€νλλ νΉμ λ©μλ
- μλ©Έμ (Destructor): κ°μ²΄κ° μλ©Έλ λ νΈμΆλλ νΉμ λ©μλ
π§± ν΄λμ€ μ μΈκ³Ό μΈμ€ν΄μ€ μμ±
class Person
{
public string Name;
public int Age;
public void PrintInfo()
{
Console.WriteLine("Name: " + Name);
Console.WriteLine("Age: " + Age);
}
}
// μΈμ€ν΄μ€ μμ±
Person p = new Person();
p.Name = "John";
p.Age = 30;
p.PrintInfo();
π§Ύ ν΄λμ€ vs ꡬ쑰체
νλͺ© | ν΄λμ€ | ꡬ쑰체 |
νμ | μ°Έμ‘°ν(Reference Type) | κ°ν(Value Type) |
μ μ₯ μμΉ | ν(Heap) | μ€ν(Stack) |
μμ | μ§μν¨ | μ§μνμ§ μμ |
μμ± λ°©μ | new ν€μλ νμ | new μμ΄λ μ¬μ© κ°λ₯ |
μ©λ | 볡μ‘ν λ°μ΄ν° ꡬ쑰 | κ°λ¨ν λ°μ΄ν° μ μ₯ |
π μ κ·Ό μ νμ
- public: μ΄λμλ μ κ·Ό κ°λ₯
- private: ν΄λμ€ λ΄λΆμμλ§ μ κ·Ό κ°λ₯
- protected: ν΄λμ€μ κ·Έ μμ ν΄λμ€μμλ§ μ κ·Ό κ°λ₯
π§ νλ‘νΌν°(Property)
νλμ λν μ κ·Όμ μ μ΄νκ³ μ ν¨μ± κ²μ¬λ₯Ό μΆκ°ν μ μλ λ©μ»€λμ¦.
-
- νλ‘νΌν°λ?
- νλ‘νΌν°λ ν΄λμ€ λ©€λ²λ‘μ, κ°μ²΄μ νλ κ°μ μ½κ±°λ μ€μ νλλ° μ¬μ©λλ μ κ·Όμ(Accessor) λ©μλμ μ‘°ν©μ λλ€.
- κ°μ²΄μ νλμ μ§μ μ κ·Όνμ§ μκ³ , κ°μ μ μΌλ‘ κ°μ μ€μ νκ±°λ μ½μ μ μλλ‘ ν©λλ€.
- νλμ λν μ κ·Ό μ μ΄μ λ°μ΄ν° μ ν¨μ± κ²μ¬ λ±μ μνν μ μμ΅λλ€.
- νλ‘νΌν°λ νλμ λ§μ°¬κ°μ§λ‘ κ°μ²΄μ μνλ₯Ό λνλ΄λ λ°μ΄ν° μν μ νμ§λ§, μΈλΆμμ μ κ·Όν λ μΆκ°μ μΈ λ‘μ§μ μνν μ μμ΅λλ€.
-
- νλ‘νΌν° ꡬ문
- νλ‘νΌν°λ getκ³Ό set μ κ·Όμλ₯Ό μ¬μ©νμ¬ κ°μ μ½κ³ μ€μ νλ λμμ μ μν©λλ€.
- get μ κ·Όμλ νλ‘νΌν°μ κ°μ λ°ννκ³ , set μ κ·Όμλ νλ‘νΌν°μ κ°μ μ€μ ν©λλ€.
- νμμ λ°λΌ get λλ set μ κ·Όμ μ€ νλλ₯Ό μλ΅νμ¬ μ½κΈ° μ μ© λλ μ°κΈ° μ μ© νλ‘νΌν°λ₯Ό μ μν μ μμ΅λλ€.
[μ κ·Ό μ νμ] [λ°μ΄ν° νμ
] νλ‘νΌν°λͺ
{
get
{
// νλλ₯Ό λ°ννκ±°λ λ€λ₯Έ λ‘μ§ μν
}
set
{
// νλμ κ°μ μ€μ νκ±°λ λ€λ₯Έ λ‘μ§ μν
}
}
- νλ‘νΌν° μ¬μ© μμ
- λ€μμ Player ν΄λμ€μ μ΄λ¦κ³Ό λ 벨μ λνλ΄λ nameκ³Ό level νλλ₯Ό μΊ‘μνν νλ‘νΌν°μ μμ.
class Person
{
private string name;
private int age;
public string Name
{
get { return name; }
set { name = value; }
}
public int Age
{
get { return age; }
set { age = value; }
}
}
Person person = new Person();
person.Name = "John"; // Name νλ‘νΌν°μ κ° μ€μ
person.Age = 25; // Age νλ‘νΌν°μ κ° μ€μ
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}"); // Nameκ³Ό Age
νλ‘νΌν° μ κ·Ό μ νμ μ μ© & μ ν¨μ± κ²μ¬ μμ
class Person
{
private string name;
private int age;
public string Name
{
get { return name; }
private set { name = value; }
}
public int Age
{
get { return age; }
set
{
if (value >= 0)
age = value;
}
}
}
Person person = new Person();
person.Name = "John"; // μ»΄νμΌ μ€λ₯: Name νλ‘νΌν°μ set μ κ·Όμλ privateμ
λλ€.
person.Age = -10; // μ ν¨μ± κ²μ¬μ μν΄ λμ΄ κ°μ΄ μ€μ λμ§ μμ΅λλ€.
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}"); // Nameκ³Ό Age νλ‘νΌν°μ μ κ·Όνμ¬ κ°μ μΆλ ₯ν©λλ€.
- μλ νλ‘νΌν° (Auto Property)
- μλ νλ‘νΌν°λ νλ‘νΌν°λ₯Ό κ°λ¨νκ² μ μνκ³ μ¬μ©ν μ μλ νΈλ¦¬ν κΈ°λ₯μ λλ€.
- νλμ μ μΈκ³Ό μ κ·Όμ λ©μλμ ꡬνμ μ»΄νμΌλ¬κ° μλμΌλ‘ μ²λ¦¬νμ¬ κ°λ°μκ° κ°λ¨ν ꡬ문μΌλ‘ νλ‘νΌν°λ₯Ό μ μν μ μμ΅λλ€.
[μ κ·Ό μ νμ] [λ°μ΄ν° νμ
] νλ‘νΌν°λͺ
{ get; set; }
μλλ μλ νλ‘νΌν°λ₯Ό μ¬μ©ν μμ.
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Person person = new Person();
person.Name = "John"; // κ°μ μ€μ
person.Age = 25; // κ°μ μ€μ
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}"); // κ°μ μ½μ΄ μΆλ ₯
Tip
- ν΄λμ€μ κ°μ²΄λ₯Ό μ¬μ©νμ¬ νλ‘κ·Έλ¨μ μμ±ν λ, κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°(OOP)μ μμΉμ μ§ν€λλ‘ λ Έλ ₯ν΄μΌ ν©λλ€. μΊ‘μν, μμκ΄κ³, λ€νμ± λ± OOP κ°λ μ μ΄ν΄νκ³ νμ©νμ¬ μ μ§λ³΄μμ±μ΄ λκ³ μ¬μ¬μ© κ°λ₯ν μ½λλ₯Ό μμ±ν μ μμ΅λλ€.
- Propertiesλ₯Ό μ¬μ©νμ¬ νλ μ κ·Όμ μ μ΄νλ©΄, μ½λμ μμ μ±κ³Ό κ°λ μ±μ λμΌ μ μμ΅λλ€.
- ν΄λμ€μ μ κ·Ό μ νμλ₯Ό μ μ ν μ¬μ©νμ¬ νμν λΆλΆλ§ μΈλΆμμ μ κ·Ό κ°λ₯νλλ‘ μ€μ νλ κ²μ΄ μ’μ΅λλ€.
π‘ μμ±μμ μλ©Έμ
- μμ±μ: κ°μ²΄ μμ± μ μλ μ€ν. μ΄κΈ°ν μμ
μν.
μ€λ²λ‘λ©μ ν΅ν΄ λ€μν λ°©μμΌλ‘ κ°μ²΄ μ΄κΈ°ν κ°λ₯. - μλ©Έμ: κ°μ²΄κ° μλ©Έλ λ μλ νΈμΆ. 리μμ€ ν΄μ λ±μ μμ μν.
𧬠μμκ³Ό λ€νμ±μ ν΅μ¬ μ΄ν΄
π§Ύ μμ(Inheritance)
- μ μ
κΈ°μ‘΄ ν΄λμ€(λΆλͺ¨ ν΄λμ€)μ μμ±κ³Ό κΈ°λ₯μ μλ‘μ΄ ν΄λμ€(μμ ν΄λμ€)κ° λ¬Όλ €λ°λ κ°λ μ΄λ€. - μ₯μ
- μ½λ μ¬μ¬μ©μ± ν₯μ
- κ³μΈ΅μ ꡬ쑰 νμ±
- μ μ§λ³΄μ μ©μ΄
- νΉμ§
- C#μ λ¨μΌ μμλ§ μ§μ
- μΈν°νμ΄μ€λ₯Ό ν΅ν΄ λ€μ€ μμ ν¨κ³Ό ꡬν κ°λ₯
- λΆλͺ¨ ν΄λμ€μ public λ° protected λ©€λ²λ μμ ν΄λμ€μμ μ κ·Ό κ°λ₯
- λ©μλλ μ¬μ μ(Override)νμ¬ μλ‘μ΄ λμ ꡬν κ°λ₯
- κΈ°λ³Έ μμ
class Animal
{
public void Eat() => Console.WriteLine("λ¨Ήλλ€");
}
class Dog : Animal
{
public void Bark() => Console.WriteLine("μ§λλ€");
}
Dog dog = new Dog();
dog.Eat(); // μμλ λ©μλ
dog.Bark(); // μμ ν΄λμ€ κ³ μ λ©μλ
π λ€νμ±(Polymorphism)
- μ μ
λμΌν μΈν°νμ΄μ€λ₯Ό ν΅ν΄ μ¬λ¬ ν΄λμ€κ° λ€μν λ°©μμΌλ‘ λμνλλ‘ λ§λλ κ°μ²΄μ§ν₯ μμΉμ΄λ€. - μ’
λ₯
- μ€λ²λ‘λ©(Overloading): κ°μ μ΄λ¦, λ€λ₯Έ λ§€κ°λ³μμ λ©μλλ₯Ό μ¬λ¬ κ° μ μ
- μ€λ²λΌμ΄λ©(Overriding): λΆλͺ¨ ν΄λμ€μ λ©μλλ₯Ό μμ ν΄λμ€κ° μ¬μ μνμ¬ μ€ν λ΄μ© λ³κ²½
π μ€λ²λΌμ΄λ©κ³Ό virtual / override ν€μλ
- virtual: λΆλͺ¨ ν΄λμ€μμ ν΄λΉ λ©μλκ° μ€λ²λΌμ΄λ© κ°λ₯νλ€κ³ λͺ μ
- override: μμ ν΄λμ€μμ λΆλͺ¨μ virtual λ©μλλ₯Ό μ¬μ μν λ μ¬μ©
class Unit
{
public virtual void Move() => Console.WriteLine("λ λ°λ‘ κ±·κΈ°");
}
class Zergling : Unit
{
public override void Move() => Console.WriteLine("λ€ λ°λ‘ κ±·κΈ°");
}
- μ€ν μμ
List<Unit> units = new List<Unit>();
units.Add(new Unit());
units.Add(new Zergling());
foreach (Unit unit in units)
{
unit.Move(); // κ°κ° λ€λ₯΄κ² μΆλ ₯λ¨
}
π§° μΆμ ν΄λμ€μ μΆμ λ©μλ
- μΆμ ν΄λμ€ (abstract class)
μ§μ κ°μ²΄λ₯Ό λ§λ€ μ μκ³ , λ°λμ μμλ°μ ꡬνν΄μΌ νλ ν΄λμ€ - μΆμ λ©μλ (abstract method)
λ³Έλ¬Έ μμ΄ μ μΈλ§ μ‘΄μ¬νλ©°, μμ ν΄λμ€κ° λ°λμ μ€λ²λΌμ΄λ©ν΄μΌ ν¨
abstract class Shape
{
public abstract void Draw();
}
class Circle : Shape
{
public override void Draw() => Console.WriteLine("μμ κ·Έλ¦°λ€");
}
- μ¬μ© μ
List<Shape> shapes = new List<Shape> { new Circle(), new Square(), new Triangle() };
foreach (Shape shape in shapes)
{
shape.Draw(); // κ°κ°μ λνμ λ§κ² λμ
}
π μ€λ²λ‘λ©κ³Ό μ€λ²λΌμ΄λ© λΉκ΅
κ΅¬λΆ | μ€λ²λ‘λ©(Overloading) | μ€λ²λΌμ΄λ©(Overriding) |
μ μ | κ°μ μ΄λ¦, λ€λ₯Έ λ§€κ°λ³μ | λΆλͺ¨ λ©μλ μ¬μ μ |
μμ | νμ μμ | λ°λμ μμ κ΄κ³ νμ |
ν€μλ | μμ | virtual, override μ¬μ© |
μμ |
// μ€λ²λ‘λ©
int Add(int a, int b) => a + b;
int Add(int a, int b, int c) => a + b + c;
// μ€λ²λΌμ΄λ©
public class Shape
{
public virtual void Draw() => Console.WriteLine("λν 그리기");
}
public class Circle : Shape
{
public override void Draw() => Console.WriteLine("μ 그리기");
}
λ°μν