2013년 6월 10일 월요일

temp

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/totalNumberLabel"
            android:text="@string/total_number" />
        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="number"
            android:id="@+id/total_number_of_people" />
    </LinearLayout>
    <!-- 2nd Line -->
    <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            >
        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/totalAmountLabel"
                android:text="@string/total_amount" />
        <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="number"
                android:id="@+id/total_amount" />
    </LinearLayout>
    <!-- 2nd Line -->
    <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            >
        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/totalAmountLabel"
                android:text="장소" />
        <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="number"
                android:id="@+id/total_amount" />
    </LinearLayout>
    <!-- 2nd Line -->
    <LinearLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            >
        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/totalAmountLabel"
                android:text="날짜" />
        <EditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="number"
                android:id="@+id/total_amount" />
    </LinearLayout>
 <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal"
     android:gravity="bottom" >
     <Button
         android:id="@+id/smlManual"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_weight="1"
         android:text="추가" >
     </Button>
     <Button
         android:id="@+id/smlAuto"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_weight="1"
         android:text="주소록" >
     </Button>
     <Button
         android:id="@+id/smlSendMessage"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_weight="1"
         android:text="그룹목록" >
     </Button>
 </LinearLayout>          
    <ListView
        android:id="@+id/smlListView"
        android:layout_width="fill_parent"
        android:layout_height="0px"
        android:layout_weight="1"
        android:transcriptMode="alwaysScroll" >
    </ListView>
 <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal"
     android:gravity="bottom" >
     <Button
         android:id="@+id/smlConfirm"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_weight="1"
         android:text="2차입력" >
     </Button>
     <Button
         android:id="@+id/smlCancel"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_weight="1"
         android:text="전송" >
     </Button>
 </LinearLayout>   
<!--  <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal"
     android:gravity="bottom" >
     <Button
         android:id="@+id/smlManual"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_weight="1"
         android:text="@string/smlManual" >
     </Button>
     <Button
         android:id="@+id/smlAuto"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_weight="1"
         android:text="@string/smlAuto" >
     </Button>
     <Button
         android:id="@+id/smlSendMessage"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_weight="1"
         android:text="@string/smlSendMessage" >
     </Button>
 </LinearLayout>
 --></LinearLayout>

android 유용 사이트

http://androidhuman.tistory.com/entry/11-List-집중공략-1-기본-다지기

http://stackoverflow.com/questions/4622517/hide-a-edittext-make-it-visible-by-clicking-a-menu

2013년 6월 9일 일요일

Thread

Thread
    : 프로세스가 하나 시작할려면 많은 자원이 필요하다. 만약 하나의 작업을 동시에 수행하려고 할 때 여러 개의 프로세스를 띄워서 실행하면 각각 메모리를 할당해주어야 한다. JVM은 기본적으로 아무런 옵션 없이 실행하면 OS마다 다르지만 36~64MB의 물리 메모리를 점유한다. 그에 반해서 쓰레드를 추가하면 1MB이내의 메모리를 점유한다. 그래서 쓰레드를 경량 프로세스라고 부른다.

Runnable 인터페이스와 Thread 클래스
    : run() : 쓰레드가 시작되면 수행되는 메소드
결과값이 항상 고정된 값이 나오는 것이 아님.
 
-> 쓰레드라는것을 start() 메소드를 통해서 시작했다는 것은 프로세스가 아닌 하나의 쓰레드를 JVM에 추가하여 실행한다는 것이다. 쓰레드를 기동시키는 runBasic() 메소드에서 runnable이라는 객체를 Thread 클래스의 start() 메소드로 시작한다. 이때 시작한 start() 메소드가 끝날 때까지 기다리지 않고 그 다음 줄에 있는 thread라는 객체의 start() 메소드를 실행한다. 이 줄도 마찬가지로 새로운 쓰레드를 시작하므로 run() 메소드가 종료될 때까지 기다리지 않고, 바로 다음줄로 넘어간다.


2013년 6월 8일 토요일

Apache Commons 라이브러리

http://commons.apache.org/

java.util 패키지

1. Date와 Calendar
  : 날짜 처리
  : Calendar
    -> public abstract class Calendar extends Object
             implements Serializable, Cloneable, Comparalbe<Calednar>

    : getInstance() 메소드를 통해 객체 생성

    : getInstance() : 기본 객체 생성 메소드, 모든 값은 기본값이며, 현재 시간으로 지정된
                              Calendar 객체 생상
    : getInstance(Locale aLocale) : 지정된 지역의 Calendar 객체 생성
    : getInstance(TimeZone, zone) : 지정된 타임존의 Calendar 객체 생성
    : getInstance() 메소드를 사용하여 Calendar 객체를 생성할수 있지만 TimeZone과 같이
      JDK 기본 API에서는 GregorianCalendar라는 클래스를 제공한다.

    : add(int field, int amount) : add(Calendar.DATE, amount) : 지정한 field 값을 amount 만큼 더함.
    : roll(int field, int amount) : 지정한 field 값을 amount 만큼 더하는데 그 상위값은 변경x
      -> 2000년12월 31일에서 roll()메소드를 사용하면 상위값을 변경하지 않으므로
          10일을 더한 2000년 12월 10일이 된다.



