C#) 객체지향 프로그래밍
객체지향 프로그래밍(OOP)
Object-Oriented Programming
특징
캡슐화(Encapsulation)
데이터(변수)와 메서드를 하나의 단위(클래스)로 묶고, 외부에서 직접 접근하지 못하도록 제한하는 것.
private 접근제어자를 사용하여 데이터를 보호하고, public 메서드를 통해 접근을 제어해야한다.
using System;
class Person
{
private string name; // 외부에서 직접 접근 불가
public void SetName(string newName)
{
name = newName; // 값 설정
}
public string GetName()
{
return name; // 값 반환
}
}
class Program
{
static void Main()
{
Person p = new Person();
p.SetName("Alice"); // 간접적으로 데이터 변경
Console.WriteLine(p.GetName()); // Alice 출력
}
}
name변수는private으로 설정하여 직접 접근을 차단한다.SetName()과GetName()을 통해 간접적으로 값을 변경하고 가져온다.- 데이터 보호(Data Hiding) 원칙을 적용하여 안전성을 높인다.
상속(Inheritance)
기존 클래스의 기능을 물려받아 새로운 클래스를 만드는 것.
C#에서는 : 연산자를 사용하여 상속을 구현.
using System;
class Animal // 부모 클래스 (기본 기능 제공)
{
public void Eat()
{
Console.WriteLine("동물이 먹는다.");
}
}
// Dog 클래스가 Animal 클래스를 상속받음
class Dog : Animal
{
public void Bark()
{
Console.WriteLine("개가 짖는다.");
}
}
class Program
{
static void Main()
{
Dog dog = new Dog();
dog.Eat(); // 상속받은 메서드 사용
dog.Bark(); // 자체 메서드 사용
}
}
Dog클래스는Animal클래스를 상속 받았기 때문에Eat()메서드를 직접 호출 가능하다.- 코드 재사용성을 높여 중복 코드를 줄일 수 있다.
다형성(Polymorphism)
같은 인터페이스 또는 같은 부모 클래스를 공유하는 객체가 서로 다른 동작을 수행할 수 있도록 하는 것.
오버라이딩(Overriding)과 오버로딩(Overloading)으로 구현된다.
메서드 오버라이딩
-
부모 클래스의 메서드를 자식 클래스에서 재정의하는 것.
-
C#에서는
virtual과override키워드를 사용한다.
using System;
class Animal
{
public virtual void MakeSound() // 부모 클래스의 메서드 (virtual)
{
Console.WriteLine("동물이 소리를 낸다.");
}
}
class Dog : Animal
{
public override void MakeSound() // 오버라이딩
{
Console.WriteLine("멍멍!");
}
}
class Cat : Animal
{
public override void MakeSound() // 오버라이딩
{
Console.WriteLine("야옹!");
}
}
class Program
{
static void Main()
{
Animal myAnimal = new Dog(); // 부모 타입으로 참조
myAnimal.MakeSound(); // "멍멍!" (자식 클래스의 메서드 호출)
myAnimal = new Cat();
myAnimal.MakeSound(); // "야옹!" (자식 클래스의 메서드 호출)
}
}
virtual키워드로 부모 클래스의 메서드를 선언한다.override키워드로 자식 클래스에서 부모의 메서드를 재정의한다.- 런타임 다형성(동적 바인딩)이 적용된다.
메서드 오버로딩
같은 이름의 메서드를 매개변수의 개수나 타입을 다르게 하여 여러 개 정의 하는 것이다.
using System;
class MathOperations
{
public int Add(int a, int b)
{
return a + b;
}
public double Add(double a, double b)
{
return a + b;
}
public int Add(int a, int b, int c)
{
return a + b + c;
}
}
class Program
{
static void Main()
{
MathOperations math = new MathOperations();
Console.WriteLine(math.Add(3, 4)); // 7
Console.WriteLine(math.Add(2.5, 3.5)); // 6.0
Console.WriteLine(math.Add(1, 2, 3)); // 6
}
}
- 같은 이름의 메서드를 다른 매개변수 형식이나 개수로 선언 가능하다.
- 컴파일 타임 다형성(정적 바인딩)이 적용된다.
추상화(Abstraction)
불필요한 세부 정보를 숨기고, 필요한 기능만 제공하는 것.
C#에서는 abstract 키워드를 사용하여 추상 클래스를 만들 수 있다.
using System;
// 추상 클래스
abstract class Animal
{
public abstract void MakeSound(); // 추상 메서드 (구현 없음)
public void Sleep() // 일반 메서드 (구현 있음)
{
Console.WriteLine("동물이 잠잔다.");
}
}
// Dog 클래스는 Animal을 상속받아 반드시 MakeSound()를 구현해야 함
class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("멍멍!");
}
}
class Program
{
static void Main()
{
Dog dog = new Dog();
dog.MakeSound(); // "멍멍!"
dog.Sleep(); // "동물이 잠잔다."
}
}
abstract class는 인스턴스를 만들 수 없다.abstract method는 자식 클래스에서 반드시override하여 구현해야 한다.- 인터페이스와 다르게, 추상 클래스는 일반 메서드(구현된 메서드)도 포함 가능하다.
댓글남기기