본문 바로가기

수업 정리

16일차 수업정리(Set, Map)

** Set
    => 데이터를 중복없이 저장하는 자료구조
    => 중복된 데이터를 삽입하면 삽입하지 않음
    => 데이터를 빠르게 조회할 수 있도록 해싱을 이용해서 저장
    => 자바에서 Set은 인터페이스이고,  HashSet, LinkedHashSet, TreeSet 클래스로 구현
      - HashSet : 데이터의 저장 순서를 알수 없음
      - LinkedHashSet : 데이터의 저장 순서를 기억
      - TreeSet : 데이터를 오름차순으로 정렬해서 저장
    => 데이터를 삽입시, add메소드를 사용. 이 메소드가 boolean값을 리턴해서 삽입 성공시 true, 실패시 false를 리턴

** Map
    => 데이터를 Key와 Value 쌍으로 저장하는 자료구조
    => Key와 Value 모두 모든 자료형이 가능하지만 Key는 일반적으로 문자열로 만듭니다.
    => 데이터를 저장하는 용도의 Class 대신에 사용
    => 하나의 행을 저장하는 용도로 사용
    => 관계형 데이터 베이스(SQL 사용)는 Class를 이용한 인스턴스의 집합, NoSQL 데이터 베이스는 Map의 List입니다.
    => Key는 중복된 데이터를 허용하지 않음
    => Map은 인터페이스이고 HashMap, LinkedHashMap, TreeMap 클래스로 구현
      - HashMap : key의 순서를 알수 없음
      - LinkedHashMap : 저장한 순서를 기억
      - TreeMap : key를 오름차순 정렬

1. 생성 : new HashMap<Key의 자료형, Value의 자료형>()
2. 데이터 저장 - void put(key, value)
    => 없는 key를 입력시 데이터 삽입, 존재하는 key 입력시 데이터 수정
3. 데이터 가져오기 - Object get(key)
    => 없는 key를 사용하면 null이 리턴
4. 데이터 삭제 - remove(key), put(key, null)
5. 모든 키 값 가져오기 - Set<Key의 자료형> keySet()
6. toString이 재정의 되어 있는데 key 와 value의 toString을 호출해서 하나로 결합해서 리턴

** MVC(Model View Controller) - 데이터를 변경해도 출력부를 변경할 필요없게 하는 것
    => Model : Business Logic을 이용하여 데이터를 생성해내는 부분
    => View : 데이터를 출력하는 부분
    => Controller : Model과 View를 연결시켜 주는 부분

**연습문제
1. 테이블 구조의 데이터를 만들기(사용자정의 클래스의 List or Map의 List사용)
  1) 분류된 데이터 배열을 생성
  2) 각 분류별로 배열, 리스트 생성
  3) 배열이나 리스트와 분류를 나타내는 텍스트를 Map으로 생성
  4) Map의 배열이나 리스트를 생성
  5) 출력

**랜덤 클래스
    => java.util.Random

** 날짜 관련 클래스
    => java.util.Date, java.sql.Date, java.util.Calendar, java.util.GreogorianCalendar

1. java.util.Date
    => 날짜와 시간을 저장하는 클래스
    => 1970년 1월 1일 자정(epoch time)으로 부터 지나온 시간을 가지고 날짜를 표현
    => 년도는 1900으로 지나온 년도수로 설정하고 월은 0에
  1)생성자
    - Date(): 현재 날짜 및 시간
    - Date(long timeMillis): 1970년 1월 1일 자정으로 지나온 밀리초를 이용해서 생성
    - Date(int year, int month, int day): 년도는 1900년부터 지나온 년도로 월은 0부터 일은 동일
                                                   ex) 1986년 5월 5일 - new Date(86, 4, 5)
    - 위의 생성자에 시간과 분 그리고 시간, 분, 초를 추가해서 생성해주는 생성자도 존재

  2)메소드
    =>각 단위별로 가져올 수 있는 get 메소드와 설정할 수 있는 set 메소드를 소유
    =>크기 비교를 할 수 있는 compareTo 메소드가 존재

2. java.sql.Date와 java.sql.Time
    =>Date는 날짜만, Time은 시간만 저장
    => 생성자는 java.util.Date와 유사한데 매개변수가 없는 생성자(Default Constructor)가 없음

3. java.util.Calendar
    => Date에 비해 정확한 날짜 및 시간 설정이 가능한 클래스 - 추상 클래스
    => getInstance()라는 static 메소드를 이용해서 인스턴스를 생성 - 현재 날짜 및 시간으로 생성
    => get, set메소드를 가지고, 매개변수로 Calendar의 상수를 설정해서 원하는 항목을 가져오거나 설정할 수 있음
    => getTimeInMillis()를 이용해서 epoch time을 리턴

4. java.util.GregorianCalendar
    => Calendar의 하위클래스
    => 매개변수가 없는 생성자와 매개변수가 있는 생성자를 이용해서 인스턴스를 생성하는 것이 가능
    => 월은 0부터 시작, 년도나 일은 우리가 사용하는 형태로 설정

** Format 클래스
    => 날짜나 숫자 데이터를 특정 포맷에 맞는 문자열로 변환해주는 클래스
    => java.text나 패키지에 존재
1. SimpleDateFormat
    => 날짜를 문자열로 변환해주는 클래스
  1) 생성자 : SimpleDateFormat("날짜 서식")
  2) 문자열로 변환 : String format(Date date)

2. DecimalFormat
    => 숫자를 원하는 형식의 문자열로 변환해주는 클래스
    
3. choiceFormat
    => 구간에 해당하는 문자열을 리턴해주는 클래스
    => double 배열과 String배열을 이용

4. MessageFormat
    => 문자열을 보간하는 클래스
      ex) "이름:{0}", "박문석"

**연습문제
1. 1~1000까지 완전수의 갯수 구하기 
    => 완전수 : 자신을 제외한 약수의 합이 자기 자신인 수
    ex) 6 : 1, 2, 3, 6 => 1 + 2 + 3 = 6
    결과 : 3개

**연습문제
1. 노래제목을 저장할 수 있는 배열 또는 ArrayList를 만들어서 노래 제목을 저장하고 순서대로 출력
2. 가수이름과 노래제목을 하나로 묶어서 저장할 수 있는 클래스 또는 Map을 생성해서 데이터를 저장하고 이 데이터를 List나 배열에 저장하고 출력
3. 노래제목배열 들을 만드는데 장르별(트로트, 팝, 발라드등)로 생성
  - 만들어진 배열과 장르를 Map(or 별도의 클래스)으로 묶어서 배열이나 리스트로 만들고 출력(분류된 데이터)
4. 야놀자는 큰지역 -> 작은지역으로 구분하고, 그 안에 데이터를 저장하는 구조