2. Collections
    : 모든 메소드들이 static 메소드이다.
    : 1) 데이터 검색 : binarySearch(), min(), max(), indexOfSubList(), lastIndexOfSubList(),
                                  frequency()
      2) 데이터 정렬 : sort()
      3) 데이터 순서 변경 : reverse(), shuffle(), swap(), rotate(), reverseOrder()
      4) 데이터 변경 및 추가 : fill(), replaceAll(), addAll()
      5) 데이터 복사 : copy(), nCopies()
      6) 데이터 삭제 : emptySet(), emptyList(), emptyMap()
      7) 데이터 추출 : newSetFromMap()
      8) 데이터 비교 : disjoint()
      9) 타입 변환 : enumeration(), list(), asLifoQueue()
     10) 쓰레드 안전 여부 속성 추가 : synchronizedCollection().....
    : 대부분의 Collection클래스들은 쓰레드에 안전하게 구현되어 있지 않다. 쓰레드에 안전한 클래스로 사용할려면 synchronizedList..등을 이용하면 된다.

3. Arrays
    : 배열을 쉽게 처리하기 위해 도움을 주는 클래스
    : 1) 정렬 : sort()
      2) 검색 : binarySearch()
      3) 비교 : equals(), deepEquals()
      4) 데이터 변경 : fill() : 특정 값으로 데이터를 채우는 메소드
      5) 복사 : copyOf(), copyOfRange()
      6) 변환 : asList()
      7) 해시코드 : hashCode(), deepHashCode()
      8) 문자열 변환 : toString()

4. StringTokenizer
    : 문자열 자르기 위한 클래스
    :  split() 메소드를 사용하기를 권장함.
5. Properties

6. Random
    :  이 클래스는 매개변수가 없는 생성자와  long을 매개변수로 받는 생성자가 있다.
    : nextBytes(byte[]), nextInt(), nextInt(int), nextLong(), nextBoolean(), nextFloat(), nextDouble(),
      nextGaussian()

7. Formatter

8. java.math 패키지의 BigDecimal 클래스
    : float 나 double은 정확한값을 제공하지 않고 근사치를 제공한다. 그러므로 정확한 숫자 계산이 필요할 경우에는 BigDecimal을 사용하여야 한다.
   : 정확한 계산을 위해서는 문자열을 매개 변수로 받는 생성자를 사용해야 한다.

2013년 6월 2일 일요일

Map 인터페이스

Map
    put(K key, V value) : 첫번째 매개변수인 키를 갖고 두번째 매개변수인 값을 갖는 데이터를
                                       저장
    putAll(Map<? extends K, ? extends V> m) : 매개 변수로 넘어온 Map의 모든 데이터를 저장

    get(Object key) : 매개 변수로 넘어온 키에 해당하는 값을 넘겨준다.

    remove(Object key) : 매개 변수로 넘어온 키에 해당하는 값을 넘겨주며 map에서 삭제

    keySet() : Key의 목록을 Set 타입으로 리턴

    values() : 값의 목록을 Collection 타입으로 리턴한다.

    : 종류 : HashMap, TreeMap, LinkedHashMap

여러 쓰레드에 동시에 접근하여 처리할 필요가 있을 때
Map m = Collections.synchronizedMap(new Hashmap(...));
























HashMap
  Object -> AbstractMap<K, V> -> HashMap<K, V>
  : Serializable, Cloneable, Map<E>

HashMap<String, String> map = new HashMap<String, String>();
map.put("A", "a");
map.put("C", "c");
map.put("D", "d");

Set<String> keySet = map.keySet();
for(String tempKey : keySet){
    System.out.println(tempKey + " = " + map.get(tempKey));
}
-> 현재 map에 저장된 key, value에 대한 값을 가져온다.
    Set의 값을 뿌려주기 때문에 데이터가 정렬되어 나오진 않는다.

HashMap에 저장하는 키가 되는 객체를 직접 만들었을 경우 유의사항
 -> 직접 어떤 클래스를 만들어 그 클래스를 키로 사용할 때에는 Object 클래스의 hashCode() 메소드와 equals() 메소드를 잘 구현해놓아야 한다
    -> HashMap에 객체가 들어가면 hashCode() 메소드의 결과 값에 따른 버켓(bucket) 이라는 List 형태의 저장소가 만들어진다. 만약 서로 다른 키가 저장되었는데, hashCode() 메소드의 결과가 동일하다면 이 버켓에 여러개의 값이 들어갈수 잇다. 따라서 get() 메소드가 호출되면 hashCode()의 결과를 확인하고 버켓에 들어간 목록에 데이터가 여러개일경우 equals() 메소드를 호출하여 동일한 값을 찾게 된다.

정렬된 키의 목록을 원한다면 TreeMap 사용