반응형

이번 포스팅은 첨부파일을 통한 Java Class 파일 DeCompile 하는 방법에 대하여 알아보도록 하겠습니다.

 

jad.exe
다운로드

 

 

1. 첨부파일을 Download(jad.exe) 받아 실행

 

 

2. 첨부파일을 Download DeCompile할 Java class 파일과 같이 있는 폴더로 이동시킵니다.

 

 

3. CMD 창을 띄운 후 현재 경로를 Java Class 파일이 있는 폴더로 이동시킵니다.

    

   - cd 명령어 사용

 

 

4. jad -o -sjava 파일명.class 입력해주면 java 파일이 DeCompile이 완료가 됩니다.

반응형

'Development > Java' 카테고리의 다른 글

[Java] StringBuffer vs StringBuilder  (0) 2019.09.26
[Java] Handler 정리  (0) 2019.09.05
[Java] System.arraycopy 사용법  (0) 2019.09.04
반응형

이번 포스팅은 StringBuffer 와 StringBuilder 에 대하여 알아보도록 하겠습니다.

Java에서 문자열 사용시 String 객체를 많이 사용하는데 String 객체는 new String() 함수를 통해 객체를 매번 생성하여 메모리적으로 좋지 않다는 걸 알고 계실 것입니다. 그래서 저는 StringBuffer 객체를 많이 사용하는데 Android Build 시 StringBuild를 사용할는 Lint 내용을 보고 의문이 들어 두 객체를 비교하여 보겠습니다.

StringBuilder와 StringBuffer를 비교합니다.
이 두 클래스는 서로 거의 동일합니다. 동일한 결과를 반환하는 동일한 이름의 메소드를 사용합니다. 하지만 두 가지 주요 차이점이 있습니다.

Thread Safety

- StringBuffer 메서드가 동기화되므로 한 번에 하나의 Thread에서만 StringBuffer 인스턴스의 메서드를 호출할 수 있습니다. 반면 StringBuilder 메서드는 동기화되지 않으므로 여러  Thread가 차단되지 않고 StringBuilder 클래스의 메서드를 호출할 수 있습니다.

그래서 우리는 StringBuffer가  Thread Safety 클래스인 반면 StringBuilder는 그렇지 않다는 결론을 내렸습니다.

▶ Speed

- StringBuffer는 실제로 StringBuilder보다 2~3배 느립니다. 그 이유는 StringBuffer의 동기화 때문입니다. 한 번에 하나의 개체에서 하나의 Thread만 실행되도록 허용하면 StringBuilder보다 코드 실행 속도가 훨씬 느려집니다.

사실 두 객체가 거의 동일한 메소드와 기능을 수행하기 때문에 아무거나 사용하여도 무방하지만 저는 속도면에서 조금 더 빠른 StringBuilder 클래스를 더 많이 사용합니다.

반응형

'Development > Java' 카테고리의 다른 글

[Java] Java Class 파일 DeCompile  (0) 2020.04.08
[Java] Handler 정리  (0) 2019.09.05
[Java] System.arraycopy 사용법  (0) 2019.09.04
반응형

이번 포스팅은 Thread에서 많이 사용하는 Handler에 대하여 알아보도록 하겠습니다.

 

1. Handler는 늘 Thread와 연결되어 있어야만 정상적인 기능을 하고, 그 Thread에는 메세지를 담을 수 있는 MessageQueue와 Handler로 메세지를 전달해주는 Looper가 있어야 합니다. 

 

2. Main Thread는 위의 MessageQueue와 Looper를 기본적으로 하나씩 가지고 있습니다. 그래서 Main Thread에서 new Handler() 라는 기본 생성자를 통해 Handler를 생성해도 잘 작동합니다. (단, 모든 Thread가 MessageQueue와 Looper가 있는 것은 아닙니다.) 

 


3. 기본 생성자를 통해 Handler를 생성하면, 생성자가 그 Handler가 있는 Thread의 MessageQueue와 Looper에 자동으로 연결이 됩니다. 



4. 2번에서 언급하였듯이 
모든 Thread가 MessageQueue와 Looper가 있는 것은 아니기 때문에 Looper가 없는 Thread에서 Handler를 생성하려 하면, 아래와 같은 오류가 발생합니다.

 

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()



