C# 중급 문법 (1) : 클래스, 추상화, 인스턴스화

안녕하세요! C#의 기본 문법을 익히고 변수, 조건문, 반복문, 함수 등의 개념에 익숙해지셨다면, 이제 C#의 진정한 강력함이자 현대 프로그래밍의 핵심 패러다임인 객체 지향 프로그래밍(OOP)의 세계로 들어설 준비가 되었습니다.

그 첫걸음으로, 객체 지향의 가장 기본이 되는 개념인 클래스(Class), 그리고 클래스를 이해하는 데 필수적인 추상화(Abstraction)인스턴스화(Instantiation)에 대해 자세히 알아보겠습니다. 이 세 가지 개념은 마치 삼위일체처럼 연결되어 있으니, 차근차근 따라와 주세요!

 


1. 클래스(Class): '무엇인가'를 정의하는 설계도 

우리 주변의 모든 사물은 각자의 특성과 행동을 가지고 있습니다. 예를 들어 '자동차'를 생각해봅시다. 자동차는 '색상', '모델명', '최고 속도' 같은 특성(데이터)을 가지고 있고, '가속한다', '정지한다', '좌회전한다' 같은 행동(기능)을 할 수 있습니다.

프로그래밍에서 이처럼 특정 종류의 '무엇인가'를 정의하고, 그것이 가질 수 있는 데이터(속성)행동(메서드)을 묶어 놓은 것이 바로 클래스(Class)입니다.

  • 클래스 = (속성, 필드) + (메서드, 함수)

클래스는 그 자체로 실제 자동차가 아니라, 자동차를 만들기 위한 '설계도' 또는 '틀'에 비유할 수 있습니다. 설계도만으로는 실제 자동차를 운전할 수 없죠?

 

