2013년 12월 31일 화요일

[C#] Boxing과 UnBoxing

* Boxing

값 타입에서 참조타입으로의 변환을 의미한다.
Boxing 과정은 Stack 메모리에 저장되는 값들을 Heap 메모리로 옮긴다.

ex)
int stackValue = 10;
object boxedValue = stackValue;
* Unboxing

참조타입에서 값 타입으로의 변환을 의미한다.
Unboxing 과정은 Heap 메모리에 저장된 값들을 Stack 메모리로 옮긴다.

ex)
int stackValue = 10;
object boxedValue = stackValue;
int UnboxedValue = (int) boxedValue;

* 단점

- Boxing이 필요한 곳이 있으나 Performance와 메모리 사용량을 늘리기에 사용을 자제해야 한다.
- Unboxing은 NullReferenceException을 생기게 할 수도 있다.
ex)
int? stackValue = null;
object boxedValue = stackValue;
int unBoxed = (int)boxedValue;

* 사용이유

현재는 잘 사용하지 않으나 Generic 이전에는 사용하였다.
ex)
ArrayList x = new ArrayList();
x.Add(10); // Boxing
int y = (int) x[0];


2013년 12월 29일 일요일

[Programming] 싱글톤 사용 이유, 단점

* 싱글톤 사용 이유

1) 지정한 클래스 인스턴스가 절대로 한개밖에 존재하지 않는 것을 보증하고 싶을 경우 싱글톤 패턴을 사용한다.

2) 보통 객체 생성 시 new 키워드를 사용하여 객체화 한다.
객체를 생성하게 되면 그 클래스의 인스턴스는 Heap 메모리에 올라가게 되고 그 인스턴스를 가리키고 있는 변수는 Stack 메모리 영역에 생기게 된다.
이러한 작업 자체가 시간이 걸리는 일이며 한 객체를 여러번 new하게 되면 시간이 더욱 오래 걸리게 된다.

그래서 자주 사용되는 객체는 한번만 생성하고 Heap에 존재하는 이 객체를 가르키도록만 만들면 된다. 즉, 객체가 생성될 때 Heap 영역에 올라가는 시간과 메모리를 줄일 수 있다.


* 싱글톤 단점

1) 싱글톤을 사용하여 여러곳에서 효과적으로 호출할 수 있어서 편하지만 결과적으로 프로그램의 Coupling을 높이게 되어 한곳에서의 변경이 다른 부분에 영향을 미치게 될 확률이 높아지게 된다.

2) 멀티 쓰레드 응용 프로그램에서 명시적 초기화가 필요한 경우, 쓰레딩 문제를 예방하기 위해서 조치를 취해야 한다.

[Programming] 메모리 영역(code, data, stack, heap)

1) code 영역
- 코드 자체를 구성하는 메모리 영역으로 Hex파일이나 BIN파일 메모리다.
- 프로그램 명령이 위치하는 곳으로 기계어로 제어되는 메모리 영역이다.
   
2) data 영역
- 전역변수(global), 정적변수(static), 배열(array), 구조체(structure) 등이 저장된다.
     가) 초기화 된 데이터는 data 영역에 저장되고,
        나) 초기화 되지 않은 데이터는 BSS (Block Stated Symbol) 영역에 저장된다.
- 프로그램이 실행 될 때 생성되고 프로그램이 종료 되면 시스템에 반환 된다.
- 함수 내부에 선언된 Static 변수는 프로그램이 실행 될 때 공간만 할당되고, 그 함수가 실행 될 때 초기화 된다.
   
Q) data영역과 bss 영역을 구분 하는 이유?
   컴파일 해서 이미지를 올릴 때 초기화 되지 않은 데이터까지 올리게 되면 ROM 사이즈가 커지기 때문에 구분하지 않았을까? -> 혹시 정확히 아시는 분은 답변 부탁 드립니다. 
   
3) heap 영역
- 필요에 의해 동적으로 메모리를 할당 하고자 할 때 위치하는 메모리 영역으로 동적 데이터 영역이라고 부르며, 메모리 주소 값에 의해서만 참조되고 사용되는 영역이다.
- 이 영역에 데이터를 저장 하기 위해서 C는 malloc(), C++은 new() 함수를 사용한다.
   
 4) stack 영역
프로그램이 자동으로 사용하는 임시 메모리 영역이다.
- 지역(local) 변수, 매개변수(parameter), 리턴 값 등 잠시 사용되었다가 사라지는 데이터를 저장하는 영역이다.
- 함수 호출 시 생성되고, 함수가 끝나면 시스템에 반환 된다.
- 스택 사이즈는 각 프로세스마다 할당 되지만 프로세스가 메모리에 로드 될 때 스택 사이즈가 고정되어 있어, 런타임 시에 스택 사이즈를 바꿀 수는 없다.
- 명령 실행시 자동 증가/감소 하기 때문에 보통 메모리의 마지막 번지를 지정 한다.

출처)

[Programming] 전역변수 사용 이유, 단점

* 전역변수 사용 이유

1) 전역적으로 사용할 수 있다.

2) 함수가 종료되어도 해당 변수가 소멸되지 않고 계속해서 메모리에 저장되어 있도록, 저장된 값을 사라지지 않고 누적되게끔 할 수 있다.


