[C# 시작 전 필수] 객체지향(OOP)의 4대 특징 (feat.캡슐화, 상속, 다형성,추상화)

2025. 3. 15. 01:41programming/C#

1. 캡슐화(Encapsulation): 주 목적은 '데이터 은닉'이다. 민감한 데이터를 private로 감춰서 public의 setter, getter 메소드로만 private로 감춘 데이터에 접근&변경할 수 있다. 즉, read-only, write-only한 선택적 접근을 제어할 수 있게 된다.        ==> public보다 보안성이 증가, 민감한 데이터 안전하게 컨트롤

class 은행계좌 {
    private int 잔액; // 외부에서 접근할 수 없게 private으로 설정

    public void 입금(int 금액) {
        잔액 += 금액; // 입금 기능은 제공하지만, 잔액은 직접 수정할 수 없게 함
    }

    public void 출금(int 금액) {
        if (잔액 >= 금액) {
            잔액 -= 금액;
        } else {
            Console.WriteLine("잔액이 부족합니다.");
        }
    }

    public int 잔액조회() {
        return 잔액; // 잔액을 조회할 수만 있도록 함
    }
}

- 잔액 필드는 private으로 숨겨서 외부에서 직접 접근할 수 없다. / 입금, 출금, 잔액조회 메서드를 통해서만 접근할 수 있다.

 

2. 상속(Inheritance): "기존 클래스를 바탕으로 새로운 클래스를 만드는 것"으로, 부모 클래스(기존 클래스)의 속성과 메서드를 자식 클래스(새로운 클래스)가 물려받아 재사용하거나, 필요에 따라 오버라이딩할 수 있습니다. 중복 코드를 줄이고, 코드의 재사용성을 높일 수 있다.

class 동물 {
    public void 먹다() {
        Console.WriteLine("먹고 있어요.");
    }
}

class 개 : 동물 {
    public void 짖다() {
        Console.WriteLine("멍멍!");
    }
}

class 고양이 : 동물 {
    public void 야옹하다() {
        Console.WriteLine("야옹!");
    }
}

 

  • 부모 클래스(Parent Class) = 슈퍼클래스(Superclass)
  • 자식 클래스(Child Class) = 서브클래스(Subclass)

보통 "슈퍼클래스", "서브클래스"라는 용어를 많이 쓴다고 함.

 

 

3.다형성(Polymorphism): "하나의 인터페이스로 여러 가지 구현을 할 수 있다". 쉽게 말하면, 같은 이름의 메서드나 클래스가 각 슈퍼 클래스마다 다르게 동작할 수 있다는 거죠. 상속받은 메소드를 동일하게 호출하여 다른 작업을 수행할 수 있게 함. 예를 들어, 동물이라는 클래스가 있을 때, 울다()라는 메서드를 정의하고, 이 메서드는 고양이와 개에서 다르게 동작할 수 있음.

class 동물 {
    public virtual void 울다() {
        Console.WriteLine("동물이 울어요!");
    }
}

class 개 : 동물 { //개가 동물을 상속받음
    public override void 울다() {
        Console.WriteLine("멍멍!"); //동물의 울다 메소드
    }
}

class 고양이 : 동물 { //고양이가 동물을 상속받음
    public override void 울다() {
        Console.WriteLine("야옹!"); //동물의 울다 메소드
    }
}

 class Program
    {
        static void Main(String[] args)
        {
            동물 animal = new 동물();
            개 dog = new 개();
            고양이 cat = new cat();
            
            animal.울다(); //동물이 울어요!
            dog.울다(); // 멍멍!
            cat.울다(); // 야옹!
        } 
    }



//동물의 '울다 메소드'가 각 하위 클래스에서 다르게 작동 
//개에서는 '멍멍!', 고양이에서는 '야옹!'을 출력

** virtual 키워드는 부모 클래스의 메서드가 자식 클래스에서 override를 통해 재정의될 수 있도록 허용하는 역할을 합니다. 만약 virtual이 없다면 부모 클래스의 메서드는 기본적으로 override할 수 없다.
즉, 메서드를 자식 클래스에서 변경할 수 있도록 하려면 virtual을 붙여야 함!

**override는 부모 클래스에서 정의된 메서드를 자식 클래스에서 새롭게 구현(재정의)하는 것을 의미하는 키워드

**만약 override 없이 그냥 같은 이름의 메서드를 만든다면, 부모 클래스의 메서드를 덮어쓰는 것이 아니라, 새로운 메서드가 추가되는 것이라서 다형성이 적용되지 않는다.

 

4. 추상화(Abstraction): 추상화는 "복잡한 구현을 숨기고, 필요한 기능만 제공하는 것". 즉, 사용자가 객체를 다룰 때 복잡한 세부 사항은 몰라도 되고, 필요한 부분만 알면 되도록. 보통 abstract 클래스를 사용해 기능을 미리 정의하고, 실제 구현은 상속받은 클래스에서 override 합니다.

abstract class 동물 {
    public abstract void 울다(); // 울다 메서드는 구체적인 구현 없이 정의만 해놓음
}

class 개 : 동물 {
    public override void 울다() {
        Console.WriteLine("멍멍!"); //울다 메서드의 구체적인 기능 내용은 서브 클래스에서 정의
    }
}

class 고양이 : 동물 {
    public override void 울다() {
        Console.WriteLine("야옹!"); //울다 메서드의 구체적인 기능 내용은 서브 클래스에서 정의
    }
}

동물 클래스는 울다() 메서드를 추상화해 놓았고, 구체적인 울음소리는 개나 고양이 클래스에서 구현.