C#프로그래밍 01 : .NET플랫폼, 자료형

LeeWonjin·2022년 3월 11일
0

[학부]C#프로그래밍

목록 보기
1/21
post-thumbnail

.NET 플랫폼

소프트웨어 플랫폼

OS차이에 따른 응용프로그램 실행환경의 문제를 해결하는 소프트웨어

실행과정

  1. 소스코드
    └─C#컴파일러─→ CLR로더 + IL코드(Intermediate Language)
  2. IL코드
    └─CLR 컴파일─→ Native코드

CLR (Common Language Runtime)

  • JIT (Just in Time) 컴파일 : 실제 실행시점에 컴파일
  • .NET에서 : CLR이 프로그램 실행시점에 IL코드를 Native코드로 변환

.NET 호환 언어

중간 언어로 변환되는 언어

  • CTS (Common Type System) : .NET 호환언어가 구현될 수 있는 최대한의 범위.
  • CLS (Common Language Specification) : .NET 호환언어가 만족해야 할 최소한의 언어사양

e.g.

CTS의 System.Int32는 C#에서 int로 구현되었다. 따라서 아래 두 문장은 동일하다.

System.Int32 a = 123;
int b = 123;

.NET프로그램 구성요소

  • 라이브러리 : 클래스, 네임스페이스, 인터페이스의 집합
  • 프레임워크 : IOC (Inversion of Control)이 있는 대규모 라이브러리.

IOC : 응용프로그램의 초기화부터 종료까지의 흐름이 사용자코드가 아닌 프레임워크에 의해 관리되는 것


자료형 기본

선언, 할당, 출력

int a = 5;
Console.Write(a);

위와 같이 선언, 할당하고 출력한다. a는 변수, 5는 리터럴이다.

종류

  • 분류방법1
    • 기본 데이터 형식 : 숫자, 논리, 문자열, 오브젝트 등
    • 복합 데이터 형식 : 구조체, 클래스, 배열 등
  • 분류방법2
    • 값 형식 : 숫자, 논리, 구조체 등
    • 참조 형식 : 문자열, 오브젝트, 클래스, 배열 등
  • 분류방법3 (일부 자료형 해당)
    • 부호있는 값 (signed)
    • 부호없는 값 (unsigned)

메모리영역

  • 스택 영역
    • 적재 : 코드블록 시작 { 이후로 선언된 순서로 변수 값 적재
    • 삭제 : 코드블록 끝 } 에서 선언 역순으로 메모리 자동 삭제
  • 힙 영역
    • 개발자가 원할 때 까지 데이터를 유지할 수 있는 공간
    • 삭제 : CLR 가비지컬렉터에 의해 삭제

변수의 메모리 적재 방법

  • 값 형식 변수 : 스택 영역에 데이터 저장
  • 참조 형식 변수 : 힙 영역에 데이터 저장, 스택영역에 해당 힙영역 메모리주소 저장.

자료형별 특징

정수 데이터

범위 초과
  • overflow
  • underflow
부호있는 정수

음수 표현 시 2의 보수 방식 이용
(이유 : 단순히 최상위비트의 0,1로 부호를 판별하면, 0이 두 개 존재하는 낭비 발생)

-1을 나타내고자 하는 경우,
1 = 0000_0001(2)
비트 반전 : 1111_1110(2)
1 더하기 : 1111_1111(2)
여기서, 1111_1111(2) = -1

실수 데이터

float, double, decimal
float의 경우 부호/지수/가수부분으로 나뉨
지수부는 (지수+127)의 값이 입력됨

문자형

char (16bit)

논리형

bool (8bit, true/false)

object형

  • 개념
    모든 데이터형식이 상속받는 형식. (어떤 데이터도 다룰 수 있는 형식)
object i = 123;
Console.WriteLine(a); // 123 출력

e.g. int는 object - System.ValueType - int 순서로 상속받음

  • 박싱(Boxing) : 값 형식의 데이터를 힙에 할당
  • 언박싱(Unboxing) : 박싱된 값을 값 형식 변수에 저장

형변환

  • 암시적변환 : 작은 범위의 자료형에서 큰 범위의 자료형으로 변환

    부동소수점 형식간 변환 : float를 double로 바꾸는 과정에서 정밀도가 손상될 수 있음. 즉, (double)0.1f가 0.1임을 보장할 수 없음.

  • 명시적변환 : 범위 관계없이 개발자가 의도한 대로 변환

    부동소수점을 정수로 변환 : 소수점 버리는 형태로 변환됨

  • 문자열-숫자간 변환

    • 자료형.Parse(문자열)
      string str = "123";
      int num = int.Parse(str);
      Console.WriteLine(num); // 123
    • 숫자.ToString()
      float num = 5.3f;
      string str = num.ToString(num);
      Console.WriteLine(str); // "5.3"

상수와 열거형

데이터 변경 불가

상수

const 자료형 상수명 =;

열거형

enum 이름 : 기반자료형 {상수1=1, 상수2=2, ... }
  • 기반자료형 : 정수계열 (byte, short, int, char ....). 만약 생략할 경우 int로 처리됨
  • 값 할당 : 값을 할당하지 않으면 0부터 시작. 할당되지 않은 상수는 앞 상수값에 1 더한 값으로 지정됨.

e.g.

class Program {
		enum Subject { ML, DS = 53, CSHARP }
		static void Main(string[] args){
			Console.WriteLine(Subject.ML); // "ML"
			Console.WriteLine(Subject.DS); // "DS"
			Console.WriteLine(Subject.CSHARP); // "CSHARP"
			Console.WriteLine((int)Subject.ML); // 0
			Console.WriteLine((int)Subject.DS); // 53
			Console.WriteLine((int)Subject.CSHARP); // 54

			Subject this_is_variable = Subject.DS;
			Console.WriteLine(this_is_variable); // "DS"
			Console.WriteLine((int)this_is_variable); // 53
		}
	}

Nullable과 var

Nullable

null값을 가질 수 있는 자료형

int? a = null;
Console.WriteLine(a.HasValue) // false
Console.WriteLine(a == null) // true
Console.WriteLine(a.Value) // Runtime error

var

var키워드로 변수를 선언과동시에 할당하면, 해당 변수의 자료형이 자동지정됨.

var integer = 53; // 정수 리터럴이 입력되었으므로, int interger = 53; 과 같은 동작

값형식 변수 선언시 object와 var의 차이 : object는 박싱/언박싱이 일어나지만, var는 아니다.

profile
노는게 제일 좋습니다.

0개의 댓글