Study/TIL(Today I Learned)

24.09.19 C#, CS

에린_1 2024. 9. 19. 23:04
728x90

C#

using System;

  • using
    • C#의 키워드 중 하나다.
  • System
    • C# 코드에 기본적을 필요한 클래스를 담고 있는 네임스페이스다.
  • ;(세미콜론)
    • 컴파일러에게 문장의 끝을 알려준다.

using static

  • 어떤 데이터 형식의 정적 멤버를 데이터 형식의 이름을 명시하지 않고 참조하겠다.

전역 using(global using)

  • 소스파일 한 곳에서만 네임스페이스를 참조하면 프로젝트 내 모든 파일에서 별도의 using문 없이 해당 네임스페이스를 참조할 수 있도록 한다.

파일 범위 네임스페이스

  • namespace 선언 뒤에 {} 대신 ;(세미콜론)을 붙이면 그 파일의 모든 코드는 해당 네임스페이스 소속으로 들어간다.

Static void Main(string[] args){}

  • 이 메소드는 프로그램의 진입점(Entry Point)으로서 프로그램을 시작하면 실행되고, 이 메소드가 종료되면 프로그램도 역시 종료된다. 따라서 모든 프로그램은 반드시 Main이라는 이름을 가진 메소드를 하나 가지고 있어야 한다.
  • static 한정자(modifier)로서 메소드나 변수등을 수식한다.

CLR(Common Language Runtime)

  • 프로그램이 실행되면 CLR(Common Language Runtime)은 프로그램을 메모리에 올린 후 프로그램의 진입점을 찾는데, 이때 Main() 메소드가 static 키워드로 수식되어 있지 않다면 진입점을 찾지 못했다는 에러 메시지를 남기고 프로그램을 종료시킨다.
  • C#으로 만든 프로그램은 CLR 위에서 실행된다.
  • C# 컴파일러는 C# 소스코드를 컴파일 해서 IL(Intermediate Language) 이라는 중간 언어로 작성된 실행 파일을 만들어낸다. 사용자가 이 파일을 실행시키면 CLR이 중간 코드를 읽어들여 다시 하드웨어가 이해할 수 있는 네이티브 코드로 컴파일 한 후 실행시킨다. 이것을 JIT(Just In Time) 컴파일이라고 부르는데, 우리말로 ‘적시 컴파일’이라고 한다. 실행에 필요한 코드를 실행할 때마다 실시간으로 컴파일해서 실행한다는 뜻이다.
  • CLR은 단순히 C#이나 기타 언어들을 동작시키는 환경 기능 외에도, 프로그램의 오류가 발생했을 때 이를 처리하도록 도와주는 기능, 언어간 상속 지원, COM과의 상호운용성 지원, 그리고 자동 메모리 관리(가비지 컬렉션)등의 기능을 제공한다.

C# 데이터 형식

  • 기본 데이터 형식(Primitive Type)
  • 복잡 데이터 형식(Complex Data Type)

  • 값 형식
  • 참조 형식

변수(Variable)

  • 데이터를 담는 일정 크기의 공간
  • 초기화(Initalization)
    • 변수에 최초의 데이터를 할당하는 것을 의미한다. C언어나 C++에서는 변수를 선언한 후 아무 데이터도 입력하지 않으면 이 변수에 ‘쓰레기 데이터’가 들어간다. 프로그래머가 쓰레기 데이터를 담고 있는 변수를 그대로 사용하면 소프트 웨어가 엉뚱하게 동작하곤 한다.
    • C#은 이런 문제를 미연에 방지하도록 초기화를 강제한다.
  • 리터널(Literal)
    • 컴퓨터 과학에서 리터널은 고정값을 나타내는 표기법을 말한다.

값 형식과 데이터 형식

  • 값 형식(Value Type)은 변수가 값을 담는 데이터 형식이다.
  • 참조 형식(Reference Type)은 변수가 값 대신 값이 있는 곳의 위치(참조)를 담는 데이터 형식을 말한다.

C# 기본 데이터 형식

