분류 전체보기

Programming/C# & Unity

C# Foreach Closure

C#에서 람다를 사용하여 람다 밖에서 사용 중인 변수를 가져오면(캡처하면) 항상 레퍼런스로 전달되는 것 처럼 처리가 된다. (람다-클로저 관련 원리에 대한 간략한 포스팅) for (int i = 0; i { Thread.Sleep(1000); Console.WriteLine(i); }).Start(); } // 10이 10번 출력됨. 위의 경우에는 하나의 i가 10번 레퍼런스 전달되었고, 1초뒤에 forloop가 전부 끝나서 10이 된 i가 10번 출력되게 된다. 그렇다면 foreach를 사용하면 어떨까? foreach (int i in Enumerable.Range(1, 10)) { new Thread(() => { Thread.Sleep(1000)..

Programming/C# & Unity

C# 박싱

개요 흔히 면접 준비 때 박싱에 대해서 공부하게 된다. 하지만 실무에서는 거의 대부분 고려할 일이 없어서 시간이 지날수록 왜곡된 기억과 함께 여러 오해가 생기게 되었는데 관련해서 정리하려 한다. 박싱에 대하여 Stack에 있던 값을 Heap으로 옮기는 작업. 스택에 있는 값을 Heap으로 옮기면서, Heap에 메모리 할당, 값 복사가 일어나서 느리다. 더 자세한 내용은 구글에 C# 박싱을 검색.... int a = 5; object boxedA = a; Dictinary의 Key로 enum을 사용하면 안 되는가? .Net 4.0부터 Dictinary가 개선되어서 문제가 없어졌다. 이전에는 Dictinary 내부에서 Equal 함수를 사용하는데 이때, Enum 간 Equal 체크 시에 박싱이 일어나는 문제..

Programming/MSSQL

MSSQL GO문 트랜잭션

개요 MSSQL에서 스키마를 다량으로 추가/수정하는 쿼리를 테스트하려고 [BEGIN TRAN]-[ROLLBACK TRAN]을 걸고 테스트하는 도중, [ROLLBACK TRAN]이 씹히고 스키마가 모조리 변경되는 대참사가 발생한 이슈가 있어서 기록 및 제대로 이해하려는 목적으로 포스팅을 한다. GO를 사용하지 않는 트랜잭션 BEGIN TRAN SELECT @@TRANCOUNT -- : 1 CREATE TABLE [dbo].[TEST1] -- 추후에 롤백됨. ( [id] INT ); CREATE TABLE [dbo].[TEST1] -- 중복 생성으로 인한 에러가 발생하고, 트랜잭션이 롤백된 채로 이후 모든 명령어가 무시된다. ( [id] INT ); SELECT @@TRANCOUNT -- : 출력되지 않는다..

카테고리 없음

MSSQL EXISTS 구문의 서브 쿼리 평가

-- 테스트 테이블 세팅 CREATE TABLE Test1 ( uidBIGINT CONSTRAINT PK_TEST1 PRIMARY KEY (uid) ) CREATE TABLE Test2 ( uidBIGINT, scoreBIGINT, CONSTRAINT PK_TEST2 PRIMARY KEY (uid) ) INSERT INTO Test1 VALUES (1) INSERT INTO Test1 VALUES (2) INSERT INTO Test2 VALUES (1, 0) -- Test2에 uid가 존재하는 uid만 출력하기. SELECT * FROM dbo.Test1 AS A WHERE EXISTS ( SELECT 1 FROM dbo.Test2 AS B WHERE A.uid = B.uid ) MSSQL에서 사용하는..

Programming/MSSQL

MSSQL 특정한 값 제외 평균

개요 Invalid한 값 0을 제외한 값들로 평균을 내고 싶어졌다. 그럴땐 IFNULL을 사용하면 된다. 본론 -- 테스트 테이블 세팅 CREATE TABLE Test1 ( uidBIGINT, scoreBIGINT, CONSTRAINT PK_TEST1 PRIMARY KEY (uid) ) GO INSERT INTO dbo.Test1 VALUES (1, 1) INSERT INTO dbo.Test1 VALUES (2, 5) INSERT INTO dbo.Test1 VALUES (3, 3) INSERT INTO dbo.Test1 VALUES (4, 0) INSERT INTO dbo.Test1 VALUES (5, 0) INSERT INTO dbo.Test1 VALUES (6, 0) INSERT INTO dbo.Te..

