ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3-5 자바의 기초(ch10,11)
    카테고리 없음 2022. 10. 31. 19:04

    Chapter10

    #10-1~3

    날짜와 시간

    -java.util.Date

    =>날짜와 시간을 다룰 목적으로 만들어진 클래스

    =>Date의 메서드는 거의 deprecated되었지만(앞으로 사용하지 말라), 여전히 쓰이고 있다.

     

    -java.util.Calendar

    =>Date클래스를 개선한 새로운 클래스. 여전히 단점이 존재

     

    -java.time 패키지

    =>Date Calendar의 단점을 개선한 새로운 클래스들을 제공

    =>캘린더의 경우엔 날짜+시간을 항상 같이 다룸.

    =>그런데 time패키지는 날짜, 시간 따로 다룰수도, 같이 다룰수도 있음.

     

    Calendar클래스

    -추상 클래스이므로 getlnstance()를 통해 구현된 객체를 얻어야 한다.

    Calendar cal = new Calendar();   // 에러!! 추상 클래스는 인스턴스를 생성할 수 없다.
    
    Calendar cal = Calendar.getInstance();
    //OK, getInstance() 메서드는 Calendar클래스를 구현한 클래스의 인스턴스를 반환한다.

     

    Calendar클래스 - 예제

    -get()으로 날짜와 시간 필드 가져오기 - int get(int field)

    Calendar cal = Calendar.getInstance();   // 현재 날짜와 시간으로 셋팅됨
    int thisYear = cal.get(Calendar.Year);   //올해가 몇년인지 알아낸다.
    int lastDayOfMonth = cal.getActualMaximum(Calendar.DATE);  // 이 달의 마지막 날

     

    -Calendar에 정의된 필드

    (각 필드명에 대한 설명은 강의 영상 참고(13:33)

     

     

    #10-4,5

    Calendar클래스 - 예제2,3

    -set()으로 날짜와 시간지정하기

    void set (int field, int value)
    void set (int year, int month, int date)
    void set (int year, int month, int date, int hourOfDay, int minute)
    void set (int year, int month, int date, int hourOfDay, int minute, int second)

    -날짜 지정하는 방법. (Month) 0부터 시작한다는 점에 주의

    Calendar date1 = Calendar.getInstance();
    date1.set(2017, 7, 15);  // 2017년 '8월' 15일 (7월 아님! )
    // date1.set(Calendar.YEAR, 2017);
    // date1.set(Calendar.MONTH, 7);
    // date1.set(Calendar.DATE, 15);

     

    -clear() Calendar객체의 모든 필드를 초기화

    Calendar dt = Calendar.getInstance(); 
    
    // Tue Aug 29 07:13:03 KST 2017
    System.out.println(new Date (dt.getTimeInMillis() ) ); 
    
    dt.clear(); // 모든 필드를 초기화
    // Thu Jan 01 00:00:00 KST 1970
    System.out.println(new Date(dt.getTimeInMillis() ) );

     

    -clear(int field) Calendar객체의 특정 필드를 초기화

    Calendar dt = Calendar.getInstance();
    
    // Tue Aug 29 07:13:03 KST 2017
    System.out.println(new Date(dt.getTimeInMillis() ) ); 
    
    dt.clear(Calendar.SECOND);             // 초를 초기화
    dt.clear(Calendar.MINUTE);              // 분을 초기화
    dt.clear(Calendar.HOUR_OF_DAY);     // 시간을 초기화
    dt.clear(Calendar.HOUR);                 // 시간을 초기화 
    
    // Tue Aug 29 00:00:00 KST 2017
    System.out.println(new Date(dt.getTimeInMillis() ) );

     

     

    #10-6~8

    Calendar클래스 - 예제4,5

    -add()는 특정 필드의 값을 증가 또는 감소(다른 필드에 영향O)

    Calendar date = Calendar.getInstance();
    date.clear();  // 모든 필드를 초기화
    date.set(2020, 7, 31);  // 2020년 '8월' 31일로 설정
    
    date.add(Calendar.DATE, +1);        // 날짜(DATE)에 1을 더한다.
    date.add(Calendar.MONTH, -8);     // 월(MONTH)에서 8을 뺀다.

    =>결과적으로 1 1일이 나옴.

     

    -roll()은 특정필드의 값을 증가 또는 감소(다른 필드에 영향X)

    date.set(2020, 7, 31);   // 2020년 8월 31일로 설정
    
    // add()와 달리 roll()은 다른 필드에 영향을 미치지 않는다.
    date.roll(Calendar.DATE, 1);      // 날짜(DATE)에 1을 더한다. =>영향 주지 않기에, 날짜만 1로 바뀜.(월 변화 x)
    date.roll(Calendar.MONTH, -8)  // 월(MONTH)에서 8을 뺀다.

    =>, 0 1일로 뜸.

     

     

    Date Calendar간의 변환

    -Date의 메서드는 대부분 deprecated(사용하지 않을것을 권장)되었지만 여전히 사용 ("하위호환성"을 위해)

    1.Calendar Date로 변환

    Calendar cal = Calendar.getInstance();
          . . .
    Date d = new Date(cal.getTimeInmillis() );  // Date(long date)

     

     

    2.Date Calendar로 변환

    Date d = new Date();
       . . .
    Calendar cal = Calendar.getInstance();
    cal.setTime(d)

     

     

     

    #10-9~12

    형식화 클래스

    -java.text 패키지의 DecimalFormat(10진수 숫자), SimpleDateFormat(날짜형식화)

    -숫자와 날짜를 원하는 형식으로 쉽게 출력가능(숫자, 날짜 -> 형식 문자열)

    double number = 1234567.89;
    DecimalFormat df = new DecimalFormat("#.#E0");
    String result = df.format(number);  // result = "1.2E6"

     

     

    -형식 문자열에서 숫자와 날짜를 뽑아내는 기능(형식 문자열 -> 숫자,날짜)

    DecimalFormat df = new DecimalFormat("#,###.##");
    Number num = df.parse("1,234,567,89");
    double d = num.doubleValue();  // 1234567.89

     

     

     

    DecimalFormat

    -숫자(10진수)를 형식화할 때 사용(숫자 -> 형식 문자열)

    double number = 1234567.89;
    DecimalFormat df = new DecimalFormat("#.#E0");
    String result = df.format(number);  // result = "1.2E6"

     

     

    -특정 형식의 문자열을 숫자로 변환할 때도 사용(형식 문자열 -> 숫자)

    DecimalFormat df = new DecimalFormat("#,###.##");
    Number num = df.parse("1,234,567,89");
    double d = num.doubleValue();  // 1234567.89

    [참고]Integer.parseInt()는 콤마(,)가 포함된 문자열을 숫자로 변환 못함

     

     

    #10-13~16

    SimpleDateFormat(1/2)

    -날짜와 시간을 다양한 형식으로 출력할 수 있게 해준다.

    Date today = new Date();
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
    
    // 오늘 날짜를 yyyy-MM-dd 형태로 변환하여 반환한다.
    String result = df.format(today);

     

     

     

    SimpleDateFormat(2/2)

    -특정 형식으로 되어 있는 문자열에서 날짜와 시간을 뽑아낼 수도 있다.

    DateFormat df = new simpleDateFormat("yyyy년 MM월 dd일");
    DateFormat df2 = new simpleDateFormat("yyyy/MM/dd");
    Date d = df.parse("2015년 11월 23일");   // 문자열을 Date로 변환
    String result = df2.format(d);

     

     

     

    Chapter11

    #11-1~2

    (11강은 여러번 반복해서, 빠르게, 전체적으로 보는것을 추천. 양이 많고 중요함

    제대로 보는게 아니라, 목차 등등을 빠른식으로 훑으면서 여러번

    '실습'이 굉장히 중요.)

    컬렉션 프레임웍(collections framework)

    -컬렉션(collection)

    =>여러 객체(데이터)를 모아 놓은 것을 의미

     

    -프레임웍(frame work)

    =>표준화, 정형화된 체계적인 프로그래밍 방식(오디오,통계,수학 등)

        이전에 배운 JavaAPZ의 데시멀포맷 등이 예시.

     

    -컬렉션 프레임웍(collections framework)

    =>컬렉션(다수의 객체)을 다루기 위한 표준화된 프로그래밍 방식

    =>컬렉션을 쉽고 편리하게 다룰(저장,삭제,검색,정렬) 수 있는 다양한 클래스를 제공

    =>java.util패키지에 포함.

     

    -컬렉션 클래스(collection class)

    =>다수의 데이터를 저장할 수 있는 클래스(ex. Vector, Arraylist, HashSet)

     

     

    컬렉션 프레임웍의 핵심 인터페이스

    다루는 데이터의 특성은 크게

    1.List

    2.Set

    3.Map

    으로 나눌 수 있다. (이 세가지의 특성을 아는 것이 중요)

    각 인터페이스의 특징은 강의 표를 참고(11:30)

     

     

    #11-3~6

    Collection인터페이스의 메서드

    (그림과 표가 주를 이룸. 요약보단 강의 영상을 참고)

     

     

    #11-7~11

    ArrayList

    -ArrayList는 기존의 Vector를 개선한 것으로 구현원리와 기능적으로 동일

     ArrayList와 달리 Vector는 자체적으로 동기화처리가 되어 있다.

     

    -List인터페이스를 구현하므로, 저장순서가 유지되고 중복을 허용한다.

     

    -데이터의 저장공간으로 배열을 사용한다.(배열기반)

     

     

    ArrayList의 메서드

    강의 영상 참고(04:02)

     

     

    ArrayList에 저장된 객체의 삭제과정

    강의 영상 참고(28:30)

     

     

    #11-12~14

    LinkedList - 배열의 장단점

    -장점 : 배열은 구조가 간단하고 데이터를 읽는 데 걸리는 시간(접근시간, access time)이 짧다.

     

    -단점 1 : 크기를 변경할 수 없다.

                 =>크기를 변경해야 하는 경우 새로운 배열을 생성 후 데이터를 복사해야 한다.

                 =>크기 변경을 피하기 위해 충분히 큰 배열을 생성하면, 메모리가 낭비됨.

    -단점 2 : 비순차적인 데이터의 추가, 삭제에 시간이 많이 걸린다.

                 =>데이터를 추가하거나 삭제하기 위해, 다른 데이터를 옮겨야 함.

                 =>그러나 순차적인 데이터 추가(끝에 추가)와 삭제(끝부터 삭제)는 빠르다.

     

     

    LinkedList - 배열의 단점을 보완

    -배열과 달리 링크드 리스트는 불연속적으로 존재하는 데이터를 연결(link)

     =>데이터의 삭제 : 단 한 번의 참조변경만으로 가능

     =>데이터의 추가 : 한번의 Node객체생성과 두 번의 참조변경만으로 가능

     

    -링크드 리스트(linked list) - 연결리스트. 데이터 접근성이 나쁨

     

    -더블리 링크드 리스트(doubly linked list) - 이중 연결리스트, 접근성 향상

     

    -더블리 써큘러 리스트(doubly circular linked list) - 이중 원형 연결리스트

     

     

    Arraylist vs LinkedList - 성능 비교

    1. 순차적으로 데이터를 추가/삭제 - ArrayList가 빠름

    2. 비순차적으로 데이터를 추가/삭제 - LinkedList가 빠름

    3. 접근시간(access time) - ArrayList가 빠름

     

    (간략히 얘기하면 읽기는 ArrayList가 빠르고, 변경(추가/삭제) LinkedList가 빠름.)

     

     

    #11-15~18

    스택과 큐(Stack & Queue)

    -스택(Stack) : LIFO구조. 마지막에 저장된 것을 제일 먼저 꺼내게 된다.

     

     

    스택과 큐(Stack & Queue)의 메서드

    (메서드와 설명은 강의 영상의 표 참고 10:20 )

     

     

    인터페이스를 구현한 클래스 찾기

    (영상강의 17:35)

     

     

    #11-19~21

    스택과 큐(Stack & Queue)의 활용

    -스택의 활용 예 : 수식계산, 수식괄호검사, 워드프로세서의 undo/redo, 웹브라우저의 뒤로/앞으로

    -큐의 할용 예 : 최근 사용문서, 인쇄작업 대기목록, 버퍼(buffer)

     

     

    #11-22~24

    Iterator, Lislterator, Enumeration

    -컬렉션에 저장된 데이터를 접근하는데 사용되는 인터페이스

    -Enumeration Iterator의 구버젼

    -Listlterator Iterator의 접근성을 향상시킨 것(단방향 -> 양방향)

    (각 메서드의 설명은 영상강의 참조)

     

    -컬렉션에 저장된 요소들을 읽어오는 방법을 표준화한 것

    List list = new ArrayList(); // 다른 컬렉션으로 변경할 때는 이 부분만 고치면 된다.
    Iterator it = list.iterator();
    
    while(it.hasNext() ) {    // boolean hasNext() 읽어올 요소가 있는지 확인
          System.out.println(it.next() );    //Object next() 다음 요소를 읽어옴
    }

     

    참고로, iterator라는 메서드는,

    public interface Collection{
            . . .
          public Iterator iterator();
            . . .
    }

    이 콜렉션 인터페이스(조상)에 정의가 되어있음

     

     

    Map Iterator

    -Map에는 iterator()가 없다. keySet(), entrySet(), values()를 호출해야 한다.

    Map map = new HashMap();
           . . .
    Iterator it = map.entrySet().iterator();

    (쪼개서 생각해볼 것. 20:00 참고)

     

     

    #11-25~29

    Arrays(1/4) - 배열을 다루기 편리한 메서드(static) 제공

    1. 배열의 출력 - toString()

    static String toString(boolean[] a)
    static String toString(byte[] a)
    static String toString(char[] a)
    .
    .        //이것들 외에 더 많음. 영상 강의에 나옴
    .
    static String toString(Object[] a)

    (근데 이미 이전 배열강의에서 배운 것들임)

     

    2. 배열의 복사 - copyOf(), copyOfRange()

    int[] arr = {0,1,2,3,4};
    int[] arr2 = Arrays.copyOf(arr, arr.length);   // arr2=[0,1,2,3,4]
    int[] arr3 = Arrays.copyOf(arr, 3);  // arr3=[0,1,2]
    int[] arr4 = Arrays.copyOf(arr, 7);  // arr4=[0,1,2,3,4,0,0]
    int[] arr5 = Arrays.copyOfRange(arr, 2, 4)  // arr5=[2,3] <-4는 불포함
    int[] arr6 = Arrays.copyOfRange(arr,0,7);  // arr6=[0,1,2,3,4,0,0]

     

    3. 배열 채우기 - fill(), setAll()

    int[] arr = new int[5];
    Arrays.fill(arr, 9);       // arr=[9,9,9,9,9]
    Arrays.setAll(arr, (i) -> (int)(Math.random()*5)+1)  // arr=[1,5,2,1,1]

     

    4. 배열의 정렬과 검색 - sort(), binarySearch()

    int[] arr = {3, 2, 0, 1, 4};
    int idx = Arrays.binarySearch(arr, 2);       // idx=-5  <- 잘못된 결과
    고로,
    Arrays.sort(arr);  // 배열arr을 '정렬'한다. (잘못된 결과가 나오지 않으려면 정렬 먼저 해줘야함.)
    System.out.println(Arrays.toString(arr) );   // [0,1,2,3,4]
    int idx = Arrays.binarySearch(arr, 2);  // idx=2   <-올바른 결과!

     

    5. 다차원 배열의 출력 - deepToString()

    int[] arr = {0,1,2,3,4};
    int[][] arr2D = {{11,22}, {21,22} };
    
    System.out.println(Arrays.toString(arr) );  // [0,1,2,3,4]
    System.out.println(Arrays.deepToString(arr2D) );  // [ [11, 12], [21, 22] ]

     

    6. 다차원 배열의 비교 - deepEquals()

    String[][] str2D  = new String[][]{ {"aaa","bbb"}, {"AAA","BBB"} };
    String[][] str2D2 = new String[][]{ {"aaa","bbb"}, {"AAA","BBB"} };
    
    System.out.println(Arrays.equals(str2D, str2D2) );  // false
    System.out.println(Arrays.deepEquals(str2D, str2D2) );  // true

     

    7. 배열을 List로 변환 - asList(Object...a)

    List list = Arrays.asList(new Integer[]{1,2,3,4,5});  // list = [1, 2, 3, 4, 5]
    List list = Arrays.asList(1,2,3,4,5);                     // list = [1, 2, 3, 4, 5]
    list.add(6);  // UnsupportedOperationException 예외발생
    
    List list = new ArrayList(Arrays.asList(1,2,3,4,5));

     

    8.람다와 스트림(14) 관련 - parallelXXX(), spliterator(), stream()

     

    #11-30~33

    Comparator Comparable

    -객체 정렬에 필요한 메서드(정렬기준 제공)를 정의한 인터페이스

    =>

    Comparable : 기본 정렬기준을 구현하는데 사용

    Comparator : 기본 정렬기준 외에 다른 기준으로 정렬하고자할 때 사용

    public interface Comparator {
           int compare(Object o1, Object o2) ;  // o1, o2 두 객체를 비교
           boolean equals(Object obj) ;  // equals를 오버라이딩하라는 뜻
    }
    
    public interface Comparable{
          int compareTo(Object o) ;  // 주어진 객체(o)를 '자신'과 비교
    }

     

    -compare() compareTo()는 두 객체의 비교결과를 반환하도록 작성. 같으면 0, 오른쪽이 크면 음수(-), 작으면 양수(+)

    형태

    public final class Integer extends Number implements Comparable {
          .  .  .
         public int compareTo(Integer anotherInteger) {
               int v1 = this.value;
               int v2 = anotherInteger.value;
               // 같으면 0, 오른쪽 값이 크면 -1, 작으면 1을 반환
               return (v1 < v2 ? -1 : (v1==v2? 0 : 1) );
               }
               . . .
    }

    이후 다음 예시는 영상강의 참조(20:00)

     

     

    #11-34~36

    HashSet - 순서X, 중복X

    -HashSet

    =>Set인터페이스를 구현한 대표적인 컬렉션 클래스

    =>순서를 유지하려면 LinkedHashSet클래스를 사용하면 된다.

     

    -TreeSet

    =>범위검색과 정렬에 유리한 컬렉션 클래스

    =>HashSet보다 데이터 추가, 삭제에 시간이 더 걸림

     

     

    HashSet - 주요 메서드

    -HashSet()

    -HashSet(Collection c)

    -HashSet(int initialCapacity)

    -HashSet(int initialCapacity. float loadFactor)

     

    (그 외 boolean, void, 등 등은 영상강의 참조)

     

     

    #11-37,38

    HashSet - 예제3

    -HashSet은 객체를 저장하기전에 기존에 같은 객체가 있는지 확인

     같은 객체가 없으면 저장하고, 있으면 저장하지 않는다.

    -boolean add(Object o)는 저장할 객체의 equals() hashCode()를 호출

     'equals() hashCode()가 오버라이딩 되어 있어야 함'

    ex)

    class Person{       //extends Object 생략되어 있는 것.
         String name;
         int age; 
    
         Person(String name, int age) {
               this.name = name;
               this.age = age; 
               }       
    
               public String toString() {
                    return name +":"+age;
               }
    }

    위 처럼 쓰려면,

    public boolean equals(Object obj) {
          if(! (obj instanceof Person) ) return false; 
    
          Person tmp = (Person) obj;
    
          return name.equals(tmp.name) && age ==tmp.age;
    } 
    
    public int hashCode() {
        return (name+age).hashCode();
    }

    이렇게 equals() hashCode()를 오버라이딩 해 줘야 한다!

     

     

    #11-39~41

    TreeSet - 범위 탐색, 정렬

    -이진 탐색 트리(binary search tree)로 구현. 범위 탐색과 정렬에 유리.

    -이진 트리는 모든 노드가 최대 2개의 하위 노드를 갖음

     각 요소(node)가 나무(tree)형태로 연결(LinkedList의 변형)

    class TreeNode{
         TreeNode left;       // 왼쪽 자식노드
         Object element;     // 저장할 객체
         TreeNode right;     // 오른쪽 자식노드
    }

     

     

    이진 탐색 트리(binary search tree)

    -부모보다 작은 값은 왼쪽, 큰 값은 오른쪽에 저장

    -데이터가 많아질 수록 추가, 삭제에 시간이 더 걸림(비교 횟수 증가)

     

     

    TreeSet - 데이터 저장과정 boolean add(Object o)

    -TreeSet 7,4,9,1,5의 순서로 데이터를 저장하면, 아래의 과정을 거친다.

     (루트부터 트리를 따라 내려가며 값을 비교. 작으면 왼쪽, 크면 오른쪽에 저장)

     

     

    #11-42~45

    TreeSet - 주요 생성자와 메서드

    (영상 강의의 표 참고)

     

     

    #11-46,47

    HashMap Hashtable - 순서X, 중복(X, O)

    -Map인터페이스를 구현. 데이터를 키와 값의 쌍으로 저장

    -HashMap(동기화X) Hashtable(동기화O)의 신버젼

     

    =>HashMap

     : Map 인터페이스를 구현한 대표적인 컬렉션 클래스

     : 순서를 유지하려면, LinkedHashMap클래스를 사용하면 된다.

     

    =>TreeMap

     : 범위 검색과 정렬에 유리한 컬렉션 클래스

     : HashMap보다 데이터 추가, 삭제에 시간이 더 걸림

     

     

    HashMap의 키(key)와 값(value)

    -해싱(hashing)기법으로 데이터를 저장. 데이터가 많아도 검색이 빠르다.

    -Map인터페이스를 구현. 데이터를 키와 값의 쌍으로 저장

    (key) : 컬렉션 내의 키(key) 중에서 유일해야 한다.

    (value) : (key)와 달리 데이터의 중복을 허용한다.

    (key id, value pw를 생각하면 됨)

    public class HashMap extends AbstractMap
                             implements Map, Cloneable, Serializable {
          transient Entry[] table;
          . . .
          static class Entry implements Map.Entry {
               final Object key;
               Object value;
               . . .
           }
    }

     

     

     

    해싱(hashing) - (1/3) 환자정보관리

    (그림과 설명이 주요. 영상강의 참조 07:30)

    -정리하면, 함수를 이용하여 데이터를 저장하고 읽어오는 것이 핵심.

     

     

    해싱(hashing) - (2/3)

    -해시함수(hash function)로 해시테이블(hash table)에 데이터를 저장, 검색

    -해시테이블은 배열과 링크드 리스트가 조합된 형태

     

     

    해싱(hashing) - (3/3)

    =>해시테이블에 저장된 데이터를 가져오는 과정

    1) 키로 해시함수를 호출해서 해시코드를 얻는다.

    2) 해시코드(해시함수의 반환값)에 대응하는 링크드리스트를 배열에서 찾는다.

    3) 링크드리스트에서 키와 일치하는 데이터를 찾는다.

    (해시함수는 같은 키에 대해 항상 같은 해시코드를 반환해야 한다.

    서로 다른 키일지라도 같은 값의 해시코드를 반환할 수도 있다.)

     

     

    #11-48~51

    HashMap - 주요 메서드

    -HashMap()

    -HashMap(int initialCapacity)

    -HashMap(int initialCapacity, float loadFactor)

    -HashMap(Map m)

    (그 외의 다른 메서드들은 영상강의 참조)

     

     

    #11-52~56

    Collections(1/2) - 컬렉션을 위한 메서드(static)를 제공

    1. 컬렉션 채우기, 복사, 정렬, 검색 - fill(), copy(), sort(), binarySearch()

    2. 컬렉션의 동기화 - synchronizedXXX()

    ex)

    static Collection   synchronizedCollection(Collection c)
    static List         synchronizedList(List list)
    static Set          synchronizedSet(Set s)
    .
    .
    .

     

    3. 변경불가(readOnly) 컬렉션 만들기 - unmodifiableXXX()

    ex)

    static Collection     unmodifiableCollection(Collection c)
    static List           unmodifiableList(List list)
    static Set            unmodifiableSet(Set s)
    .
    .
    .

     

    4. 싱글톤 컬렉션 만들기 - singletonXXX()

    ex)

    static List   singletonList(Object o)
    static Set    singleton(Object o)      // singletonSet이 아님에 주의
    static Map    singletonMap(Object key, Object value)

     

    5. 한 종류의 객체만 저장하는 컬렉션 만들기 - checkedXXX()

    static Collection   checkedCollection(Collection c, Class type)
    static List         checkedList(List list, Class type)
    static Set          checkedSet(Set s, Class type)
    .
    .
    .

     

     

    컬렉션 클래스 정리 & 요약(1/2)

    (그림자료와 설명이 위주, 강의영상 17:10 참고)

Designed by Tistory.