C#의 데이터형

tangoo·2022년 7월 12일
0

C#

목록 보기
7/7
post-thumbnail

기본 데이터형

ex_ 우리가 알고 있는 데이터형이란? 1,2,3,4 숫자형 데이터, 문자 상수 데이터형 etc

기존에 알고 있던 c++은 int → 메모리와 1: 1 대응된다. 메모리 할당 4byte , 이 메모리에 저장될 수 있는 데이터가 할당된다.

그러나, C#의 데이터형 object 로 부터 파생된 객체

System.Object == object

데이터 형은 CTS에서 정의된 객체

string 형

c/c++ 문자열과의 차이점

문자열 끝에 0, ‘\0’ →문자열 끝을 알았지만,,,! C#에서는 이런거 고민할 필요가 없다.

또한 C#의 문자열은 ‘+’로 문자열 연결을 할 수 있다.

== : 문자열 비교

[index] : 문자

암시적 데이터형 var

처음 대입되는 데이터에 따라서 데이터형이 결정된다.

var를 사용할 수 없는 예

1) null 값 초기화, 매개변수(함수에 값 복사, 대입 X)로는 사용 못함

2) var는 지역변수로만 사용 가능, 클래스 멤버로는 사용 못함

3) 연속적으로 초기화 하는경우 var m = 10, n=20; (X)

//var형 변수에 데이터가 분명한 값으로 선언과 초기화를 한후 에 두값을 더한 결과를 출력
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp{
	class Program{
		public static void Main(string[] args)
		{
			var value1 = 3.14f;
			float value2 = 10.121f;
			float sum = value1+ value2'
			Console.WriteLine("{0} {1:f1} {2}", value1, value2, sum);
			
			1:f1 -> 소수점 첫째 짜리 까지 
		}
	}
}

nullable 형

null을 허용하지 않는 데이터형이 null 값을 허용

형식 : 데이터형 ? 변수명 ;

int? Var1 ;

bool? Var2 = null; //true , false, null

속성 : (옵션)

.HasBalue // true, false(null) →data가 null인지 아닌지

.Value //읽기 전용

//nullable 형을 선언하고 판독해 보자 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp{
	class Program{
		public static void Main(string[] args)
		{
			int? Num1 = null;
			if(Num1.HasValue)
				Console.WriteLine("올바른 값");
			else Console.WriteLine("null 값");
			
			Console.WriteLine("null : {0}", Num1);
		}
	}
}

변환

ToString() → 현재의 값을 문자열로 변환

기본 데이터형.Parse() →무

Convert.ToInt32()

Conver.ToSingle() → single 은 float

Convert.ToXXXXX()

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

namespace ConsoleApp{
	class Program{
		public static void Main(string[] args)
		{
			int value1 =127;
			string str1 = value1.ToString();
			Console.WriteLine(str1);
			
			int value2 = Convert.ToInt32(str1);
			Console.WriteLine(value2);
			
			string str2 = "3.14";
			float value3 = float.Parse(str2);
			Console.WriteLine(value3);
		}
	}
}

중요

박싱과 언박싱

박싱(boxing)

데이터 형을 최상위 object형으로 변환하여 heap 메모리에 데이터 임시 저장

int m = 123;

object obj = m;

언박싱(unboxing)

힙에 저장된 형식을 다시 원래의 형식으로 변환 (copy)

int n = (int) obj;

int 형 값을 박싱 한 후에 다시 언박싱 하여 출력해보자

박싱과 언박싱 과정에서 메모리 공유가 발생하는지, 또는 복사가 발생하는지 확인해 보자

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

namespace ConsoleApp{
	class Program{
		public static void Main(string[] args)
		{
			int i = 123;
			object obj = 1;
			Console.WriteLine("{0}",(int)obj); //123정수형 값 출력됨 
			
			
			int i =123;
			object o = i;
			i = 456l
			Console.WriteLine("{0} {1}", i, (int)o); // 공유하는 메모리 형태가 아니라 별도이기에 copy 
			//i= 456, o = 123 결과 
		}
	}
}

표준 입력

Console.ReadKey() → 사용자가 눌린 키 한 문자 정보를 리턴하는 메서드

함수 원형

