C#은 컴파일 타임에 정적으로 데이터 형이 지정되므로, 변수의 형을 변환하지 않으면 

다시 선언하거나 다른 형의 값에 넣는 것이 불가능 하다.

ex) int형을 String 형으로 변환하여 넣을 수 없다.

그렇다면 C# 에서의 변수나 매개변수의 값을 복사해야 하는 경우 어떻게 할까?

1) 암시적 변환

파생클래스 -> 기본클래스 혹은 int16 -> int32 등 변환을 할 때, 변환에 대한 안정성과 데이터 손실에 대한 리스크 없이 데이터 형이 변환되는 것

동일 데이터 형의 작은 타입 -> 동일 데이터 형의 큰 타입으로 암시적 변환 수행

2) 명시적 변환 (캐스트)

암시적 변환은 [작은 데이터형(long)]을 [큰 데이터 형(float, double)]으로 변환하는 과정이기 때문에 값의 손실이 없다.

반대의 경우에는 값 손실이 발생할 수 있다. 이 경우 명시적 형 변환을 사용한다.

출처 : https://guslabview.tistory.com/68

 

Object -> 특정 클래스 로 갈떄, 혹은 int32 -> int16 등 변환시 값의 손실이 발생할 수 있거나, 변환이 실패할 수 있는 경우 명시적 전환을 사용함.

 

Posted by 팡다츄
,

API란?

응용 프로그램 프로그래밍 인터페이스로써, 응용 프로그램에서 사용할 수 있도록, 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스를 뜻한다.

주로 파일제어, 창제어, 화상처리, 문자제어 등을 위한 인터페이스를 제공한다.

그렇다면 인터페이스란?

기본 설계도라고 할 수 있는, 일종의 추상 클래스임

추상 클래스와 같이 추상 메소드를 가지지만, 추상 클래스보다 추상화 정도가 높다.

일반 메소드, 멤버 변수를 구성원으로 가질수 없고, 추상 메소드와 상수만을 멤버로 가질수가 있다.

- 인터페이스 작성

interface 인터페이스이름

 public static final 타입 상수이름 = 값;

 public abstract 메소드 이름 (매개변수 목록);

모든 멤버변수는 public static final 이어야 하며, 이를 생략 할 수 있다.

모든 메소드는 public abstract 이어야 하고, 생략이 가능하다.

출처 : https://ithub.tistory.com/3

- 인터페이스의 장점

1. 개발시간을 단축 할 수 있다.

2. 표준화가 가능하다

3. 서로 관계없는 클래스들에게 관계를 맺어 줄 수 있다.

4. 독립적인 프로그래밍이 가능하다.

Posted by 팡다츄
,

1.유니티에서의 안드로이드  
mono와 il2cpp 방식의 차이 

2. 유니티의 렌더링 파이프 라인의 방식 

3. 가비지콜렉터의 동작원리 

4. 코루틴의 yiled return의 종류 

5. 유니티의 프로파일러 

7. 유니티의 NGUI와 UGUI 

8. Finite State Machine. 

9.이진 바이너리 트리 

10. 객체지향과 절차지향의 차이 

11. 추상클래스란? 

12. 오버로딩과 오버라이딩

Posted by 팡다츄
,

값 형식과 참조 형식의 차이

[값형식]

-메모리의 Stack에 할당된다.

-변수에 값이 직접 저장됨.(Stack)

-기본 생성자는 예약되어 있음.

(Object와 String을 제외한 모든 형식은 값 기반 형식임)

[참조형식]

-메모리의 Heap에 할당된다.

-Stack의 변수가 Heap의 데이터 내용을 참조하여 저장한다.

=> 두 기반 형식의 가장 큰 차이점은 참조기반 형식은 Heap에 할당이 되고, 

값 기반 형식은  Stack에 할당이 된다는 것임.

Heap은 객체를 할당하여, 사용하지 않을 때 제거될 수 있으며,

Stack은 { } 블록 범위에서 메모리가 할당과 해제된다.

박싱과 언박싱 

1) 박싱(boxing)

값 타입을 Object 형식 또는 이 값 형식에서 구현된 임의의 인터페이스 형식으로 변환하는 것

기존에 저장된 Stack 영역에서 Heap 영역에 값 형식을 저장한다.

이처럼 int 값 형식의 변수를 Object라는 참조 형식으로 형 변환 하는 것.