* 전역변수의 단점

1) 오브젝트들은 사용 범위가 좁을수록 이용하기 쉽다. 전역변수는 반대로 사용 범위도 넓어  처음에는 쉽게 사용하게 되지만 이러한 사용이 쌓이다 보면 어떻게 사용하게 되는지 이해하기가 어려워진다.

2) 많은 곳에서 사용되다 보니 가독성과 신뢰성이 떨어지며 객체지향 프로그래밍에서의 은폐성 요소를 갖추지 못하게 된다.

3) 직간접적으로 다른 변수, 함수들과 연관성을 가지게 되므로 프로그램의 규모가 커질수록 커플링(Coupling)이 심해진다.

4) 지역변수, 전역변수의 이름이 겹치는 문제를 발생시킬 수 있다.

5) 여러 쓰레드 사용 시 전역변수 접근과 관련하여 안정성이 떨어질 수 있다.

2013년 12월 24일 화요일

[Unity] Admob SDK For Unity

Admob을 유니티에 붙이기 위하여 제공되는 Admob SDK For Unity에 대한 간단한 사용법이다.

1. Admob 공식 블로그를 통하여 SDK를 다운 받는다. [바로가기]

2. 다운받은 SDK 파일에 들어있는 유니티 Package 파일을 유니티가 실행되어 있는 상태에서 더블 클릭하여 Import 시킨다.

3. Plugins/AdMobPlugin/ 폴더에 들어있는 AdMobPlugin 프리팹을 씬에다가 드래그하여 놓는다.

4. 만약에 Plugins/Android/ 폴더에 AndroidManifest.xml 파일이 없으면 만들어 넣어야 하는데 이 작업을 위하여 프로젝트 빌드를 한번 해준다. 그리하면 '프로젝트 폴더/Temp/StringArea/' 경로에 AndroidManifest.xml 파일이 생성되어 있는 것을 확인 할 수 있다. AndroidManifest.xml 파일을 Plugins/Android/ 경로에 복사하여 넣자.

5. 공식 SDK 다운로드 사이트를 통하여 최신 버전의 Admob SDK를 받을 수 있는데 그 파일 중 확장자가 jar인 파일을 Plugins/Android/ 폴더에 넣도록 하자. [바로가기]

6. Plugins/Android/에 있는 AndroidManifest.xml을 수정해주어야 하는데

activity android:name="com.unity3d.player.UnityPlayerNativeActivity" 이 부분의 하위에 아래와 같이 추가해준다.


      
      
       
       
      
    
7. 아래 코드와 같은 내용이 다른 곳에 있다면 삭제한다.

       
       

8. AdMob에 가입하고 발급받은 키를 AdMobPluginDemoScript 스크립트 안의 AdMobPlugin.CreateBannerView() 메소드의 첫번째 인자로 입력한다.

9. 빌드하여 결과물을 확인한다.

[Unity] Error building Player: Wind32Exception: ApplicationName~

유니티에서 APK 빌드 시, "Error building Player: Wind32Exception: ApplicationName~" 이라는 에러가 발생했다.

검색 결과, 해결 방법은 아래와 같다.

1) JDK (Java Development Kit)의 설치 버전을 64 bit가 아닌 32 bit로 설치한다.

2) Android SDK Tool의 rev (revision의 줄임 같다.) 버전이 22로 설치되어 있으면 그 아래 버전으로 삭제하고 다시 설치하자. 포럼에서 찾아본 결과 rev 22 버전과 유니티 간에 문제가 있는 것 같다.

[NGUI] 하나의 UILabel에서 한글은 A 폰트를 영어는 B 폰트를 사용하고 싶다면?

* NGUI v3.0.7, Dynamic Font 기준

하나의 UILabel에서 여러개의 폰트를 같이 사용하려면 어떻게 해야 할까?

UILabel에서는 하나의 폰트 밖에 적용이 되지 않아 보인다.

그리하여 복수개의 폰트를 UILabel에서 사용하고자 할 때는 하나의 폰트로 합쳐서 사용해야 하는 편이 가장 수월하다고 생각하였다.

FontCreator라는 프로그램으로 폰트를 수정할 수 있는데, 즉 B폰트의 영문자를 복사하여 A폰트에 붙여넣을 수 있다.

 프로그램 사용법에 대한 설명은 아래 주소를 통하여 확인 할 수 있다.

http://gyuha.tistory.com/245

[Blog] CraftyFella's Blog

CraftyFella's Blog

[Unity] 재귀를 통한 자식 객체 리턴 메소드

* 자식들을 재귀를 통하여 탐색하고 인자로 전달된 이름과 동일한 객체를 리턴하도록 한다.
private GameObject GetChildGameObject( string name )
{
 Transform result = FindTransform( gameObject.transform, name );
 
 if( null == result )
  return null;
  
 return result.gameObject;
}

private Transform FindTransform( Transform parent, string name )
{  
 if( parent.name.Equals( name ) ) return parent;
  
 foreach( Transform child in parent )
 {
  Transform result = FindTransform( child, name );
  if( result != null ) return result;
 }
  
  return null;
}