public static ConsoleKeyInfo ReadKey() → static 바로 사용할 수 있게 되어있음

public static ConsoleKeyInfo ReadKey(bool intercept) → 위의 것 오버로딩

//true : 화면 출력 안함, false: 화면 출력함

ConsoleKeyInfo → 키의 문자 Shift, Alt etc등의 상태 를 포함한다.

ConsoleKeyInfo 속성

-ConsoleKeyInfo.Key

ConsoleKey열거형 값

ConsoleKey.A, ConsoleKey.Escape등…

-ConsoleKeyInfo.KeyChar

눌린키의 유니코드를 얻는 속성으로 ‘대소문자’ 구분 가능하다.


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

namespace ConsoleApp{
	class Program{
		public static void Main(string[] args)
		{
			ConsoleKeyInfo KeyInfo;
			do{
				KeyInfo = Console.ReadKey();
				if(KeyInfo.Key == ConsoleKey.A)
						Console.WriteLine("a가 눌렸다."); //대소문자 구별 안한다. .. 
			}while(KeyInfo.Key != ConsoleKey.Escape); //esc값 누를때 까지 계속.. 
		}
	}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp{
	class Program{
		public static void Main(string[] args)
		{
			ConsoleKeyInfo KeyInfo;
			do{
				KeyInfo = Console.ReadKey(true);
				if(KeyInfo.KeyChar == 'a')
					Console.WriteLine("a가 눌렸어"); //대소문자 구별 가능 
				Console.Wirte(KeyInfo.KeyChar);
			}while(KeyInfo.Key != ConsoleKey.Escape); //esc값 누를때 까지 계속.. 
		}
	}
}

Console.ReadLine()

엔터키가 눌려질때 까지 입력 받은 문자열을 리턴하는 메서드

ex_입력 받은 문자열을 숫자로 사용할때는 Convert.ToInt32(), int.Parse()등의 메서드 사용해야한다.

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

namespace ConsoleApp{
	class Program{
		public static void Main(string[] args)
		{
			int Kor, Eng, Math, Total;
			float Average;
			Console.Write("국어 점수를 입력 : ");
			kor = Conver.ToInt32(Console.ReadLine());
				Console.Write("국어 점수를 입력 : ");
			Eng = Conver.ToInt32(Console.ReadLine());
				Console.Write("영어 점수를 입력 : ");
			Math = Conver.ToInt32(Console.ReadLine());
				Console.Write("수학 점수를 입력 : ");
			Total = Kor+Eng+Math;
			Average = Total/30.0f;
			Console.WriteLine("{0} {1} {2} {3} {4}", Kor, Eng, Math, Total, Average);
			
		}
	}
}

사용자 지정형

struct, enum, class, interface가 있다.

STRUCT 구조체

public struct 이름{//멤버, 속성, 메서드}

Q 정적 변수, 지역변수, 전역 변수?

지역 변수 (local): 중괄호 내부, 함수의 매개변수에서 사용되는 변수 , 중괄호 밖, 함수 밖에서 사용 불가

  • 초기화 하지 않으면 쓰레기 값 저장한다.
  • 중괄호 내부 초기화 될 때 메모리가 생성된다.
  • 중괄호 밖으로 나갈때 메모리가 소멸된다.

전역 변수 (global) : 중괄호 외부에 선언되는 변수, 어디든 참조에서 사용할 수 있다.

  • 초기화 하지 않아도 자동으로 0 으로 초기화된다.
  • 프로그램 시작할때 메모리가 생성된다.
  • 프로그램 종료될 때 메모리가 소멸된다.

정적 변수 (static) : 전역변수랑 비슷하다. 하지만 큰 다른 점은 초기화가 딱 한번만 진행이된다.!

