본문 바로가기

프로그래밍/C#

[C#] C#데이터 타입 - 참조형식, 변수, 상수

오늘은 C#의 참조형식, 변수, 상수에 대해서 알아보겠습니다


C#에 대하여 전혀 몰랐지만 정리해가면서 점점 코드가 눈에 들어오고 아직 초반이라 그런지 재미도 있네요.


기본 개념설명은 최대한 읽기 쉽고 이해하기 쉽도록 쓰기 때문에 잘라서 적겠습니다.

(길게 풀어쓰면 읽으면서도 무슨말인지 모르기 때문에)




참조형식(Reference Type)

참조 형식은 string, object, class와 같은 형식.

new를 통하여 인스턴스가 생성이 되면 데이터를 참조하는 메모리 주소만 가지고 있습니다.

실제 데이터는 분리된 공간에 저장이 됩니다. (무슨뜻인지 모르시면 아래 그림 참고하세요)


참조형식은 기존의 변수를 새로운 변수에 할당할 경우 값 전체를 복사하는 것이 아님.

값을 참조하는 주소를 복사하게 됩니다.





[ 참조형식 생성 ]


new를 통해 인스턴스를 생성하면 그 인스턴스 안에는 데이터가 있는게 아니라 데이터가 저장된 메모리의 주소를 가지고 있습니다.

그렇기 때문에 기존의 변수를 새로운 변수로 할당할 경우 값 전체를 복사하는 것이 아니라 주소를 복사하게 되는 것입니다.

(쉽게 말해서 인스턴스 자체가 주소를 가지고 있어서 다시 쓸때도 주소만 복사해 온다는 뜻)



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace _160815_01_DataType_ReferenceType
{
    /* 구조체(struct) 정의 */
    public struct Employee
    {
        public int BirthYear;
        public string Name;
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            /* 인스턴스 생성 */
            Employee emp = new Employee(); /* new를 통해 인스턴스 생성 */
            emp.Name = "최진헌";           /* Name를 emp의 Name안에 값을 넣어줌 */
            emp.BirthYear = 1992;          /* BirthYear를 emp의 BirthYeat안에 값을 넣어줌 */
 
            Console.WriteLine("emp.Name: {0}", emp.Name);
            Console.WriteLine("emp.BirthYear: {0}", emp.BirthYear);
            Console.WriteLine("");         /* 공백 */
 
            Employee ChangeEmp = emp; /* emp의 데이터를 ChangeEmp안에도 넣어줌  */
            Console.WriteLine("===Change===");
            Console.WriteLine("ChangeEmp.Name: {0}", ChangeEmp.Name);
            Console.WriteLine("ChangeEmp.BirthYear: {0}", ChangeEmp.BirthYear);
            Console.WriteLine("");
 
            /* ChangeEmp로 변수를 바꿔줬지만 값은 그대로입니다.
             * 안의 값을 바꾸지 않았기 때문입니다. 이제 값을 바꾸겠습니다*/
            ChangeEmp.Name = "김개똥"/* 값을 바꿔줍니다 */
            ChangeEmp.BirthYear = 1995;/* 값을 바꿔줍니다 */
            Console.WriteLine("===Change===");
            Console.WriteLine("ChangeEmp.Name: {0}", ChangeEmp.Name);
            Console.WriteLine("ChangeEmp.BirthYear: {0}", ChangeEmp.BirthYear);
            Console.WriteLine("");
        }
    }
}
 
cs


코드와 설명입니다.


코드설명만 보시면 쉽게 이해하실 수 있습니다.


변수

다양한 자료형을 사용하고 객체의 인스턴스를 생성하기 위한 값을 담을 그릇.


변수 사용시 제약사항

- 문자, 언더바(_)로 시작 가능
- 숫자로 시작할 수 없음
- 예약어(int, string, if, else, class등)은 사용할 수 없음


변수의 명시적 형식 사용

object, var, dynamic의 차이점에 대하여 알아보겠습니다

 

Object 

Var 

Dynamic 

 설정 가능한 형식

모든형식

null등 일부를 제외한 대부분의 형식 

모든 형식 

 설정값의 원본 유지

값을 설정하면 object형식 그 자체 

원본 형식을 추정 

개발 시점에서는 원본 형식을 알 수 없음 

 바인딩 방식

정적 

정적 

동적 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace _160815_01_DataType_variable
{
    class Program
    {
        static void Main(string[] args)
        {
            string value1 = "string값";
            var value2 = "var값";
            dynamic value3 = "dynamic값";
 
            Console.WriteLine("value1: {0}", value1);
            Console.WriteLine("Value2: {0}", value2);
            Console.WriteLine("value3: {0}", value3);
        }
    }
}
 
cs

코드입니다. 별다른 설명은 필요없을듯 합니다



결과값입니다. 문자열을 출력하는데 있어서는 별다른 차이는 없는것 같습니다



상수

프로그램 전체에서 변경이 되지 않는 값을 설정할 때 사용합니다.


※참고. C#에서 상수는 const 예약어를 통해 설정이 가능합니다.

Ex)

const float PI = 3.14F;

(절대 바뀌지 않는값 파이를 상수로 지정하였습니다)


또한 C#에서는 const와 비슷한 readonly를 지원합니다.

공통점은 모두 초기화한 이후에 값을 변경할 수 없습니다.

하지만.

const 

 선언할때만 초기화될 수 있습니다.

readonly

 선언할때나 생성자에서 초기화 될 수 있습니다.

 따라서 readonly 필드의 값은 사용된 생성자에 따라서 다릅니다 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace _160815_01_DataType_Constant
{
    class Program
    {
        /* Class 정의 */
        public class Product
        {
            public const int ConstPrice = 1000/* const 필드 설정 */
            public readonly int ReadOnlyPrice;  /* readonly 필드 설정 */
 
            /* 생성자 */
            public Product()          /* 생성자 초기값 */
            {
                this.ReadOnlyPrice = 2000/* 생성자에서 초기값 설정 */
            }
 
            public Product(int price) /* 외부값을 받았을 경우 */
            {
                this.ReadOnlyPrice = price;/* 외부에서 받은 값으로 설정 */
            }
        }
 
        static void Main(string[] args)
        {
            /* 상수값 가져오기: 상수는 정적인 멤버이므로 객체를 생성할 필요가 없습니다 */
            Console.WriteLine("ConstPrice={0}", Product.ConstPrice);
 
            /* 기본 생성자로 설정된 값 */
            Product item1 = new Product();
            Console.WriteLine("new Product(): ReadOnlyPrice={0}", item1.ReadOnlyPrice);
 
            /* 생성자에게 특정 값을 받음 */
            Product item2 = new Product(3000);
            Console.WriteLine("new Product(3000): ReadOnlyPrice={0}", item2.ReadOnlyPrice);
        }
    }
}
 
cs

코드와 설명

17~26줄을 보시면 readonly의 생성자를 초기값과 외부값을 따로 설정하여 값이 다르게 출력됨을 확인하실 수 있습니다.



실행값.


1번줄에 Const는 처음에 설정해주면 값이 바뀌지 않기때문에 1000만 출력하였고,

2,3번줄의 readonly는 생성자에 따라서 값이 바뀌기 때문에 확인하기 위하여 두번 출력하였습니다






기본적인 내용을 다루는데 정리하려면 많은 시간이 걸리네요.


오타나 틀린내용 있으면 피드백 부탁드립니다.





주의!! 본 게시글은 구글링으로 독학하는 블로거가 이해한대로 정리해서 쓴 글이므로 사실과 다를 수 있습니다.