var이 생소한 분들도 있고 익숙한 분들도 있겠죠.
많은 분들이 var과 object에 대해서 큰 고민없이 사용하고 있는데요.

익명타입인 var은 C# 3.0에서부터 지원하는 기능입니다. 일반적으로 변수를 선언할때 명시적으로 변수의 타입을 선언하는데요.

익명타입을 사용할 경우 자동으로 할당받은 타입으로 인식됩니다. 이는 object와는 큰 차이가 있습니다. object는 해당 타입을 boxing하는 과정을 통해서 기존의 타입을 감추는 것이였지만, var에서는 이러한 과정이 없습니다.

프로그래머는 타입을 신경쓰지 않고 var를 사용하면 컴파일러가 자동으로 변수의 타입을 인식하는 것이죠.

일반적으로 var이 사용되는 경우는 2가지가 있는데요. 가장 흔하게 사용되는 경우는 이미 정해진 타입의 변수를 새로운 메모리에 할당하는 경우입니다.

예를 들면


var numbers = new List<int>();

이런 코드이죠. 이미 오른쪽에서 리스트를 생성하여 numbers라는 변수에 할당하였죠. 이 경우 numbers는 별도의 unboxing 과정이 없어도 리스트로 인식됩니다.

이런 경우로 사용할 경우 지켜줄 원칙이 있는데요. 다른 사람이 자신의 코드를 읽을때 new로 생성한 변수는 해당 변수의 타입을 쉽게 알 수 있지만, 함수나 다른 변수로부터 가져오는 경우 한번 더 확인하는 과정이 필요하기 때문에 왠만하면 var를 사용하지 않거나 변수이름에 타입을 유추할 수 있도록 적어주는 것이 중요합니다. (물론 개인적인 의견입니다.)

2번째 경우는 new 라는 키워드를 이용해서 익명타입을 생성하는 경우인데요.


var students = new[]
{
     new { Name = "KSY", Score = "89" },
     new { Name = "LTW", Score = "50" },
     new { Name = "KHJ", Score = "37" },
}

이런식으로 생성하게 되면 별도의 클래스를 생성하지 않아도 자신이 원하는 타입의 변수를 만들 수 있습니다. 하지만 익명타입의 경우 다른 사람이 쉽게 파악하기 어렵다는 단점이 있기 때문에 내부적으로 사용하는 것을 추천합니다.
frame이라고 하면 영화나 게임에서 많이 사용되는 단어입니다. 한 순간의 장면을 뜻 하는 단어이죠. 컴퓨터에서 프레임이 어떻게 쓰이는지 알아보겠습니다.

게임을 하시는 분들은 fps라는 단어를 보았을 것이고 영상에 1080 30p 이런 단어를 보았을 것입니다. fps나 p나 둘다 같은 의미로 1초에 몇개의 프레임을 보여줄 것인지 표현하는 단위입니다.

처음 필름 영화시절 엄청 커다란 필름에 영사기를 통해서 상영하곤 했죠. 이때 필름에는 수많은 장면들이 연속적으로 기록되어 있고 이를 빠르게 돌리면 연속된 장면이 나오게 됩니다. 이런 원리를 필름이 아닌 디지털로 표현하면서 발전했습니다.

즉 프레임이라고 하면 한 순간의 장면를 담는 틀이라고 생각하면 됩니다.

실제 인간의 눈은 30p에 가장 가깝다고 해요. 그래서 30p보다 프레임이 작은 영상의 경우 살짝 끊어지는 느낌을 받죠. 상업 영화에서는 주로 24p를 사용하는 시네마틱한 효과를 주기 위함이라고 해요. 30p보다 2배 높은 60p의 경우 엄청 부드러운 느낌이 들겠죠.

컴퓨터에서 랜더링이라는 단어가 있습니다.
랜더링이란 한 프레임을 컴퓨터 화면에 그리는 행위를 말해요. 컴퓨터에서는 fps라는 단어를 주로 사용합니다. 한 프레임을 그리는 행위를 랜더링이리고 했으니까. 60fps 게임은 랜더링을 1초에 60번 하는 것이죠. 고사양 게임일수록 랜더링에 필요한 자원이 많아지고 이를 처리하기 위해 컴퓨터도 좋아져야 하죠.

그렇기 때문에 단순한 계산이라도 그래픽 랜더링에서는 많은 영향을 주는 것이죠. 매순간마다 엄청난 계산을 하기 때문이죠.

그런데 만약에 한번 계산된 값이 특정시간동안 같은 모습으로 그려져야할 경우 이를 매순간 계산하는 것은 매우 비효율적인 일이겠죠? 이런 경우 버퍼를 이용해서 불필요한 계산을 하지 않도록 특정 공간에 저장해서 재사용합니다.
System는 다양한 기능을 제공하고 있습니다.
그중에서 DateTime에 대해서 이야기하겠습니다.

DateTime은 시간과 날짜에 대한 정보를 담고 있습니다.

컴퓨터 바탕화면을 기준으로 좌측 하단에 나오는 시간이 바로 DateTime입니다.

DateTime에는 Now라는 변수가 있는데요.
이는 Now를 호출하는 시점의 시간을 반환합니다.
 그리고 ToString(" ")이라는 함수를 이용해서 원하는 결과를 가져올 수 있습니다.

아래 코드는 순서대로 년도, 월, 일, 시간, 분, 초를 가져오는 방법입니다.


string year = System.DateTime.Now.ToString("yyyy");
string month = System.DateTime.Now.ToString("MM");
string day = System.DateTime.Now.ToString("dd");
string hour = System.DateTime.Now.ToString("hh");
string minute = System.DateTime.Now.ToString("mm");
string second = System.DateTime.Now.ToString("ss");


