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)
- 부동 소수점 형식이 정수 형식을 대체하지 못하는 이유
- 부동 소수점 형식은 소수점을 표현하기 위해 일부 비트를 사용하기 때문에 같은 크기의 정수 계열 형식과 같은 크기의 수를 표현할 수 없다.
- 부동 소수점 형식은 산술 연산 과정이 정수 계열보다 복잡해서 느리다.
- 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의 종류
- Read Uncommitted(레벨 0)
- SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리지 않는 계층이다.
- 트랜잭션에 처리중이거나, 아직 Commit되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.
- 데이터베이스의 일관성을 유지하는 것이 불가능하다.
- Read Committed(레벨 1)
- SELECT 문장이 수행되는 동안 해당 데이터에 Shared Lock이 걸리는 계층이다.
- 트랜잭션이 수행되는 동안 다른 트랜잭션이 접근할 수 없어 대기하게 된다.
- Commit이 이루어진 트랜잭션만 조회 가능하다.
- 대부분의 SQL 서버가 Default로 사용하는 Isolation Level이다.
- Repeatable Read(레벨 2)
- 트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리는 계층이다.
- 트랜잭션이 범위 내에서 조회한 데이터 내용이 항상 동일함을 보장한다.
- 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정 불가능하다.
- MySQL에서 Default로 사용하는 Isolation Level이다.
- 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 |