1. 처음 만드는 C# 프로그램
세미콜론 사용 이유
긴 문장을 여러 줄에 걸쳐 사용하거나 짧은 여러 문장을 한줄에 몰아 넣을 때 세미콜론을 사용하여 문장을 마치는 방법이 그렇지 않은 방법보다 훨씬 유용한다는 것을 알 수 있다.
클래스
C# 프로그램을 구성하는 기본 단위로서 데이터와 데이터를 처리하는 기능(메소드)로 이루어진다.
CLR( ( Common Language Runtime)
C#으로 만든 프로그램은 CLR 위에서 실행된다.
.NET 프레임워크와 OS 위에 설치된다.
C# 컴파일러가 만들어낸 실행 파일은 하드웨어가 이햏랄 수 없는 코드로 구성되어 있기 때문에 실행할 수 없다.
C#컴파일러는 C# 소스코드를 IL(Intermediate Language)라는 중간 언어로 작성된 실행 파일을 만들어 낸다.
사용자가 이 파일을 실행시키면 CLR이 중간 코드를 읽어 들여 다시 하드웨어가 이해할 수 있는 네이티브 코드로 컴팡리한 후 실행시킨다. 이것을 JIT(Just In Time 컴파일) 이라고 한다. = 적시 컴피ㅏ일
JIT 컴파일이란 실행에 필요한 코드를 실행할 때마다 실시간으로 컴파일해서 실행한다는 뜻이다.
C#컴파일러가 C# 소스코드를 IL 중간언어로 컴파일하여 실행파일을 만듬
CLR이 IL 중간 코드를 읽어 하드웨어가 이해할 수 있는 네이티브 코드로 컴파일하여 실행하는 JIT 컴파일 수행
즉 두번의 컴파일이 수행된다는 것이다. 왜 이렇게 하는가?
CLR은 C#뿐만 아니라 다른 언어도 지원되도록 설계되어 있다. C#만을 컴파일할 목적이라면 C# 소스 코드를 바로 네이티브 코드로 변환시키면 되지만, 다른 언어도 컴파일해야하므로 컴파일 가능한 모든 코드를 IR 중간언어로 컴파일하고, 하나의 언어로 번역된 IR 코드를 네이티브 코드로 번역하는 것이다.
장점은 플랫폼에 최적화된 코드를 만들어낼 수 있다.는 것.
(CLR이 자신이 설치 되어 있는 플랫폼에 IR 코드를 최적화 시켜 컴파일 하기 때문이다.)
단점은 컴핑리 비용이 증가하ㄴ다는 것이다. (그러나 컴파일 비용은 사용자에게는 부담이 없음)
2. 데이터 보관하기
3. 기본 데이터 형식의 사용 방법 익히기
4. 상수가 무엇인지 알아보고 사용 방법을 익히기
5. Nullable 형식을 이해하기
6. C#의 데이터 형식과 공용 형식 시스템의 관계를 이해하기
데이터 형식이란?
소프트웨어에 필요한 데이터를 편리하게 사용할 수 있도록 데이터의 형식을 미리 만들어 제공한다.
데이터 형식은 수와 텍스트는 물론, 이미지나 소리를 다룰 수 있는 형식도 존재한다.
C#은 기본 본 데이터 형식과 복합 데이터 형식을 지원한다. (값 형식과 참조 형식으로도 분류할 수 있ㄷ)
값 형식 : 데이터에 값이 직접 포함되는 형식이다.
값 형식 변수 하나를 다른 변수에 대입하면 변수에 폼함된 값이 '복사'된다.
모든 값 형식은 암시적으로 System.ValueType에서 ㅍ ㅏ생ㄷ왼다.
값 형식에서는 새 형식을 파생시킬 수 없다 (참조 형식ㄷ과과 대비)
구조체는 참조 형식과 마찬가지로 인터페이스를 구현할 수 있다.
값 형식에는 null값이 포함될 수 없다 ( 참조와 대비)
참조 형식 : 데이터에 대한 참조가 저장되는 방식이다.
두 가지 변수가 같은 개체를 참조할 수 있으므로 한 ㅂ녀수에 대한 작업이 다른 변수에서 참조하는 개체에 영향을 미칠 수 있다. (값 형식과 대비)
참좋 형식에는 클래스, 인터페이스, 델리게이트가 있다.
다이나믹, 오브젝트, 스트링의 기본 참조 형식도 존재한다.
참조 형식 변수의 경우 위의 상황에서 개체 자체가 아니라 개체에 대한 참조가 복사된다.
https://parksh86.tistory.com/114
기본 데이터 형식
15가지
숫자 형식, 논리 형식, 문자열 형식, 오브젝트 형식으로 나눠진다.
문자열, 오브젝트 형식은 참조 형식
나머지는 값 형식
숫자 형식
정수 계열 형식 : 정수 데이터를 담기 위해 사용하는 형식
D
오버플로우 : 데이터 형식의 최대값을 넘어가는 데이터를 저장할 때 일어나는 현상
새로운 자리수의 비트(저장 불가능한)는 버려짐.
언더플로우 : 데이터 형식의 최소값보다 작은 데이터가 저장될 때 일어나는 현상.
CHAR : 정수계열이라고 한다.
부동 소수점 형식
소수점이 고정되어 있지 않고 움직이면서 수를 표현한다는 뜻에서 붙여진 이름.
고정 소수점을 이용할 때보다 더 제한된 비트로 훨씬 넓은 범위의 값을 표현할 수 있기 때문에 사용한다.
부동 소수점은 정수를 대체하지 못한다.
소수점 표현을 위해 일부 비트를 사용하기 때문에 정수 계열의 크기를 표현하는데 제한이 있다.
부동 소수점 형식은 산술 연산 과정이 정수 계열 형식보다 복잡해서 느리다.
float, double 이 부동 소수점 형식에 속한다.
문자, 문자열 형식
char, string
char는 정수, 문자 둘다
논리형식
bool : 1비트면 표현할 수 있으나 컴퓨터가 기본으로 다루는 데이터의 크기가 바이트 단위이므로 1byte를 통채로 사용
Object 형식
어떤 데이터든지 다룰 수 있는 데이터 형식 -> 상속 덕분에 가능.
object가 몯느 데이터를 다룰 수 있도록 "모든 데이터 형식(기본, 복합, 사용자 정의 모두 포함)이 자동으로 object 형식을 상속받게 한 것이다. = 모든 데이터 형식의 조상이 object 형식이다 (여기서 말하는 상속은 클래스의 상속과 기능은 유사하다. 다만 상속의 대상이 클래스가 아닌 데이터 형식인 상황이다)
이러한 기능으로 인하여 어떠한 데이터라 할지라도 ojbect에 담아 처리할 수 있게 되는 것이다.
그러나
float 형식의 부동 소수점 방식, decimal 형식은 소수를 처리하는 방식이 다르고
s(igned) 유무에 따라 부호 있는 형식과 부호 없는 형식을 처리하는 방식이 다르다.
그렇다면 object는 위와같은 상황이 발생했을 때 어떤 기준에 의해 처리하는 방식을 선택하는 것인가?
0>>> 이거 해결방법은 아직 안나옴...
이 문제를 이해하기 위해서 박싱, 언박싱 메커니즘을 이해해야 한다.
object는 참조 형식이므로 힙 공간에 데이터를 할당한다.
ojbect에 들어가는 값은 float이나 double같은 값 형식 데이터가 저장될 수 있다.
object 형식은 값 형식의 데이터를 힙에 할당하기 위하여 boxing 기능을 제공한다.
ojbect 형식에 값 형식 데이터를 할당하려는 시도가 일어난다면 ojbect 형식은 Boxing을 수행ㅇ하여 해당 데이터를 힙에 할당한다.
object a = 20;
반대로 Boxing된 값을 꺼내 값 형식 변수에 저장하는 과정을 Unboxing이라고 한다.
object a = 20;
int b= (int)a;
데이터 형식 변경하기
1.크기(표현 범위)가 서로 다른 정수 형식 사이의 변환
작은 정수 형식의 변수를 큰 정수 형식의 변수로 옮긴다면 문제 없음.
큰 정수 형식을 작은 변수 형식으로 옮긴다면 '오버 플로우'가 발생한다.
2. 크기(표현 범위)가 서로 다른 부동 소수점 형식 사이의 변환
부동 소수점 형식의 특성상 오버 플로우는 발생하지 않으나 '정밀성'에 손상을 입게된다.
3.부호가 있는 정수 형식과 부호 없는 정수 형식 사이의 변환
int 형식에 음수를 담고 음수를 표현할 수 없는 uint 형식에 형변환 한다면 언더 플로우가 발생한다.
4. 부동 소수점 형식과 정수 형식 사이의 변환
부동 소수점 변수 -> 정수 == 소수점 아래는 버려지고 소수점 위 값만 남는다 (0.1 = 0)
5. 문자열 <> 숫자 변환
C#은 정수 계열, 부동 소수점 형식 모두에 Parse()라는 메소드를 이용하여 문자열->숫자 변환이 가능하게 한다.
또한 object로부터 물려받은(오버라이딩된) ToString()메소드로 숫자->문자열 변환이 가능하다.
상수와 열거 형식
상수와 열거형식은 안에 담긴 데이터를 절대 변경할 수 없는 메모리 공간이다.
상수는 c++과 동일하게 const 키워드를 붙여 사용한다.
프로그래머의 실수를 방지하기 위해 사용한다. (값이 변경되어서는 않되는 변수를 상수화 하는 방법으로)
열거형식
열거형식 마찬가지로 c++과 동일하게 enum 키워드를 이용한다.
상수가 너무 많아진다면 프로그래머가 혼동할 수 있으므로 enum으로 문자화하여 사용한다.
Nullable 형식
C#은 변수를 초기화 하지 않고 사용하려 한다면 컴파일 오류를 일으킨다.
그러나 특정 상황에서는 초기화 하지 않은 변수가 필요할 수도 있다.
이러한 경우 Nullable 형식을 이용하는 것이다.
사용방법 : 원래의 데이터 형식 이름 뒤에 '?'을 붙인다.
int? a = null; ( int? a; 이렇게만 하면 Nullable이 적용되지 않아 사용하려고 할 때 컴파일 오류가 발생한다.)
- 값 형식은 비워둘 수 없는 데이터이므로 null로만 초기화 한다면 오류가 생긴다.
Nullable 형식을 사용할 수 있는 경우는 '값 형식'인 경우에만 가능하다. = 참조 형식에서는 불가능하다.
- Object a = null; 이러한 형태는 가능.
모든 Nullable 형식은 HasValue와 Value 두 가지 속성을 지닌다. ( 속성은 c++ 멤버변수처럼 사용한다 a.HasValue)
HasValue : 해당 Nullalbe 변수가 값을 갖고 있는지 않은지를 나타낸다.
Value : 해당 Nullable 변수에 담겨있는 값을 나타낸다.
C# 컴파일러의 특성과 var 키워드
C#은 변수 상수 등에 대한 컴파일을 세밀하게 수행하는강력한 형식의 언어 Strong Typed Language 이다.
이러한 특징은 프로그래머의 실수를 줄일 수 있다는 장점이 있다. ( 의도치 않은 데이터 형식을 읽거나 할당하는 일방지
이러한 형식과 상반되는 약한 형식의 검사는 코드를 작성하는 단계에서 좀 더 편리하다는 장점이 있다.
데이터 형식을 지정하지 않고 변수를 선언해서 데이터를 할당하면 컴파일러가 알아서 값을 보고 변수의 형식을 지정하기 때문이다.
C#은 var 키워드를 통해 해당 키워드를 선언한 부분에 대하여 약한 형식의 검사를 하게하는 기능을 가지고 있다.
데이터 형식을 지정하지 않고 var으로 선언하면 위와같은 편의성을 사용할 수 있게된다.
var a = 3; // int a = 3;
var 키워드는 '지역 변수로만 사용'가능하다.
클래스의 필드를 선언할 때는 반드시 명시적 형식을 선언해야한다.
클래의 필드는 선언과 같이 초기화를 하지 않는 경우가 많은데... var zl키워드로 필드를 선언하면 컴파일러가 형식을 알 수 없 게 되기 때문이다.
참고로 C#에서는 전역 변수를 더이상 지원하지 않는다고 한다.
object a = 20;
var b = 20;
둘의 차이점은
전자는 CLR이 박싱해서 20을 힙에 넣고 a가 힙ㅇ을 가리키도록 만드로고
후자는 컴파일 시점에서 컴파일러가 a에 적합한데이터 형식을 파악해서 int a = 20; 으로 바꿔 컴파일하는 것이다.
CLR이 해당 코드를 실행하게된 시점에서는 a 가 var로 선언되었는지 모르고 int 형식으로 객체 a에 20을 담아 스택에 올리는 것이다.
공용 형식 시스템
C#의 모든 데이터 혀ㅑㅇ식 체계는 공용 형식 시스템 CTS(common type system) 이라는 .NET 프레임워크의 형식 체계의 표준을 그대로 따르는 것이다.
이로인하여 .NET 언어들 끼리 서로 호환성을 가지게 되는 장점이 있다.
확인
값 형식과 참조 형식의 차이
박싱과 언박싱