그리고 C#에서는 DateTime을 통해서 복잡한 기능을 쉽게 사용할 수 있는데요.

바로 부등호나 등호를 이용해서 날짜를 비교할 수 있다는 것이죠.


DateTime past = new DateTime();
DateTime now = new DateTime();
DateTime future = new DateTime();


이렇게 3가지 과거, 현재, 미래를 표현하는 DateTime이 있다고 할때, past < now는 true기 됩니다.

따라서 달력을 이용해서 어떤 프로그램을 만들때 부등호나 등호를 사용하면 쉽게 날짜에 대한 검색이 가능하겠죠.

C#에 존재하는 접근제한자는 4가지입니다.
기본값은 private입니다.

접근제한자는 클래스, 변수, enum, 함수 앞에 적어주게 되고, 선언된 접근제한자의 영향을 받습니다.

1. public
public으로 선언된다면 어느 곳에서든 자유롭게 사용될 수 있습니다. 아무런 제한을 받지 않고 원하는 곳에서 사용됩니다.

2. private
private으로 선언되면 약간의 제한을 갖게 됩니다. 예를 들어 어떤 클래스에 변수들이 private으로 선언된 경우 해당 클래스에서만 접근이 가능합니다.

3. internal
internal로 선언된다면 해당 프로젝트에 public처럼 사용됩니다. 자신의 프로젝트에서 내부적으로 사용된다는 뜻이죠. 이는 외부에서 사용될 가능성이 있는 프로젝트에서 유용하게 사용됩니다. 해당 프로젝트의 사용자가 굳이 몰라도 되는 정보를 감추는 것이죠. 클래스를 생성할 경우 아무런 접근제한자를 선언하지 않았다면, 기본값은 internal 입니다.

4. protected
protected로 선언된다면 상속받은 자식의 클래스에서만 사용 가능한 제한을 갖습니다.

접근제한자를 잘 고려해서 프로그램을 만든다면 코드를 구조화하고 체계적으로 정리할 수 있는 장점이 있습니다. 개인적으로 접근제한자는 항상 명시적으로 선언해주는 습관을 가지면 좋다고 생각해요.


C#에서는 네임스페이스라는 것이 있습니다.
다른 언어에도 비슷한 것들이 있죠. 예를 들면 자바에서는 패키지가 있죠..
뭐 언어마다 각각 만들어진 이유가 있고, 그 쓰임새가 다르지만 대부분 원리는 비슷해요.

네임스페이스는 과연 무슨 기능을 하는 것일까요?

코딩을 하다보면 프로그램이 커지고 한 프로그램 안에서 같은 이름의 클래스를 생성할 수 있죠..
컴퓨터는 이름이 같은 클래스는 같은 클래스로 인식하기 때문에 클래스의 이름은 유일한 키워드를 사용해야 합니다.
하지만 이때 같은 이름을 같은 클래스를 여러개 만들 수 있는데요. 
네임스페이스를 이용하면 가능합니다. 

네임스페이스는 클래스보다 위에 있는 레벨로 프로그램의 전체 구조를 표현하는 키워드입니다. 
네임스페이스는 여러 단어를 조합해서 만들 수 있어요. 

namespace 라는 키워드를 선언하고 뒤에 자신이 원하는 단어를 적어주면 됩니다. 

namespace project01 
namespace project01.myName
이런식으로 네임스페이스를 다르게 만들 경우 같은 이름의 클래스를 사용할 수 있게 됩니다. 
일반적으로 네임스페이스 결정하는 방법이 있는데요.

namespace 회사명.팀명.**.** 이런 식으로 사용하거나 팀명 뒤에 프로젝트 이름을 사용하기도 합니다. 

하지만 절대적으로 이렇게 해야한다는 원칙은 없습니다. 단순히 구분만 가능하면 되는거니까요.

네임스페이스를 더 쉽게 이해하려면 폴더구조를 생각하면 됩니다. 
사진을 폴더로 정리를 한다면 
나라별로 폴더를 만들고 그 폴더안에 날짜로 나누고 필요하면 더 자세하게 나누듯이 
네임스페이스도 그렇게 나누면 됩니다.


1. 삼각망 인덱싱 (Mesh Indexing)


1) 정의 (Definition)


특정 형상을 여러개의 삼각망으로 표현하기 위해 각 정점마다 특정 인덱스를 할당하여, 삼각망 정보를 만드는 행위.


Assigning a specific index to each vertex in order to represent a specific shape with multiple triangles.


2) 원리 (Principle)


(1)  형상을 표현하기 위한 최소 정점을 저장한다. (ex. 삼각형은 정점 3개, 사각형은 정점 4개, 정육면체는 정점 8개)

(2)  정점 3개를 선택하여 하나의 삼각형을 만든다. 

(3)  정점 3개를 선택하면서 각 정점에 인덱스를 부여하고 저장한다.

(4)  (2) ~ (3) 의 방법을 반복하면서 모든 형상을 삼각형으로 표현한다.


(1)  Store the minimum vertex for expressing the shape (ex. The triangle has 3 vertices, The rectangle has 4 vertices, The cube has 8 vertices) 

(2)  Select 3 vertices to make one triangle.

(3)  Assign and Store an index on each vertex, when 3 vertices are selected. 

(4)  Repeat Step (2) ~ (3) to represent all shapes as triangle.



2. 예제 (Example)



작성중... (Creating .... )

+ Recent posts