제로의영역

7.16 구조체 본문

C#

7.16 구조체

아이큐제로 2019. 6. 16. 17:21

* 본 블로그 글은 머리가 아~~~주 나쁜 왕X100초보가 프로그래밍을 공부하면서 정리를 위해 작성하는 글입니다. 잘못 정리되거나 제가 잘못 이해한 글은 이해 및 조언 부탁드립니다.

* 공부는 '이것이 C#이다' 책을 보고 하고 있습니다. 참고로 저같은 왕초보가 보기 어렵게 써져 있어서 별도의 정리 문서를 만들게 되었습니다.

 

 (1) 정의: C#의 복합 데이터 형식의 한 종류

 

 (2) 용도: 필요할 때만 사용하고 바로 메모리에서 지우는 데이터를 다룰 때 사용

 

 (3) 사용법

  1) struct키워드를 이용해서 선언: 'struct+구조체 이름'

  2) 필드 선언(생성)

  3) 메소드 선언(생성)

 

 사용예)

   struct 구조체 이름

   {

     필드 생성

      

     메소드 생성

     {

     }

   }

  

 (4) 클래스와 구조체의 차이

특징 클래스 구조체
키워드 class struct
형식

참조 형식

1. 변수가 값이 있는 곳의 위치를 가리키는 데이터 형식

2. 힙에 데이터 저장

3. 객체를 더이상 사용하지 않을 때 제거

값 형식

1. 변수가 값을 담는 데이터 형식

2. 스택에 데이터 저장

3. 코드블록이 끝나는 시점( } )에 제거

복사 얕은 복사: 참조만 복사하는 것 깊은 복사: 힙에 보관되어 있는 내용을 source로부터 복사해서 별도의 힙 공간에 객체를 보관하는 것
인스턴스 생성

new 연산자와 생성자 필요:

클래스+객체이름=new+생성자

선언만으로도 생성
생성자 매개 변수 없는 생성자 선언 가능 매개 변수 없는 생성자 선언 불가능
상속 가능 모든 구초제는 System.Object형식을 상속하는 System.ValueType으로부터 직접 상속받음

 

 예제)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ex7_18
{
    struct Point3D                              //구조체 선언
    {
        public int X;                           //필드 생성
        public int Y;
        public int Z;
        public Point3D(int X,int Y, int Z)      //매개변수가 있는 Point3D 생성자 생성
        {
            this.X = X;                         //생성자의 변수를 통해 Point3D 구조체의 변수에 접근
            this.Y = Y;
            this.Z = Z;
        }

        public override string ToString()       //System.Object 형식의 ToString() 메소드를 오버라이딩한 메소드 생성(System.Object로 부터 상속)
        {
            /*return base.ToString();*/			//선언만으로 생성되는지 테스트를 위해 입력
            return string.Format($"{X},{Y},{Z}");
        }
    }
    class MainProgram
    {
        static void Main(string[] args)
        {
            Point3D p3d1;                               //선언만으로 인스턴스 생성
            p3d1.X = 10;                                //p3d1의 필드 생성
            p3d1.Y = 20;
            p3d1.Z = 40;

            Console.WriteLine(p3d1.ToString());

            Point3D p3d2 = new Point3D(100, 200, 300);  //생성자를 이용한 인스턴스 생성도 가능
            /*Point3D p3d2;                             //선언만으로 인스턴스 생성방법 테스트 >> 같은 결과가 나옴
            p3d2.X = 100;
            p3d2.Y = 200;
            p3d2.Z = 300;*/                             
            Point3D p3d3 = p3d2;                        //인스턴스 복사(깊은 복사) >>100,200,300
            p3d3.Z = 400;                               //Z값만 변경 >> 100, 200, 400

            Console.WriteLine(p3d2.ToString());
            Console.WriteLine(p3d3.ToString());
        }
    }
}

출력결과)

10,20,40
100,200,300
100,200,400

'C#' 카테고리의 다른 글

8.2 인터페이스는 약속이다  (0) 2019.06.25
7.17 튜플  (0) 2019.06.18
7.15 확장 메소드  (0) 2019.06.14
7.14 분할 클래스(Partial Class)  (0) 2019.06.10
7.13 중첩 클래스  (0) 2019.06.07