Programming/MSSQL

MSSQL 데드락 그래프

MSSQL에서 데드락 그래프를 뽑는 방법을 기록한다. 1. SSMS를 이미 설치해 놨다면, 아마도 깔려 있을 SQL Server Profiler 18을 실행한다. 2. [파일] -> [새 추적]을 누른다. 3. 접속 정보를 확인하고 연결 한다. 4. [이벤트 선택] -> [Locks] -> [Deadlock graph]를 체크한 다음 [실행]을 누른다. 5. 아래와 같이 창이 떴다면 이제 데드락을 일으켜 보자. -- 테스트 테이블 세팅 CREATE TABLE Test1 ( uid BIGINT, item1 Varchar(10), item2 Varchar(10), item3 Varchar(10), CONSTRAINT PK_TEST1 PRIMARY KEY (uid) ) GO INSERT INTO dbo.Tes..

Programming/MSSQL

MSSQL 페이지 위치 쿼리

작업 중에 MSSQL에서 현재 데이터가 어떤 페이지(물리적 페이지)에 있는지 알아야 하는 일이 있었는데, 그때 사용한 쿼리들을 정리하였다. 1. 테이블의 Page 현황 조사 쿼리 SELECT DB_NAME(PA.database_id) [DataBase], OBJECT_NAME(PA.object_id) [Table], SI.Name [Index], is_allocated, allocated_page_file_id [file_id], allocated_page_page_id [page_id], page_type_desc, page_level, previous_page_page_id [previous_page_id], next_page_page_id [next_page_id] FROM sys.dm_db_dat..

Programming/MSSQL

MSSQL 한번에 여러 row 빠르게 넣기

MSSQL에서 row을 임의로 삽입할 때, 가장 쉽게 생각할 수 있는 루프 문을 사용하는 방법으로 하면 몇천만 건씩 넣을 경우 매우 매우 느리다. 그래서 아래와 같은 방법으로 쿼리를 넣으면 꽤나 대량의 row도 순식간에 넣을 수 있다. -- 1000000 개의 순차적인 uid의 row를 넣는 쿼리. INSERT INTO [dbo].[Test1] SELECT TOP (1000000) Id = CONVERT(INT, ROW_NUMBER() OVER (ORDER BY s1.[object_id])), 1, 2, 3 FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2

Programming/C# & Unity

C# static 멤버 함수

개요 static 멤버 함수를 어떨 때 사용하면 좋은지 공유하기 위하여 포스팅하였다. 일반적인 사용처 class TestClass { private static int initCount = 0; public TestClass() { Interlocked.Increment(ref initCount); } public static void PrintInitCount() { Console.WriteLine(initCount); } } TestClass.PrintInitCount(); 제일 많이 쓰는 방법. 한 클래스의 범 인스턴스적으로 공용하여 쓰는 static 멤버 변수를 외부 클래스에서 사용하거나 해야 할 때 위와 같이 static 멤버 변수를 많이 쓴다. this를 사용하지 않는 멤버 함수 알리기 cla..

Programming/C# & Unity

C# Async Await 원리

개요 전에는 그냥 대충 [Async 함수를 호출하면 ThreadPool에서 Task를 하나 꺼내서 함수를 던져주겠지~]라고 생각했었다. 하지만 현실은 물론 그렇지 않았으며, 내부에서 신기하고 재미있는 일이 일어나고 있어서 포스팅을 남기려 한다. 예제 static class DBExecutor { static public async Task ExecuteDB(string spName, long accountId) { string result; Console.WriteLine($"DB 연결 시작"); await Task.Delay(2000); Console.WriteLine($"{spName} 호출 시작."); await Task.Delay(2000); Console.WriteLine($"{spName} 호..

장형이
'분류 전체보기' 카테고리의 글 목록 (2 Page)