F.R.I.D.A.Y.

C# - 구조체와 클래스 본문

DEV/.Net

C# - 구조체와 클래스

F.R.I.D.A.Y. 2021. 5. 28. 18:05
반응형

 구조체와 클래스


데이터 전달 방식

 구조체와 클래스를 배우기 위해선 필수적으로 사전에 알아야하는 것이 있다. 함수로 인수를 넘길 때 값으로 넘기는지 레퍼런스로 넘기는지이다.

 값의 전달은 말 그대로 값을 복사해 전달하는 개념이다. A를 복사해 B를 만들었다. B에 영향을 주었을 때 A는 영향을 받지 않는다. 정도가 되겠다.

        static void valTest(int a)
        {
            System.Console.WriteLine(a);
            a = 5;
            System.Console.WriteLine(a);
        }

        static void refTest(ref int b)
        {
            System.Console.WriteLine(b);
            b = 5;
            System.Console.WriteLine(b);
        }

        static void Main(string[] args)
        {
            int a = 3;
            System.Console.WriteLine(a);
            valTest(a);
            System.Console.WriteLine(a);
            refTest(ref a);
            System.Console.WriteLine(a);

        }

 간략히 설명하면 값으로 전달하는 valTest 함수가 있고, 레퍼런스로 전달하는 refTest 함수가 있다. 해당 코드를 실행해보면 valTest를 실행하고나서 Main의 a 값은 3이 유지되지만, refTest를 실행하고 나면 Main의 a변수의 값은 3이 아니라 5가 된다.

 

 C#에선 구조체와 클래스의 값 전달 방식에 차이가 있다. 구조체는 값으로, 클래스는 레퍼런스로 인자를 전달한다.

 

 

구조체

 클래스와 구조체는 거의 유사하지만, 위에서 설명한 데이터의 전달 방식뿐만 아니라 몇가지 다른 점이 있다.

  • 상속이 불가능하다.
  • 클래스에 비해 오버헤드[# 실제 사용하기까지 필요한 작업이라 보면 되겠다]가 적다
  • 클래스와 마찬가지라 메서드/프로퍼티를 구성할 수 있다.
  • 인터페이스 구현을 할 수 있다.[# 인터페이스 구현시 주의할 점이 있다고. https://www.csharpstudy.com/Mistake/Article/10]

 

선언

 구조체 선언은 다음과 같다.

struct Point{
	public int x;
    public int y;
    
    public Point(int x, int y){
    	this.x = x;
        this.y = y;
    }
    
    public override string ToString(){
    	return string.Format($"({x}, {y})");
    }
    
}

static void Main(string[] args){
	Point p = new Point(3,5);
    
    System.Console.WriteLine(p.ToString());
}

 한가지 아쉬움이라면 접근 제한자를 일일이 작성해야한다는 점인데 이 부분은 더 공부하면서 C++ 방식처럼 작성을 할 수 있는지 알아보아야겠다.

 

 

클래스

 클래스는 구조체와 달리 데이터를 레퍼런스 타입으로 전달한다. 때문에 callee에서 값을 수정해도 되는지에 대해 세심하게 확인해야 할 필요가 있다. C#에선 배열의 경우에도 System.Array라 불리는 .Net 클래스 기반이기 때문에 값을 레퍼런스 전달한다고.

 

 또한 C++에서처럼 this가 존재한다. 만일 메서드 인자와 필드명이 같은경우 this를 이용해 필드에 접근이 가능하다.

this.name = name;

 

구성 요소

 클래스의 구성 요소는 크게 네가지로 존재한다.

  • 메서드
  • 속성(프로퍼티)
  • 필드
  • 이벤트

 메서드는 클래스 안에서 특정 동작을 수행하는 함수라 볼 수 있다. 즉, 일반적인 함수가 클래스 안으로 들어가면 이를 함수라 하지 않고 메서드라 부르는 것이다.

 

 속성은 클래스에서 저장하고 있는 데이터를 외부에서 접근 가능케하는 메서드의 일종으로 보면 된다. 주로 get, set 함수로 구성되고 이를 위한 관련 키워드도 제공된다.

 

 필드는 클래스가 보관하고 있는 데이터가 실질적으로 저장되어 있는 곳이다. 그냥, 변수라고 생각하면 이해가 빠르겠다.

 

 이벤트는 클래스 내부에서 특정 작업이 일어났을 때 해당 클래스를 포함하고 있는 외부로 알리는데 이용한다고. 불이 나면(작업) 비상벨을 울려서(이벤트 발생) 건물 전체에 알리는(전달) 방식이라 보면 되겠다.

 

필드

 필드는 거의 필수적으로 접근 제한자를 private로 설정해야한다. 최소한 public으로 설정하는 것은 하지 말자. 객체의 데이터에 접근할 때는 속성으로 접근해야 OOP의 패러다임을 유지할 수 있다.

 

속성(프로퍼티)

 프로퍼티 작성은 메서드와 비슷하면서도 다르다. 대개 프로퍼티의 이름은 관련된 필드의 이름에서 앞글자를 대문자로 표기한다. 예를 들어 필드의 이름이 name인 경우 프로퍼티의 이름은 Name으로 설정하는 방식이다.

private string name;
public string Name{
	get{return name;}
    set{
    	name = value;
   	}
}

 set에서 사용하고 있는 value라는 변수는 값을 설정할 때 설정할 값이 포함되어 있는 매개변수로서, 코드로 드러나있지는 않지만 분명히 존재하는 매개변수다. 약간 this와 비슷한 변수라고 보면 될 듯.

 

# index

728x90
반응형

'DEV > .Net' 카테고리의 다른 글

C# - 연산자 오버로딩  (0) 2021.05.29
C# - 메서드에 대해서  (0) 2021.05.29
C# - namespace(네임스페이스)  (0) 2021.05.28
C# - 예외 처리  (0) 2021.05.27
C# - 반복문  (0) 2021.05.27
Comments