숫자 데이터 형식

  • 정수 계열 형식 (Integer Type)
    • 정수 데이터를 담기 위해 사용한다.
    • byte
    • sbte
    • short
    • ushort
    • int
    • uint
    • long
    • ulong
  • 부동 소수점 형식 (Floating Point Type)
    • 부동 소수점 형식이 정수 형식을 대체하지 못하는 이유
      1. 부동 소수점 형식은 소수점을 표현하기 위해 일부 비트를 사용하기 때문에 같은 크기의 정수 계열 형식과 같은 크기의 수를 표현할 수 없다.
      2. 부동 소수점 형식은 산술 연산 과정이 정수 계열보다 복잡해서 느리다.
    • float 단일 정밀도 부동 소수점 형식
    • double 복수 정밀도 부동 소수점 형식
    • C#의 float 와 double은 IEEE754 라는 표준 알고리즘에 기반한 데이터 형식이다. 부동 소수점 형식에는 float와 double 두 가지가 있지만, float보다는 double을 사용하는 것을 권한다. double이 float에 비해 메모리를 두 배로 사용하지만 그만큼 float에 비해 데이터 손실이 적기 때문이다.

Decimal 형식

  • 실수를 다루는 데이터 형식
  • decimal 29 자리 데이터를 표현할 수 있는 소수 형식
  • 16 바이트

문자 형식과 문자열 형식

  • char 형식은 정수를 다루는 데이터 형식 출신이지만, 수가 아닌 문자 데이터를 다룬다. 작은 따옴표( ‘ ‘ )로 문자를 감싸줘야 한다.
  • string 형식은 문자들을 다루는 데이터 형식이다.
    • 정해진 크기나 담을 수 있는 데이터 범위가 따로 정해져 있지 않다. 변수가 담는 텍스트의 양에 따라 그 크기가 달라진다.
    • string 형식의 변수는 문자열 데이터를 큰 따옴표(” “)fh anRdj 담는다.
  • 문자열 하나에 여러 줄을 담기 위해서는 이스케이프 문자를 사용해야 한다. \n은 줄 바꿈 new line을 나타내는 이스케이프 문자로서, 문자열 사이에 입력하면 해당 이스케이프 문자 뒤에 따라오는 문자열은 다음 줄에 표시된다.
  • 큰 따옴표를 세 개 붙여 쓰면(’’’ … ‘’’) 이스케이프 문자의 도움 없이도 여러 줄로 이어진 문자열 리터럴을 만들 수 있다.

논리 형식 Boolean Type

  • 참(true), 그리고 거짓(false) 두 가지 데이터를 다룬다.

Object 형식

  • object는 물건 객체라는 뜻이다. object 형식은 어떤 물건이든 다룰 수 있는 데이터 형식이다. 모든 데이터 형식이 자동으로 object 형식으로 부터 상속 받게 되어있다.

박싱과 언박싱

  • object 방식은 참조이기 때문에 힙에 데이터를 할당한다.
  • object 형식은 값 형식의 데이터를 힙에 할당하기 위한 ‘박싱’(boxing) 기능을 제공한다. object 형식에 값 형식의 데이터를 할당하려는 시도가 이루어지면 object 형식은 박싱을 수행해서 해당 데잍터를 힙에 할당한다.
  • 힙에 있던 값 형식 데이터를 값 형식 객체에 다시 할당해야 하는 경우 박식된 값을 꺼내 값 형식 변수에 저장하는 과정을 일컬어 ‘언박싱’(unboxing) 이라고 한다.

데이터 형식 바꾸기

  • 변수를 다른 데이터 형식의 변수에 옮겨 담는 것을 형식변환(type conversion)이라고 한다.
  • 형식변환
    • 크기(표현 범위)가 서로 다른 정수 형식 사이의 변환
    • 크기(표현 범위)가 서로 다른 부동 소수점 형식 사이의 변환
    • 부호있는 정수 형식과 부호없는 정수 형식 사이의 변환
    • 부동 소수점 형식과 정수 형식 사이의 변환
    • 문자열과 숫자 사이의 변환

상수와 열거형식

  • 상수(constant)와 열거형식(enumerator)는 변수와 달리 안에 담긴 데이터를 절대 바꿀 수 없는 메모리 공간이다.
  • 열거 형식에서 기반 자료형은 정수 계열만 사용할 수 있으며, 생략할 경우 컴파일러가 int를 기반 자료형으로 사용한다.

Nullable 형식

  • 비어있는 상태가 될 수 있는 형식
  • 데이터 형식? 변수이름; 로 선언한다.
    • 데이터 형식 이름 뒤에 ‘?’를 붙여준다.
  • nullable 형식을 사용할 수 있는 경우는 값 형식에 한해서 이다. 참조 형식은 사용할 수 없다.
  • 모든 nullable 형식은 hasvalue와 value 두 가지 속성을 갖고 있다.
    • hasvalue : 해당 변수가 값을 가지고 있는지
    • value : 변수에 담겨 있는 값

