반응형

이번 포스팅은 JSP, Servlet, Java에서 현재 경로를 확인할 수 있는 방법에 대하여 알아보겠습니다.

#. JSP (Java Script Page) 의 경우
1. URL : <%= request.getRequestURL() %> </BR>
2. URI : <%= request.getRequestURI() %> </BR>
3. 전달 파라미터 : <%=request.getQueryString()%> </BR>
4. 전달 파라미터 Map으로 return : <%=reqeust.getParameterMap()%>

#. Servlet
절대 경로
// 웹서버의 Document Root
getServletContext().getRealPath("/"));
ex) getServletContext().getRealPath("/WEB-INF/web.xml"));

#. Java
절대 경로
// 현재 자신의 절대 경로
this.getClass().getResource("").getPath();
// classes 폴더의 최상위 경로
this.getClass().getResource("/").getPath();
// classes 폴더에서부터 시작하여 해당 파일까지의 절대 경로
this.getClass().getResource("/com/test/config/config.properties").getPath();

반응형

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

[Web] 뷰 컴포넌트 통신  (0) 2022.09.19
[Web] 뷰 컴포넌트  (0) 2022.09.18
[Web] 뷰 인스턴스 라이프 사이클  (0) 2022.09.18
[Web] 뷰 인스턴스  (0) 2022.09.18
[Web] JSP에서 엑셀 파일로 저장하기  (0) 2020.04.08
반응형

이번 포스팅은 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