728x90

구조체는 사용자 정의 Data Type 으로 int, double 등과 같은 기본 제공 변수 유형이 아닌
새로운 유형, 여러가지 유형을 사용하기 위해 사용자가 직접 만들어 사용한다.
- 구조체를 정의하려면 struct 문을 사용한다.
- C# 구조체에 메소드, 필드, 속성등을 가질 수 있다.
- C# 구조체에 기본(Default) 생성자를 정의할 수 없다.
- C# 구조체에 소멸자를 정의할 수 없다.
- 클래스는 힙에 생성되는 참조 유형이고 구조체는 스택에 생성되는 값 유형이다.
- 구조체는 상속을 지원하지 않는다.

- 클래스와 달리 구조체는 new 연산자를 사용하지 않고 인스턴스화할 수 있다.


using System;

namespace Struct_EX
{
    class BaseClass // 부모 클래스
    {
        public int a; // 클래스의 멤버를 접근 제한자로 지정하지 않으면 멤버의 접근 수준은 무조건 private로 자동 지정됨
        int b;

        private void A() { }
        protected void B() { }

        public void C() { }

        public void ParentMethod() // 부모클래스의 ParentMethod 메소드
        {
            A();
            B();
            C();
        }
    }
    class DerivedClass : BaseClass // DerivedClass (파생) 클래스는 BaseClass(부모클래스)를 상속받는다
    {
        public void ChildMethod()
        {
            //A(); // private 접근 지시어로 선언된 메소드 접근은 같은 클래스 안에서만 접근 가능
            B(); // protected 접근 지시어로 선언되었고 자식 클래스는 부모 클래스의 파생 클래스 이므로 접근 가능
            C();
        }

    }

    class Program
    {
        struct MyPoint // 클래스와 유사한 구문, 상속 불가, 인터페이스 구현 불가
        {
            public int x;
            public int y;

            public MyPoint(int x, int y) // 구조체의 생성자는 매개변수를 넣어 만들어야 한다.
            {
                this.x = x;
                this.y = y;
            }

            public override string ToString()
            {
                return string.Format("({0}, {1})", x, y);
            }
        }

        class PointC
        {
            public int x;
            public int y;
            public PointC(int x, int y)
            {
                this.x = x;
                this.y = y;
            }
        }

        static void Main(string[] args)
        {
            BaseClass parent = new BaseClass(); // Baseclass(부모) 클래스로 새 객체를 생성한다.
            parent.a = 1; // 보호수준 때문에 접근 불가
            DerivedClass child = new DerivedClass(); // DerivedClass(자식) 클래스로 새 객체를 생성한다.
            parent.ParentMethod();
            child.ChildMethod();
            child.C();

            MyPoint p; // 클래스와 달리 구조체는 new 연산자를 사용하지 않고 인스턴스화할 수 있다.
            p.x = 55;
            p.y = 77;
            Console.WriteLine("구조체 : p.x = {0}, p.y = {1}", p.x, p.y);
            Console.WriteLine(p.ToString());

            MyPoint p1 = new MyPoint(11,22); //구조체 선언
            PointC p2 = new PointC(11,22);  //클래스 선언
            MyPoint p3 = p1; // 값에 의한 복사 (구조체는 스택에 생성되는 값 타입)
            PointC p4 = p2; // 참조에 의한 복사 (클래스는 힙에 생성되는 참조 타입으로 힙의 주소를 전달)
            Console.WriteLine("구조체 : p1.x = {0}, p1.y = {1}", p1.x, p1.y);
            Console.WriteLine("클래스 : p2.x = {0}, p2.y = {1}", p2.x, p2.y);

            p3.x = 33;
            p4.x = 44;
            Console.WriteLine("구조체 : 값에 의한 복사 p1.x = {0}, p3.x = {1}", p1.x, p3.x);

            // 구조체는 스택영역에 값이 직접 들어가서 깊은 복사가 된다.

            Console.WriteLine("클래스 : 참조에 의한 복사 p2.x = {0}, p4.x = {1}", p2.x, p4.x);
            // 클래스는 참조하는 주소가 복사되면서 스택영역의 변수가 같은 힙영역을 가리킨다.
        }
    }
}



'C# > 문법 및 기능' 카테고리의 다른 글

C# 프로퍼티(Property)  (0) 2019.08.19
C# 인터페이스  (0) 2019.08.18
C# 접근 제한자(Access Modifier)  (0) 2019.08.13
자바와 C#의 차이점  (0) 2016.12.27
C# NameValueCollection  (0) 2016.03.20
블로그 이미지

Link2Me

,