5.  한 Thread에서 Looper는 하나만 존재하고, 하나의 MessageQueue에만 연결이 됩니다. 하지만 여러 Handler와 연결될 수 있습니다. 이것이 가능한 이유는 Message 객체로부터 어떤 Handler에 전달되야 하는 메세지인지 알 수 있기 때문입니다

 

 

6. Looper를 생성하는 방법은 생성한 Thread에서 Looper.prepare()를 호출하고, Looper.loop()를 실행하는 것입니다.  

Looper는 무한루프를 돌기때문에, Handler를 더 이상 사용하지 않을 때에는 Looper.quit()를 호출해주어야 합니다.

 

Thread thread = new Thread(new Runnable(){

 

      @Override

      public void run() {

          Looper.prepare();

          handler = new Handler();

          Looper.loop();

}

});

 

thread.start();  


 

7. Looper를 생성하는 간단한 방법은 Handler Thread 를 사용하는 것입니다. Handler Thread는 기본적으로 Looper를 가지고 있고, 해당 Thread를 start() 함수를 호출하면 자동으로 loop도 돌게 됩니다.

 

 
HandlerThread mHandlerThread = new HandlerThread("HandlerName");

mHandlerThread.start();

Handler handler = new Handler( handlerThread.getLooper() );

 

Reference

1. https://aroundck.tistory.com/1022 [돼지왕 왕돼지 놀이터]

 

반응형

'Development > Java' 카테고리의 다른 글

[Java] Java Class 파일 DeCompile  (0) 2020.04.08
[Java] StringBuffer vs StringBuilder  (0) 2019.09.26
[Java] System.arraycopy 사용법  (0) 2019.09.04
반응형

이번 포스팅은 System.arraycopy 사용방법에 대하여 알아보도록 하겠습니다.

 

System.arraycopy 는 byte[] 형태의 데이터를 자르거나 연접하기 위해 사용하는 메소드 입니다.

System.arraycopy 파라미터는 총 5개 요소가 들어갑니다.

 

System.arraycopy (src, srcPos, dest, destPos, length)

 

Object src  : 복사하고자 하는 소스입니다. 

                    원본이라고 생각하면 됩니다.

int srcPos  : 위의 원본 소스에서 어느 부분부터 읽어올지 위치를 정해줍니다.

                    처음부터 데이터를 읽어올거면 0 을 넣어줍니다.

Object dest : 복사할 소스입니다.

                     복사하려는 대상입니다.

int destPos : 위의 복사본에서 자료를 받을 때, 어느 부분부터 쓸 것인지 시작 위치를 정해줍니다.

                     처음부터 데이터를 쓸 거면 0 을 넣어줍니다.

int length : 원본에서 복사본으로 데이터를 읽어서 쓸 데이터 길이입니다. 

                  원본에서 복사본까지 얼마큼 읽어 올지 입력하는 것입니다.

 

다음은 실제 byte[] 형태의 데이터를 연접한 소스코드를 통해 좀 더 알아보도록 하겠습니다.

대칭키를 통해 16 byte key와 16 byte iv를 만드는 소스코드 예제입니다.

 

// 32 byte Key (원본)

byte[] secretKey = 32 byte byte[]                   

 

// 16 byte Key (첫번째 복사할 대상)

byte[] key = new byte[16];

// 16 byte IV (두번째 복사할 대상)

byte[] iv = new byte[16];

 

// key.length(16 byte) 만큼 원본 데이터를 읽어온 후 key 라는 변수에 씁니다.

System.arraycopy(secretKey, 0, key, 0, key.length);

 

// iv.length(16 byte) 만큼 원본 데이터를 읽어온 후 iv 라는 변수에 씁니다.

System.arraycopy(secretKey, key.length, iv, 0, iv.length);

 

위의 작업으로 인해 32 byte 원본 데이터의

배열 index 0~15 까지 데이터를 key 라는 변수에 저장이 되고

배열 index 16~31 까지 데이터를 iv 라는 변수에 저장이 됩니다.

 

반응형

'Development > Java' 카테고리의 다른 글

[Java] Java Class 파일 DeCompile  (0) 2020.04.08
[Java] StringBuffer vs StringBuilder  (0) 2019.09.26
[Java] Handler 정리  (0) 2019.09.05

+ Recent posts