예시 (C#에서 Car 클래스 정의)

// Car라는 '설계도'를 정의합니다.
public class Car
{
    // 1. 속성 (데이터): 자동차가 가질 수 있는 특징들을 정의합니다.
    public string Model { get; set; } // 모델명 (읽고 쓸 수 있음)
    public string Color { get; set; } // 색상
    public int MaxSpeed { get; set; } // 최고 속도
    public int CurrentSpeed;         // 현재 속도 (필드로 직접 접근)

    // 2. 생성자 (Constructor): 클래스의 '인스턴스'를 만들 때 호출되는 특별한 메서드
    public Car(string model, string color, int maxSpeed)
    {
        Model = model;
        Color = color;
        MaxSpeed = maxSpeed;
        CurrentSpeed = 0; // 초기 속도는 0으로 설정
    }

    // 3. 메서드 (행동): 자동차가 할 수 있는 동작들을 정의합니다.
    public void Accelerate(int amount) // 가속하는 행동
    {
        CurrentSpeed += amount;
        if (CurrentSpeed > MaxSpeed)
        {
            CurrentSpeed = MaxSpeed;
        }
        Console.WriteLine($"{Color} {Model}이(가) {amount}만큼 가속하여 현재 속도: {CurrentSpeed}km/h");
    }

    public void Brake() // 정지하는 행동
    {
        CurrentSpeed = 0;
        Console.WriteLine($"{Color} {Model}이(가) 정지했습니다.");
    }

    public void Turn(string direction) // 회전하는 행동
    {
        Console.WriteLine($"{Color} {Model}이(가) {direction}으로 회전합니다.");
    }
}

위 코드에서 Car 클래스는 Model, Color, MaxSpeed와 같은 속성과 Accelerate, Brake, Turn과 같은 메서드(함수)를 가지고 있습니다.


2. 추상화(Abstraction): 복잡한 것을 단순하게 표현하기 

추상화는 객체 지향 프로그래밍의 핵심 원칙 중 하나로, 복잡한 시스템이나 객체의 세부적인 구현 내용은 숨기고, 사용자에게 필요한 핵심적인 정보와 기능만 노출하는 과정을 의미합니다.

다시 자동차 비유로 돌아가 볼까요? 우리가 자동차를 운전할 때, 엔진이 어떻게 작동하는지, 연료가 어떻게 연소되는지, 변속기가 어떻게 맞물리는지 등 복잡한 내부 메커니즘을 모두 알 필요는 없습니다. 우리는 그저 '액셀을 밟으면 가속하고', '브레이크를 밟으면 정지한다'는 핵심적인 인터페이스(사용 방법)만 알면 됩니다.

클래스를 설계할 때, 추상화는 다음과 같은 방식으로 적용됩니다:

  • 속성 정의: 자동차의 '색상'은 중요하지만, 그 색상이 RGB 값으로 어떻게 표현되는지 사용자는 알 필요가 없습니다. Color라는 속성으로 추상화합니다.
  • 메서드 정의: Accelerate() 메서드를 호출할 때, 내부적으로 엔진의 RPM이 얼마나 올라가고 연료 분사량이 어떻게 조절되는지 사용자는 알 필요가 없습니다. 그저 Accelerate(10)이라고 호출하면 속도가 10만큼 올라간다는 '행동'만 노출합니다.

추상화는 시스템의 복잡성을 관리하고, 코드의 유지보수성재사용성을 높이는 데 기여합니다.


3. 인스턴스화(Instantiation): 설계도로 '실제 사물' 만들기 

클래스가 자동차의 '설계도'라면, 인스턴스화는 이 설계도를 바탕으로 실제 자동차를 만들어내는 과정을 의미합니다. 이렇게 설계도(클래스)를 통해 만들어진 실제 사물 하나하나를 객체(Object) 또는 인스턴스(Instance)라고 부릅니다.

클래스는 단지 '형태'를 정의할 뿐이고, 실제 메모리에 할당되어 사용되는 것은 인스턴스입니다. 하나의 클래스로부터 여러 개의 독립적인 인스턴스를 만들 수 있습니다.

예시 (C#에서 Car 클래스를 인스턴스화하기):

public class Program
{
    public static void Main(string[] args)
    {
        // Car 클래스의 '인스턴스'를 생성합니다.
        // new Car(...)는 Car 클래스의 생성자를 호출하여 메모리에 실제 Car 객체를 만듭니다.

        Car myCar = new Car("아반떼", "흰색", 180); // 첫 번째 Car 인스턴스
        Car yourCar = new Car("소나타", "검은색", 200); // 두 번째 Car 인스턴스
        Car taxi = new Car("K5", "노란색", 160);      // 세 번째 Car 인스턴스

        // 각 인스턴스는 독립적인 속성 값과 행동을 가집니다.
        Console.WriteLine($"내 차: {myCar.Color} {myCar.Model}, 최고 속도: {myCar.MaxSpeed}");
        Console.WriteLine($"네 차: {yourCar.Color} {yourCar.Model}, 최고 속도: {yourCar.MaxSpeed}");

        myCar.Accelerate(30);   // 내 차만 가속
        yourCar.Turn("오른쪽"); // 네 차만 회전
        taxi.Accelerate(100);   // 택시만 가속

        Console.WriteLine($"현재 내 차 속도: {myCar.CurrentSpeed}km/h");
        Console.WriteLine($"현재 네 차 속도: {yourCar.CurrentSpeed}km/h");
        Console.WriteLine($"현재 택시 속도: {taxi.CurrentSpeed}km/h");
    }
}

위 코드에서 myCar, yourCar, taxi는 모두 Car 클래스의 인스턴스입니다. 이들은 같은 Car 설계도를 바탕으로 만들어졌지만, 각각 고유한 Model, Color, MaxSpeed, CurrentSpeed 값을 가질 수 있으며, 각자 독립적으로 Accelerate(), Brake(), Turn() 등의 행동을 수행할 수 있습니다.


마무리하며: 객체 지향의 기초 다지기! 

클래스, 추상화, 인스턴스화는 객체 지향 프로그래밍을 이해하는 데 있어 가장 기본적인 출발점입니다.

  • 클래스: '무엇인가'를 정의하는 청사진 또는 설계도
  • 추상화: 복잡한 세부사항을 숨기고 핵심적인 것만 보여주는 원리
  • 인스턴스화: 설계도(클래스)를 바탕으로 실제 사물(객체/인스턴스)을 만드는 과정

이 세 가지 개념을 명확히 이해하면, 앞으로 배우게 될 상속, 다형성, 캡슐화와 같은 객체 지향의 더 심화된 개념들도 훨씬 쉽게 받아들일 수 있을 것입니다.

이제 여러분의 C# 프로그램에서도 현실 세계의 사물들을 클래스로 모델링하고, 이를 인스턴스화하여 상호작용하게 만들어 보세요! 이 과정 자체가 객체 지향적 사고를 기르는 데 큰 도움이 될 것입니다.

궁금한 점이 있다면 언제든지 댓글로 질문해주세요!