  • 자료형 앞에 static 표기한다.
  • 초기화 하지않아도 자동으로 0 으로 초기화한다.
  • 중괄호 내에서 선언될 시 초기화는 딱 한번만 진행이된다.
  • 중괄호 내부에서 메모리가 생성된다.
  • 프로그램 종료시 메모리가 소멸된다.

제한 사항

1. 구조체에 선언된 const, static 변수만 초기화 가능
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp{
	public struct MyStruct{
		public const float PI = 3.14f;
		public static int AGe = 12;
		public int val;
	}
	class Program{
		public static void Main(string[] args)
		{
			Console.WirteLine("{0} {1}", MyStruct.PI, MyStruct.Age);//둘다 정적 형태여서 선언안해도 사용해도된다.
			//MySturct.val = 10; 
			//Console.WirtLine(MyStruct.val); --> 선언하던가 생성하든가 해야한다. 오류남
		}
	}
}

값 형식과 참조 형식

구조체 안에 선언할 수 잇는 생성자는 매개변수가 반드시 있어야한다. → 구조체는 값형식이라서 선언해서 사용할 수 있다.

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

namespace ConsoleApp{
	public int Age;
	public MyStruct(int InAge){
		Age = InAge;
	}
	class Program{
		public static void Main(string[] args)
		{
			//구조체는 값형식이다.
			//선언만해도 메모리 생성된다. 
			MyStruct TestStruct1;
			TestStruct1.Age = 12;
			Console.WriteLine(TestSTruct1.Age);
			
			//생성만했을때는 기본생성자..기본적으로 결과값 보면 0으로 setup되는게 보여진다.
			MyStruct TestStruct2 = new MyStruct();
			Console.WriteLine(TestSTruct2.Age);
			
			MyStruct TestStruct3 = new MyStruct(12);
			Console.WriteLine("{0}", TestStruct3.Age);
			
		}
	}
}

구조체를 같은 구조체에 대입하게 되면 값이 복사

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

namespace ConsoleApp{

	public MyStruct(int InAge){
		public int Age;
	}
	class Program{
		public static void Main(string[] args)
		{
			MyStruct TestSTruct1, TestStruct2;
			TestStruct2.Age = 10;
			//10 값 복사 
			TestStruct1 = TestStruct2;
			Console.WriteLine("{0}", TestStruct1.Age);
			
		}
	}
}

구조체는 값 형식으로 클래스는 참조 형식임

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

namespace ConsoleApp{

	public MyStruct(int InAge){
		public int Age;
	}
	class MyClass{
		public int Age;
	}
	class Program{
		public static void Main(string[] args)
		{
			//값 형식 example
			MyStruct test1 = new MyStruct();//생성해서 
			test1.Age = 12;//값 복사 
			MyStruct test2 = test1;//얘네 둘은 별개 
			test2.Age = 24;
			Console,WriteLine("{0} {1}", test1.Age, test2.Age);
			//12,24 출력 

			//참조형식 example 
			MyClass test3 = new MyClass();//생성
			test3.Age = 12;
			MyClass test4 = test3; // 참조 형태 대입 // 같은 객체를 참조한다. 
			test4.Age = 24;
			Console.WriteLine("{0} {1}", test3.Age, test4.Age); //24, 24 출력 된다.
			
		}
	}
}

구조체는 값 형식으므로 선언만으로도 사용가능

new 사용했때만 생성자가 호출되어 기본값으로 초기화 될 수 있다.

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

namespace ConsoleApp{
	public struct MyStruct{
		public int AGe;
		public float Num2;
		public bool IsReady;
	}
	
	class Program{
		public static void Main(string[] args)
		{
			MyStruct test = new MyStruct();
			Console.WirtLine("{0} {1} {2}", test.IsReady, test.Age, test.Num2);
			//false 0 0 
			//bool false 가 기본값이 었다...
		}
	}
}

구조체는 구조체 또는 클래스에 상속할 수 없다.
구조체는 인터페이스를 상속하여 메서드를 구현할 수 있다.

열거형

상수를 문자열로 대치하여 선언하고 상수에 의미 부여할때 사용한다.

enum 이름 {문자열, 문자열2};

enum 이름 {문자열1 = 상수, 문자열2 = 상수};

enum 이름 {문자열1 = 상수, 문자열2};

enum Days {Sun=1, Mon, Tue, Wed, Thu, Fri, Sat}; //1,2,3,4,.... 

기본은 int형이지만 , char 형을 제외한 형식을 지정할 수 있다

enum Days : byte {Sum = 0, Mon, Tue, Wed, Thu};

열거형 변수가 아닌 변수에 열거형 값을 대입할 때는 데이터형을 명시할 것 !

profile
안녕하세요!

0개의 댓글