프로그래밍 언어/C#

구조체(Structure) / 함수 오버로딩(Function Overloading)

gcreators 2024. 8. 29. 17:49

C#에서 구조체란 

사용자 정의 데이터 유형(Data Type)으로 int, double 등과 같은 기본적으로 제공되는 (변수)값 유형이 아닌

새로운 유형, 여러가지 유형을 사용하기위해 사용자가 직접 만들어서 사용하는 값 유형(Value Type)이다.

라는 C에서 배운 구조체와 크게 다르지는 않다.

 

다만 몇가지가 다르고 추가로 알아둬야 할 것들이 있다.

 

C#에서 구조체는 일반적인 변수와 같이 값을 가지는 데이터 형식이며

클래스는 데이터 형식이 아닌 참조 형식 이라는 것이다

이에 대한것은 기억만 해두고 차후 설명을 더 하도록 하겠다.

 

//Point.cs

struct Point
{
    
    //public int x = 100; //구조체는 선언과 동시에 초기화 하는 것이 불가능 하다.
    public int x; //public으로 외부 접근 open

    public int y;
    
    public int Y { get { return y; } set { y = value; } } //get/set형태로 외부의 접근을 일정부분 제한 시킬 수도 있다
}

 구조체는 클래스와는 다르게 선언과 동시에 초기화가 진행될 수 없다.

//Program.cs

class Program
{//구조체(Structure)
	Point ptAlloc = new Point();

	ptAlloc.x = 100;
	Console.WriteLine("({0})", ptAlloc.x);
}

이렇게 동적할당을 진행해주어야 사용이 가능하다.

 

 

//Program.cs
static void Main()
{
    Point pt; //클래스는 안되지만 구조체는 이렇게 선언 가능
    pt.x = 100;
    pt.y = 50;
    Console.WriteLine("({0}, {1})", pt.x, pt.Y);//초기화가 되어있는 변수에만 접근 할 수 있다.
}

일반 변수처럼 값 타입(Value Type)으로의 활용이 가능은 하다

하지만 이는 주소를 저장하는 것이 아니라 값을 저장하는 것이기에

함수(메서드)의 활용에 있어서 좋지 못한 것임을 기억해야 한다.

Point.cs

    public Point()//반환형은 없고 클래스와 똑같은 것을 만들면 생성자
    {
        Console.WriteLine("Point Consturctor Call!");
        x = 0;
        y = 0;//생성자는 선언된 변수들을 다 0으로 만들어준다.
    }

 

C#12버전은 기본 생성자를 통해서 기본적으로 변수들을 자동으로 0으로 초기화 되도록 만들어 놓았다.

혹시나 이전버전을 활용한다면 이를 꼭 기억 해야 한다

특히 unity를 활용한다면 현재 untiy의 경우 C# 9버전을 활용하니 생성자의 활용이 다름을 기억해야한다.

 

Function Overloading(함수 오버로딩)

메소드 명이 똑같은데 매개변수의 타입이나 갯수가 다르면 특정 메소드를 호출 할 수 있도록 해주는 기능

 

//Point.cs

public Point()//반환형은 없고 클래스와 똑같은 것을 만들면 생성자, 
{
    Console.WriteLine("Point Consturctor Call!");
    x = 0;
    y = 0;//생성자는 선언된 변수들을 다 0으로 만들어준다.
}

 //C++부터는 함수명을 똑같은 것을 지정할 수 있다 -> 매개변수의 타입이나 갯수가 달라야 가능함
public Point(int _x, int _y)
{
    Console.WriteLine("Point Overload Constructor Call!");
    x = _x;
    this.y = _y; 
    // this : 나 자신을 의미함, 연산자 오버로딩시 나 자신을 반환 해야 할 때가 있다.
    //ex) int c = a+b와 a+=b 는 값은 같아도 의미가 다르다. a를 반환 해야 할 때가 있다.
}

public Point(Point _pt)
{
    Console.WriteLine("Point Copy Constructor Call!");

    x = _pt.x;
    y = _pt.y;
}
//Program.cs
static void Main()
{
        Point copyPt = new Point(ptAlloc);
        Console.WriteLine("Copy: ({0}, {1})", copyPt.x, copyPt.y);

        Point copy = new Point();
        copy = copyPt;
}

모두 메소드의 이름은 Point이지만 매개변수의 차이에 따른 결과의 차이를 확인 할 수 있다.

 

연산자 오버로딩(Operator Overloading)

Point.cs

public static Point operator +(Point _pt1, Point _pt2) 
{
    Console.WriteLine("Point Operator Line + Call!");

    return new Point
    (
        _pt1.x + _pt2.x,
        _pt1.y + _pt2.y
    );
}
//Program.cs
static void Main()
{        
        Point result = copyPt + copy;
        Console.WriteLine("result: ({0}, {1})", result.x, result.y);
}

 

* C#은 C++에 비해 오버로딩이 가능한 연산자가 1/3도 안된다

* c++은 거의 모든 연산자를 다 오버로딩 할 수 있다. 동적할당까지도 오버로딩이 가능하다