그 목적은?

보통 파라미터로 전달이 되거나 List<Object> 형식으로 모든 값들을 입력받는 목적으로도 사용함

위 작성한 코드는 메모리상에서 아래와 같이 할당됨.

출처 : https://hongjinhyeon.tistory.com/90

스택 영역에 있는 i 값이 o로 변환 되면서 object 형식으로 선언이 되고, 값이 복사가 된다.

박싱은 보통 암시적으로 되며, 명시적으로도 가능하다.

[박싱의 과정]

1. 값 타입을 Heap에 생성하기 위해 메모리를 Heap 영역에 생성함.

2. 값을 Heap 영역에 할당된 메모리로 복사

3. 참조할 변수에 할당된 메모리 주소를 할당

1) 언박싱(unboxing)

Object 형식에서 값 형식으로, 또는 인터페이스 형식에서 해당 인터페이스를 구현하는 값 형식으로 변환하는 것.

[언박싱의 과정]

1. 개체 인스턴스가 지정한 값 형식을 박싱된 값인지 확인한다.

2. 박싱된 값이라면 값 타입 변수에 복사한다.

3. 박싱한 메모리와 언박싱한 메모리 2개 존재 (가비지 발생)

-> 모든 객체는 값 형식으로 언박싱 될 수 없고, 이전에 박싱이 된 데이터에 한하여 언박싱이 가능하다.

또한, 박싱하기 이전의 타입을 따라야 한다.

출처 : https://hongjinhyeon.tistory.com/90

위 그림에서 int를 박싱한 o의 객체를 다시 int 타입의 j 값에 넣고 있음.

-> 언박싱을 할 때 다른 타입으로 하거나, 해당 타입보다 작은 범위로 변환을 하면 오류가 발생한다.

이 때는 미리 같은 타입인지를 먼저 확인하는 절차를 거쳐야 한다.

is 연산자를 이용해서 미리 같은 타입인지 확인 후에 캐스팅을 해야 안전하다.

=> 박싱과 언박싱에는 많은 시간이 소모된다.

되도록이면 제네릭을 사용해서 박싱과 언박싱이 일어나지 않도록 구성을 해야하며, 사용한다면

그 타입에 맞는 캐스팅을 해서 오류가 없이 처리해야 할 것임.

 

Posted by 팡다츄
,

실수 표현한것을 뒤에서부터, 메모리에 순차적으로 적재

C1 = 1100 0001 

C8 = 1100 0100 

x가 메모리에 적재된 위치를 찾아서 4비트 중에서 마지막 C1을 확인하면 해당 실수의 부호를 확인 가능함.

 

00 00 c8 c1에서 00 이 한 바이트임.

 

Posted by 팡다츄
,

작은 경진대회를 준비하며, 아두이노와 안드로이드가 어플리케이션을 통해서 통신하여

안드로이드 어플로 아두이노를 제어하고, 아두이노 모듈값을 받아와서 안드로이드 화면에 뿌려주는 어플을 만들었는데,

 

얼마전 대학생활하며 이것저것 했던 파일을 모아놓은 USB가 터지면서,

내가 만든 어플의 소스코드를 볼수가 없게되었다..

 

참 다행스럽게도, 그 당시에 교수님에게 보냈던 메일에 apk이 첨부되어있는것을 발견하고, apk는 구해냈다.

 

한 2014, 15년도 쯤에 한창 [악성 몸캠 어플]이 판을 치던 때가 있었는데,

그런 어플들은 어떻게 사용자의 핸드폰에 있는 정보를 다 얻어갈수 있는걸까? 라는 궁금증에

완벽하지는 않지만, 조금은 디컴파일을 해봤던 경험이 있었기에, 디컴파일을 해보기로 했다.

 

 

apk 파일을 디컴파일 하는 방법에는 크게 두가지가 있는것 같다.

① Dex2jar를 이용하는 방법

② Jadx 를 이용하는 방법

 

처음 디컴파일을 접해보았을때 ①방법을 사용해보았기에 이번에는 ②방법을 사용해보기로 했다.

 

★Jadx Decompile

1. Java최신버전 설치

 -> https://java.com/ko/download/

 

2. Jadx 설치

 -> https://github.com/skylot/jadx/releases/tag/v0.9.0

 

skylot/jadx

Dex to Java decompiler. Contribute to skylot/jadx development by creating an account on GitHub.

