2020. 1. 6. 17:53ㆍC# 언어/이것이 C# 이다. 책정리

ㅇ 데이터 형식 |
기본 데이터 형식
- 값 형식
- 참조 형식
복합 데이터 형식
- 값 형식
- 참조형식
ㅇ 값 형식 (스택관련) |
- 변수가 값을 담는 데이터 형식으로 값 형식의 변수는 모두 스택에 저장됨
ㅇ 참조 형식 (힙 관련) |
- 힙 영역에는 데이터를 저장하고 스택 영역에는 데이터가 저장되어 있는 힙 메모리의 주소를 저장
ㅇ 힙과 스택 |
- 스택은 자신이 담고 있던 데이터가 쓰레기가 되지 않도록 모두 수거해감.
- 힙은 데이터를 스스로 제거하는 메커니즘을 갖고 있지 않음 대신 CLR의 가비지 컬렉터가 있음
- 가비지 컬렉터는 힙에 더 이상 사용하지 않는 객체가 있으면 그 객체를 수거해감
ㅇ 스택 영역과 힙 영역을 나눈 이유 ? |
스택은 코드 블럭이 사라지는 시점에 함께 제거됨. 만약 코드 블럭이 끝나는 시점과 상관없이 데이터를 유지하고 싶을 때는 스택 구조가 사용되기 어려움. 그래서 프로그래머가 원한다면 데이터를 살릴 수 있는 다른 메모리 영역을 CLR이 제공하는 것
ㅇ 정수 계열 형식 |
데이터 형식 | 설명 | 크기(바이트) | 담을 수 있는 값의 범위 |
byte | 부호 없는 정수 | 1(8비트) | 0~255 |
sbyte | signed byte 정수 | 1(8비트) | -128~127 |
short | 정수 | 2(16비트) | -32.768~32.767 |
ushor | 부호 없는 정수 | 2(16비트) | 0~65,535 |
int | 정수 | 4(32비트) | -2.147.483.648~2.147.483.647 |
uint | 부호 없는 정수 | 4(32비트) | 0~4,294,967,295 |
long | 정수 | 8(64비트) | ~~ |
ulong | 부호 없는 정수 | 8(64비트) | ~~ |
char | 유니코드 문자 | 2(16비트) |
ㅇ 부동 소수점 형식 |
데이터 형식 | 설명 | 크기 | 범위 |
float | 단일 정밀도 부동 소수점 형식 (7개의 자릿수만 다룸) | 4(32비트) | ~~ |
double | 복수 정밀도 부동 소수점 형식 (15~16개의 자릿수 다룸) | 8(64비트) | ~~ |
decimal | 29자리 데이터를 다룸 | 16(128비트) |
ㅇ 문자 형식과 문자열 형식 |
데이터 형식 | 설명 | 크기 | 표기 |
char | 문자 데이터를 다룸 | ' 작은 따옴표' | |
string | 문자열 데이터를 다룸 | " 큰 따옴표" |
ㅇ 논리 형식 |
데이터 형식 | 설명 | 크기 | 범위 |
bool | 논리 형식 | 1(8비트) | true, false |
ㅇ object 형식 |
- object 형식은 어떤 데이터 이든지 다룰 수 있는 데이터 형식
- C#은 object가 모든 데이터를 다룰 수 있도록 하기 위해 모든 데이터 형식이 자동으로 object형식으로 상속받게 함
- 참조 형식이기 때문에 힙에 데이터를 할당
- object 형식은 값 형식의 데이터를 힙에 할당하기 위한 "박싱" 기능을 제공
- 박싱되어 있는 값을 꺼내 값 형식 변수에 저장하는 과정을 일컬어서 "언 박싱" 이라고함
ㅇ 데이터 형식 변환 |
변수를 다른 데이터 형식의 변수에 옮겨 담는 것을 "형식 변환"이라함
1. 크기가 서로 다른 정수 형식 사이의 변환
using System;
using static System.Console;
namespace p71
{
class MainApp
{
static void Main(string[] args)
{
sbyte a = 127;
WriteLine(a);
int b = (int)a;
WriteLine(b);
int x = 128; // sbyte의 최대값 127보다 1 큰수
WriteLine(x);
sbyte y = (sbyte)x; // 오버 플로우 발생
WriteLine(y);
}
}
}
작은 정수 형식 변수 -> 큰 정수 형식의 변수 (문제 없음)
큰 정수 형식 변수 -> 작은 정수 형식 변수( 오버플로우 발생)
"용량" 차이로 인한 문제
2. 크기가 서로 다른 부동 소수점 형식 사이의 변환
using System;
using static System.Console;
namespace p72
{
class MainApp
{
static void Main(string[] args)
{
float a = 69.6868f;
WriteLine("a : {0}", a); // a : 69.6868
double b = (double)a;
WriteLine("b : {0}", b); // b : 69.6868
float x = 0.1f;
WriteLine("x : {0}", x); // x : 0.1
double y = (double)x;
WriteLine("y : {0}", y); // y : 0.100000001490116
}
}
}
부동 소수점 형식의 특성상 오버플로우가 존재하지 않음 하지만 정밀성에 손상을 입음
3. 부호 있는 정수 형식과 부호 없는 정수 형식 사이의 변환
using System;
using static System.Console;
namespace p74
{
class MainApp
{
static void Main(string[] args)
{
int a = 500;
WriteLine(a);
uint b = (uint)a;
WriteLine(b);
int x = -30;
WriteLine(x);
uint y = (uint)x; // 언더 플로우 발생
WriteLine(y);
}
}
}
4. 부동 소수점 형식과 정수 형식 사이의 변환
using System;
using static System.Console;
namespace p75
{
class MainApp
{
static void Main(string[] args)
{
float a = 0.9f;
int b = (int)a;
WriteLine(b); // 0
float x = 1.1f;
int y = (int)x;
WriteLine(y); // 1
}
}
}
5. 문자열과 숫자 사이의 변환
using System;
using static System.Console;
namespace p77
{
class MainApp
{
static void Main(string[] args)
{
int a = 123;
string b = a.ToString();
WriteLine(b); // 123
float c = 3.14f;
string d = c.ToString();
WriteLine(d); // 3.14
string e = "123456";
int f = Convert.ToInt32(e);
WriteLine(f); // 123456
string g = "1.2345";
float h = float.Parse(g);
WriteLine(h); // 1.2345
}
}
}
숫자 -> 문자
int a = int.Parse("12345");
문자 -> 숫자
int c = 12345;
string d = c.ToString();
ㅇ 상수와 열거 형식 |
상수와 열거 형식은 변수와 달리 안에 담긴 데이터를 절대 바꿀 수 없는 메모리 공간
프로그래머의 실수, 원치않은 데이터 변경을 막아 프로그램의 버그를 줄여줌
ㅇ 상수 (const ) |
const int a = 30;
변수의 선언과 동일 단, const 키워드 사용
ㅇ 열거 (enum) |
메세지를 선택하는 YES, CANCEL의 값을 실수로 1이라는 값으로 지정하게 되면 YES를 선택했을 때
CANCEL이 작동하게 됨
이처럼 같은 범주에 속하는 여러 개의 상수를 선언할 때 아주 유용함
enum Message { YES, NO, CANCEL, OK}
- 열거 형식은 enum 키워드 사용
- 자동으로 YES = 0, NO = 1, CANCEL = 2, OK = 3 할당됨.
- 중복되어 값이 할당되는걸 방지해줌
- 정수 계열만 사용할 수 있으며, 생략할 경우 컴파일러가 자동으로 int로 디폴트해줌
- Mssage는 변수가 아닌 새로운 형식임
- Message a = Message.YES; 식의 활용이 가능함
enum Message { YES = 10, NO,CANCEL, OK= 50, CONFIRM}
- 값을 직접 할당할 수 있음
- YES =10 이고 NO는 10부터 순차적으로 할당됨
- NO = 11, CANCEL = 12, OK = 50, CONFIRM = 51
ㅇ Nullable 형식 |
0이 아닌 비어 있는 변수, Null 상태인 변수
int? a = null;
float? b = null;
double? c = null;
- 데이터형식 뒤에 '?' 키워드 사용
- 값 형식에 한해서 사용가능
- 참조 형식은 사용 불가
ㅇ Nullable 형식의 2가지 속성 |
"HasValue"
해당 변수가 값을 갖고 있는지 또는 그렇지 않은지를 나타냄
int? a = null;
Console.WriteLine(a.HasValue) // a는 null 이므로 false 출력
"Value"
변수에 담겨 있는 값을 나타냄
int? a = null;
a = 3;
Console.WriteLine(a.Value); // 3 출력
ㅇ Var 키워드 |
C#은 강력한 형식의 언어임 이는 프로그래머의 실수를 줄여 주는 장점이 있음
Var 키워드는 약한 형식 검사로 자동으로 형식을 지정해줌
var a = 3; // int형 지정
var b = "Hellow" // string형 지정
- 지역 변수로만 사용가능
- 선언과 동시에 초기화 해줘야함 ( 초기화 값이 없으면 컴파일러가 형식을 지정할 수 없음)