객체지향 프로그래밍(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#에서는 virtualoverride 키워드를 사용한다.

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하여 구현해야 한다.
  • 인터페이스와 다르게, 추상 클래스는 일반 메서드(구현된 메서드)도 포함 가능하다.

태그: ,

카테고리:

업데이트:

댓글남기기