var 데이터 형식을 알아서 파악하는 똑똑한 C# 컴파일러

  • C#은 변수나 상수에 대해 깐깐하게 형식 검사를 하는 강력한 형식의 언어이다.
  • C#은 강력한 형식 검사를 하는 언어이지만, var 키워드를 통해서 약한 형식 검사를 하는 언어의 편리함도 지원한다.
  • 단, var 키워드를 이용해서 변수를 선언하려면 반드시 선언과 동시에 초기화까지 해줘야 한다.
  • var은 지역 변수로만 사용할 수 있다.

CS

트랜잭션 격리 수준(Transaction Isolation Level)

Isolation Level

  • 트랜잭션에서 일관성 없는 데이터를 허용하도록 하는 수준이다.

Isolation level의 필요성

  • 데이터베이스는 ACID 특징과 같이 트랜잭션이 독립적인 수행을 하도록 한다.
  • 따라서 Locking을 통해, 트랜잭션이 DB를 다루는 동안 다른 트랜잭션이 관여하지 못하도록 막는 것이 필요하다.
  • 하지만 무조건 Locking으로 동시에 수행되는 수많은 트랜잭션들을 순서대로 처리하는 방식으로 구현하게 되면 데이터베이스의 성능은 떨어지게 될 것이다.
  • 그렇다고 해서, 성능을 높이기 위해 Locking의 범위를 줄인다면, 잘못된 값이 처리될 문제가 발생하게 된다.

Isolation level의 종류

  1. Read Uncommitted(레벨 0)
    • SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리지 않는 계층이다.
    • 트랜잭션에 처리중이거나, 아직 Commit되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.
    • 데이터베이스의 일관성을 유지하는 것이 불가능하다.
  2. Read Committed(레벨 1)
    • SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리는 계층이다.
    • 트랜잭션이 수행되는 동안 다른 트랜잭션이 접근할 수 없어 대기하게 된다.
    • Commit이 이루어진 트랜잭션만 조회 가능하다.
    • 대부분의 SQL 서버가 Default로 사용하는 Isolation Level이다.
  3. Repeatable Read(레벨 2)
    • 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리는 계층이다.
    • 트랜잭션이 범위 내에서 조회한 데이터 내용이 항상 동일함을 보장한다.
    • 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정 불가능하다.
    • MySQL에서 Default로 사용하는 Isolation Level이다.
  4. Serializable(레벨 3)
    • 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리는 계층이다.
    • 완벽한 읽기 일관성 모드를 제공한다.
    • 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정 및 입력 불가능하다.

선택 시 고려사항

  • Isolation Level에 대한 조정은, 동시성과 데이터 무결성에 연관되어 있다.
  • 동시성을 증가시키면 데이터 무결성에 문제가 발생하고, 데이터 무결성을 유지하면 동시성이 떨어지게 된다.
  • 레벨을 높게 조정할 수록 발생하는 비용이 증가한다.

낮은 단계 Isolation Level을 활용할 때 발생하는 현상들

  • Dirty Read
    • 커밋되지 않은 수정중인 데이터를 다른 트랜잭션에서 읽을 수 있도록 허용할 때 발생하는 현상이다.
    • 어떤 트랜잭션에서 아직 실행이 끝나지 않은 다른 트랜잭션에 의한 변경사항을 보게 되는 경우에 발생한다.
      • 발생 Level: Read Uncommitted
  • Non-Repeatable Read
    • 한 트랜잭션에서 같은 쿼리를 두 번 수행할 때 그 사이에 다른 트랜잭션 값을 수정 또는 삭제하면서 두 쿼리의 결과가 상이하게 나타나는 일관성이 깨진 현상이다.
      • 발생 Level: Read Committed, Read Uncommitted
  • Phantom Read
    • 한 트랜잭션 안에서 일정 범위의 레코드를 두 번 이상 읽었을 때, 첫번째 쿼리에서 없던 레코드가 두번째 쿼리에서 나타나는 현상이다.
    • 트랜잭션 도중 새로운 레코드 삽입을 허용하기 때문에 나타나는 현상이다.
      • 발생 Level: Repeatable Read, Read Committed, Read Uncommitted
728x90

'Study > TIL(Today I Learned)' 카테고리의 다른 글

24.09.23 C++, CS  (0) 2024.09.23
24.09.20 C++, CS  (0) 2024.09.20
24.09.12 C++, CSAPP  (0) 2024.09.12
24.09.11 C++, CSAPP  (2) 2024.09.11
24.09.09 코테, CS  (1) 2024.09.09