값 형식과 참조 형식의 차이

[값형식]

-메모리의 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 팡다츄
,