github.com

-> 저는 해당 페이지 하단의 "jadx-gui-0.9.0.exe" 파일을 사용했습니다.

3. Jadx 압축 해제 및 실행후 GUI 실행

-> 해당 프로그램을 실행하면, 처음에 apk를 선택하는 창이 나온다.

 

-> apk를 선택하고 나면, 해당 apk의 소스 파일을 볼수 있다.

(단, 저는 제가 만든 apk였고, 간단한 경진대회 제출용 apk여서 난독화 작업은 진행하지 않은 apk 파일입니다.)

 

내가 만들었던 apk파일에서 어떻게 구현했더라.. 하는 부분이 있었는데,

걱정했던 부분이 조금은 해결되서 다행인것 같다.

Posted by 팡다츄
,

C언어에서 지역변수는 메모리의 Stack에 저장된다 라는 말을 이해한 내용이다

왜 지역변수를 Stack의 개념으로 메모리에 할당할까 하고 생각하던중에 든 생각

C언어에서

...

main 함수가 있고 main 함수 위에 다른 함수가 존재해 선언 되어있다면 그럼 3개의 함수"main func1 func2 "가 존재한다하고
func1에서 func2 를 호출하여 사용하는 함수이고
3개의 함수 모두 지역변수 이름은 num이라고 할때

main 함수에서 우선 사용된 변수 num(num1로 얘기하자)이
stack에 저장되고
main함수에서 호출한 func1의 변수 num(num2라고 하자)가 stack에
저장되고
func1에서 호출한 func2의 변수 num(num3)가 stack에 저장되고

func2가 종료되서 num(num3)가 사라지고
func1가 종료되서 num(num2)가 사라지고
main 함수가 종료되면서 num(num1)이 사라진다 
                num3
        num2 num2                  num2
num1 num1 num1 로 저장되고 num1 num1 사라진다.

로 이해하였다.

추가로 Stack은 LIFO 방식이며

Stack에 저장되는 다른 정보로는
=지역변수가 반환후 돌아가는 주소
=Stack Frame (경계선정도로 이해하자) 가 있다.

 

 

 

'C언어' 카테고리의 다른 글

Return 0에 관하여  (0) 2015.04.26
Posted by 팡다츄
,

Return 0에 관하여

C언어 2015. 4. 26. 18:51

return 은 함수가 아니라 , C언어의 키워드 즉, "예약어"이다.

C언어는 뒤에 소괄호 () 가 없으면 함수가 아니다.

 

return은 현재 있는 함수에서 빠져나가며, 함수를 호출한 곳으로 되돌아간다 라는 뜻이다.

되돌아 가면서 함수를 호출한곳에 어떤값을 반환하는 것이다.

 

return 0; 의 뜻은 "0이라는 값을 반환한다 " 라는 의미이며,

return 1; 의 뜻은 "1이라는 값을 반환한다." 라는 의미이다.

return 은 함수 어느 곳에서도 위치하는것이 가능한데

return 이 실행되는 즉시 그 함수는 무.조.건 실행이 종료된다.

return 은 두가지 의미를 지닌다.

1. 함수의 종료

2. 값의 반환

때문에 반환하는 값이 없는 void main () 함수에서도 return 을 종료의 목적으로 사용하는 것이 가능하다.

return 0이란 무엇일까?

"return 0"이 가지는 의미는 "에러없이 정상적으로 프로그램이 종료되었다"는 뜻이다.

에러가 존재했다면 1 2 -1 등을 반환한다.

쉘에 반환되는값은 0 이 TRUE 입니다.

0 외의 값은 에러 코드입니다

보통 1을 True, 0을 False 로 생각하는데

일반적으로 함수가 의미하는 바에 따라서 리턴값이 달라진다

1. boolean계열의 의미를 지니는 경우는 1이 TRUE이고 0이 FALSE인 경우가 많다

2. 여러가지 integer값을 반환하는 경우는 0이 TRUE, 음수가 FALSE, 양수가 특정 상태를

반환하는경우가 종종 있다.

한줄로 요약하자면 return 0은 정상 종료했다는 뜻으로 사용된다.

 

 

 

 

 

출처 : http://mwultong.blogspot.com/2006/07/c-return-return-0.html

'C언어' 카테고리의 다른 글

C언어에서의 지역변수  (0) 2015.05.05
Posted by 팡다츄
,