공부 기록/C#

[C#] 기초 문법 톺아보기 (2) - 클래스, 상속, 인터페이스, 추상 클래스, 가상 메서드, 인덱서

톰마토 2025. 1. 9. 15:44
728x90

[ 유니티를 배우기 전, 기초 문법 톺아보기(2) ]

내일배움캠프 사전캠프의 과제를 해결하며 C#과 유니티의 예습을 하고 있다. 유니티를 본격적으로 배워나가기 전에 C# 문법에 익숙해지기에 좋은 시간이었다. 

 

이 글은 달리기반을 학습하는 동안 사용하거나 알게 된 기억하고 싶은 문법들을 정리한 글이다.


목차

1. 클래스

2. 상속

3. 인터페이스

4. 인덱서

5. 추상 클래스 

6. 가상 메서드 


클래스 (Class)

클래스는 객체를 정의하는 데 사용되는 청사진이다. 클래스는 필드메서드를 포함하며 객체의 속성과 동작을 정의한다.

클래스 정의와 사용

namespace Example
{
    class Person
    {
        // 필드(속성)
        public string Name;
        public int Age;

        // 메서드(행동)
        public void Introduce()
        {
            Console.WriteLine($"Hello, I'm {Name} and I am {Age} years old.");
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            // 클래스 사용 예제
            Person person = new Person();
            person.Name = "Yeondoo";
            person.Age = 26;
            person.Introduce();
        }
    }
}

 

상속 (Inheritance)

상속은 한 클래스가 다른 클래스의 특성과 메서드를 물려받는 것을 의미한다. C#은 다중 상속을 지원하지 않는다.

자식 클래스는 부모 클래스의 변수에 접근하거나 메서드를 사용할 수 있다. 접근 범위를 제한하는 것이 접근제한자 이다.

상속 예제

namespace Example
{
    class Animal
    {
        public void Eat()
        {
            Console.WriteLine("Eating...");
        }
    }

    class Dog : Animal
    {
        public void Bark()
        {
            Console.WriteLine("Barking...");
        }
    }

    internal class MyExample
    {
        static void Main()
        {
            // 상속 사용 예제
            Dog dog = new Dog();
            dog.Eat();
            dog.Bark();
        }
    }
}

 

인터페이스 (Interfaces)

인터페이스는 클래스나 구조체가 반드시 구현해야 하는 메서드와 속성을 정의하는 데 사용한다. 인터페이스는 구현을 제공하지 않으며 설계 규격을 정의한다. C#에서는 인터페이스다중 상속할 수 있다. 

구현할 때는 인터페이스의 모든 멤버를 구현해야 한다.

인터페이스 정의와 구현

namespace Example
{
    interface IAnimal
    {
        void MakeSound();
    }

    class Dog : IAnimal
    {
        public void MakeSound()
        {
            Console.WriteLine("Bark");
        }
    }

    internal class MyExample
    {
        static void Main()
        {
            // 인터페이스 사용 예제
            IAnimal animal = new Dog();
            animal.MakeSound();
        }
    }
}

인터페이스의 모든 멤버를 구현? 필드(변수)는 어떻게 구현하라는 걸까?

1. 인터페이스는 필드를 가질 수 없다.

변수를 가질 수 없다.!! 

public interface IExample
{
    string name; // ❌ 컴파일 오류: 인터페이스는 필드를 포함할 수 없습니다.
}

 

2. 속성 구현과 변수를 연결해야 한다.

인터페이스에 속성이 선언되면, 이를 구현하는 클래스는 속성과 연결된 데이터를 저장하기 위해 필드(변수)를 정의해야 한다.

  • 인터페이스 예제
public interface IExample
{
    string Name { get; set; } // 속성 정의
}
  • 클래스 구현 예제
public class ExampleClass : IExample
{
    // 클래스에서 변수(필드)를 정의
    private string _name;

    // 속성을 구현하면서 필드와 연결
    public string Name
    {
        get => _name; 		// 필드 값을 반환
        set => _name = value;	// 필드 값을 설정
    }
}

3. 인터페이스에 포함될 수 있는 멤버 종류

  • 메서드
  • 속성
  • 이벤트
  • 인덱서 

인덱서 (Indexer)

C#에서 인덱서는 객체를 배열처럼 다룰 수 있도록하는 특별한 속성이다.

배열의 인덱스를 사용하는 방식처럼 객체의 데이터에 접근할 수 있다. 인덱서는 클래스, 구조체, 인터페이스 내에서 정의되며 this 키워드를 사용하여 구현된다.

 

기본 구조

public class 클래스이름
{
    private 데이터타입[] 배열 = new 데이터타입[크기];

    public 데이터타입 this[int index]
    {
        get { return 배열[index]; }
        set { 배열[index] = value; }
    }
}

 

 

일반적인 방법으로 객체의 배열에 참조

인덱서가 생소하게 느껴지지만 일반적인 방법과 비교해보니 그나마(?) 설득력있게 느껴졌다.

class Data
{
    public int[] Values = new int[10];
}

Data data = new Data();
data.Values[0] = 10; // 배열을 직접 참조
Console.WriteLine(data.Values[0]); // 출력: 10

인덱서로 배열에 접근

class Data
{
    private int[] values = new int[10];

    public int this[int index]
    {
    	get { return values[index]; }
        set { values[index] = value; }
        //get => values[index];
        //set => values[index] = value;
    }
}

Data data = new Data();
data[0] = 10; // 인덱서를 통해 접근
data[1] = 20; // 인덱서를 통해 접근
Console.WriteLine(data[0]); // 출력: 10

 

(실제로는 인덱서를 많이 사용하는지, 주로 어떤 상황에 사용하는지 궁금해졌다..)

 

추상 클래스 (Abstract Classes)

추상 클래스는 인스턴스화될 수 없고, 상속을 통해서만 사용될 수 있다. 기본 구현과 추상화를 동시에 제공할 수 있다.

추상 메서드를 포함할 수 있다.

  • abstract 키워드 사용 : 클래스 선언에 abstract를 붙여 추상 클래스로 만든다.
  • 추상 멤버 : abstract로 선언된 메서드나 속성은 구현을 제공하지 않는다. 파생 클래스에서 반드시 구현해야 한다.
  • 일반 메서드, 필드, 속성도 포함할 수 있다.
  • 인스턴스화 불가능하다.
public abstract class 클래스이름
{
    // 추상 메서드 (구현 없음)
    public abstract void 추상메서드();

    // 일반 메서드 (구현 있음)
    public void 일반메서드()
    {
        Console.WriteLine("일반 메서드입니다.");
    }
}

 

예제

abstract class Animal
{
    // 일반 속성
    public string Name { get; set; } 
    // 추상 메서드
    public abstract void MakeSound();
}

class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine($"{Name} : Bark");
    }
}

