ex_ 우리가 알고 있는 데이터형이란? 1,2,3,4 숫자형 데이터, 문자 상수 데이터형 etc
기존에 알고 있던 c++은 int → 메모리와 1: 1 대응된다. 메모리 할당 4byte , 이 메모리에 저장될 수 있는 데이터가 할당된다.
그러나, C#의 데이터형 object 로 부터 파생된 객체
System.Object == object
데이터 형은 CTS에서 정의된 객체
c/c++ 문자열과의 차이점
문자열 끝에 0, ‘\0’ →문자열 끝을 알았지만,,,! C#에서는 이런거 고민할 필요가 없다.
또한 C#의 문자열은 ‘+’로 문자열 연결을 할 수 있다.
== : 문자열 비교
[index] : 문자
처음 대입되는 데이터에 따라서 데이터형이 결정된다.
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 -> 소수점 첫째 짜리 까지
}
}
}
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);
}
}
}
중요
데이터 형을 최상위 object형으로 변환하여 heap 메모리에 데이터 임시 저장
int m = 123;
object obj = m;
힙에 저장된 형식을 다시 원래의 형식으로 변환 (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값 누를때 까지 계속..
}
}
}
엔터키가 눌려질때 까지 입력 받은 문자열을 리턴하는 메서드
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 이름{//멤버, 속성, 메서드}
지역 변수 (local): 중괄호 내부, 함수의 매개변수에서 사용되는 변수 , 중괄호 밖, 함수 밖에서 사용 불가
전역 변수 (global) : 중괄호 외부에 선언되는 변수, 어디든 참조에서 사용할 수 있다.
정적 변수 (static) : 전역변수랑 비슷하다. 하지만 큰 다른 점은 초기화가 딱 한번만 진행이된다.!
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};
열거형 변수가 아닌 변수에 열거형 값을 대입할 때는 데이터형을 명시할 것 !