vector는 내부적으로 배열의 구조를 지니고 있습니다.

그래서 인덱스로 요소에 접근할 경우 상수시간으로 접근 할 수 있죠.

하지만, item들이 추가되거나 삭제를 할 때는

내부적으로 임시 배열을 생성해서 복사한다음

item들을 이동시키게 됩니다. 이런 경우, 비용이 많이 들게 되고 성능이 떨어지죠.

 

반면,  list에서는

item들과의 연결이 포인터로 되어 있어

item의 추가와 삭제가 빠릅니다.

하지만, item들을 검색하는 시간은 o(n)의 비용이 발생하게 됩니다.

 

vector의 경우는 item들을 저장한 이후 변동이 별로 없다면 효과적이고

list의 경우 item의 추가 삭제가 많을 경우 유용하다고 할 수 있겠습니다. 


Vector와 LinkedList가 위의 경우와 같다고 생각할 수 있습니다.

단 , ArrayList는 LinkedList와 다르다는 점을 인식하셔야 합니다. 

ArrayList는 Vector와 동일한 내부구조를 지니고 있고 다른 점은 멀티쓰레드로

공유자원으로 활용시 Vector는 한 스레드가 접근 했을 시에 다른 스레드의 접근을 제한합니다. 즉, 동기화를 지원합니다. 반면 ArrayList를 활용시 다른 쓰레드의 접근을 허용하지요.

성능을 생각하면 ArrayList이고 동기화의 과정이 준수되어야 하는 상황에서는 ArrayList와 Vector를 둘 다 씁니다.

왜냐하면, Collection.synchronizedCollection(Collection c)로 동기화 옵션을 설정해줄 수 있기 때문입니다.

Vector는 자바 컬렉션 모델에서 초창기 모델이고 ArrayList는 wrapping된 버젼업 모델이기 때문에

Java에서는 Vector를 잘 사용하지 않는 상황입니다.


출처 : http://blog.daum.net/mk_library/9

Hashtable 은 동기화된 map 이고 HashMap은 비동기화된 map이지요.
다수의 Thread가 put/get을 할때 ThreadSafe를 보장해준다는 이야기에요.
단일 Thread 상황에서는 굳이 HashTable을 사용할 필요가 없겠지요.

 스톱워치를 구현함에 있어서 스레드의 sleep함수를 이용해서 시간을 카운트하도록 설계를 했었다. 하지만 이와 같은 방법을 쓰게될 경우, 스레드틑 CPU로부터 할당 받은 시간만큼만 실행되게 됨으로 정밀하게 유효한 값을 가지기가 힘들다. 그러면 CPU로부터 유효한 시간을 유지하면서 시간을 재는 초시계를 구현하려면 어떻게 해야하는가....??

 생각외로 답은 간단했다. 답은 시스템 시간에 있었다. 스레드를 이용하여 이정 시간단위로 시스템 시간을 가져온다. 시간을 재기 시작한 시스템시간을 기록해 놨다가 스레드가 매번 시스템 시간을 가져와 그 차이로 스톱워치의 시간을 갱신하는 방법이다. CPU할당시간이 밀리더라도 시스템 시간을 가져와 갱신하기 때문에 스레드 sleep함수를 이용하여 시간을 갱신하는 것보다 더 정밀한 시간을 잴 수가 있다.


==소스는 차후, 등록 예정==


import java.io.*;


public class Example {
  static String timerBuffer; // 04:11:15 등의 경과 시간 문자열이 저장될 버퍼 정의
  static int oldTime; // 타이머가 ON 되었을 때의 시각을 기억하고 있는 변수

  public static void main(String[] args) {

    stopwatch(1); // 1을 인수로 넣으면 타이머가 켜짐
    System.out.println("Timer ON! 엔터 키를 누르면 종료합니다");

    pause(); // 유저가 Enter키를 누를 때까지 무한정 대기

    stopwatch(0); // 0을 넣으면 타이머가 꺼지고 시간 문자열을 버퍼에 설정
    System.out.format("Timer OFF! 경과 시간: [%s]%n", timerBuffer); // 경과 시간 화면에 출력
  }


  public static void stopwatch(int onOff) {
    if (onOff == 1) // 타이머 켜기
      oldTime = (int) System.currentTimeMillis() / 1000;

    if (onOff == 0) // 타이머 끄고, 시분초를 timerBuffer 에 저장
      secToHHMMSS(  ((int) System.currentTimeMillis() / 1000) - oldTime  );

  }


  // 정수로 된 시간을 초단위(sec)로 입력 받아, "04:11:15" 등의 형식의 문자열로 시분초를 저장
  public static void secToHHMMSS(int secs) {
    int hour, min, sec;

    sec  = secs % 60;
    min  = secs / 60 % 60;
    hour = secs / 3600;

    timerBuffer = String.format("%02d:%02d:%02d", hour, min, sec);
  }


  public static void pause() {
    try {
      System.in.read();
    } catch (IOException e) { }
  }


}


?1?2?3?4?5?.....?n = k

위의 식에서 '?'에는 '+'와 '-'가 들어갈수 있다.
표준입력을 이용하여 k(0<=|k|<=1000000000)를 입력하면 위의 식이 성립되는 최소의 n(0<=n)을 구하는 프로그램을 작성하시오.

#결과값이 올바르게 출력될 것
#처리 시간을 최소화할 것
#적절한 자료구조와 알고리즘을 사용할 것

블로그 글 경로 : http://rullrow.blog.me/70144801494

 자바에서 스윙으로 GUI를 구현하면 JFrame을 상속받아서 메인프레임을 구현하는 방법이 가장 일반적으로 사용되는 방법이다. 하지만 스윙을 사용하는 초보자들이 가장 많이 하는 실수가 EXIT_ONCLOSE를 지정 안 하는 것이다. 이를 지정하지 않으면 메인프레임을 닫았는데도 JFrame객체는 JVM에서 계속 살아서 실행된다. 즉 사용자에게 보여지는 View는 종료되었지만 프로그램은 계속 실행중인 상태가 된다. 


frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

하지만 위와 같은 처리를 해주면 메인프레임을 닫을 때, 프로그램 또한 안정적으로 종료된다.


+ Recent posts