// 추상 클래스 사용 예제
Animal animal = new Dog();
animal.Name = "CuteDog";
animal.MakeSound();

 

가상 메서드 (Virtual Methods)

가상 메서드는 자식 클래스에서 재정의할 수 있는 부모 클래스의 메서드이다.

  • 키워드 : virtual, override
class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("Animal sound");
    }
}

class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Bark");
    }
}

// 가상 메서드 사용 예제
Animal animal = new Dog();
animal.MakeSound();

 

 

 

 


 

다른 글 보러가기

📕사전 문법 기초 보러 가기

 

[C#] 내일배움캠프 사전캠프 - C# 사전 문법 기초 (is, as, Convert, Parse, TryParse, 접근제한자)

[Stage3. 각자 속도에 맞춰 나아가기] Stage3에서는 C# 기초를 다져볼 수 있다. 걷기반과 달리기 반으로 나눠서 단계별 학습이 권장된다.나는 C#을 배우는 것은 처음이기 때문에 걷기반부터 시작해서

ramenkirby.tistory.com

 

📕 C# 기초 문법 톺아보기(1) 보러 가기

 

[C#] 기초 문법 톺아보기 (1) - 입력과 출력, 배열, 필드와 속성

[ 유니티를 배우기 전, 기초 문법 톺아보기(1) ]내일배움캠프 사전캠프의 과제를 해결하며 C#과 유니티의 예습을 하고 있다. 유니티를 본격적으로 배워나가기 전에 C# 문법에 익숙해지기에 좋은

ramenkirby.tistory.com

 

 

 

728x90