본문 바로가기

Java

16일차 공부 Set, Map, 배열의 배열, Random, 프라임넘버 개수구하기

1 교시

 

** Set

=> 데이터를 중복 없이 저장하는 자료구조

=> 중복된 데이터를 삽입하면 삽입하지 않는다.

=> 데이터를 빠르게 조회할 수 있도록 해싱을 이용해서 저장

=> 자바에서는 Set은 인터페이스이고 데이터의 저장 순서를 알 수 없는 HashSet

, 데이터의 저장순서를 기억하는 LinkedHashSet

그리고 데이터를 오름차순 정렬해서 저장하고 있는 TreeSet 클래스로 구현되어 있다.

=> 데이터를 삽입할 때 add메소드를 사용하는데 이 메소드가 boolean값을 리턴해서 삽입에 성공하면 true 그렇지 않으면 false를 리턴한다.

 

예제) 1부터 45까지 숫자를 중복되지 않게 6개 입력받아서, 오름차순 정력해서 출력

 

 

 

이방법이 있고 다른방법

TreeSet을 이용한 오름차순 정렬

 

 

 

2~3 교시

 

**Map(Dictoinary)

=> 데이터를 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. 모든 Key 값 가져오기

Set<Key의 자료형> keySet()

 

 

 

 

 

6. toString이 재정의 되어 있는데 key와 value의 toString을 호출해서 하나로 결합해서 리턴

 

**MVC(Model View Controller)

=> Model : Business Logic을 이용해서 데이터를 생성해내는 부분 (백엔드)

=> View : 데이터를 출력하는 부분 (프론트엔드)

=> Controller : Model과 View를 연결시켜 주는 부분

 

 

 

4 교시

 

가게코드(문자열), 가게이름(문자열), 평점(실수), 최소주문금액(정수), 메뉴(문자열)

 

 

 

 

 

 

 

StoreMain 클래스

 

 

5 교시

 

배열의 배열

package javaapp0428;

import java.util.HashMap;

public class MapMain {

public static void main(String[] args) {
// 2차원 배열 - 배열의 배열
// 프로야구 선수들의 팀별 선수 명단을 데이터로 작성
String[] kia = { "김선빈", "김윤동", "김주찬", "최형우" };
String[] dusan = { "정수빈", "박치국" };
String[] lg = { "이형종", "임찬규" };
String[] hanhwa = { "이용규" };

// 이차원 배열 생성
// 배열에는 비교가 가능한 데이터만 저장하기 때문에 데이터이외의 정보를 저장하지 못해서 이차원 배열을 이용하는 경우 배열의 특성을 출력할 수 없습니다.
String[][] players = { kia, dusan, lg, hanhwa };

// 데이터 출력
for (int i = 0; i < players.length; i = i + 1) {
// 팀 이름을 출력
if (i == 0) {
System.out.printf("%5s", "기아:");
} else if (i == 1) {
System.out.printf("%5s", "두산:");
} else if (i == 2) {
System.out.printf("%5s", "엘지:");
}
// 각 팀의 선수명단
String[] temp = players[i];
for (String imsi : temp) {
System.out.printf("%7s", imsi);
}
System.out.printf("\n");
}

// 배열들을 하나로 묶어 줄 때는 Map을 만들어서 배열의 특징과 데이터를 저장하고 Map의 배열을 만들어주는 것이 좋습니다.
HashMap<String, Object> map1 = new HashMap<String, Object>();
map1.put("team", "기아");
map1.put("player", kia);

HashMap<String, Object> map2 = new HashMap<String, Object>();
map2.put("team", "두산");
map2.put("player", dusan);

HashMap<String, Object> map3 = new HashMap<String, Object>();
map3.put("team", "엘지");
map3.put("player", lg);

HashMap<String, Object> map4 = new HashMap<String, Object>();
map4.put("team", "한화");
map4.put("player", hanhwa);

HashMap[] kbo = { map1, map2, map3, map4 };
for (HashMap map : kbo) {
System.out.printf("%5s", map.get("team"));
// 출력 이외의 작업을 할 때는 원래 자료형으로 형 변환해서 사용해야 한다.
String[] player = (String[]) map.get("player");
for (String p : player) {
System.out.printf("%7s", p);
}
System.out.printf("\n");

}

}

}
기아:    김선빈    김윤동    김주찬    최형우
  두산:    정수빈    박치국
  엘지:    이형종    임찬규
    이용규
   기아    김선빈    김윤동    김주찬    최형우
   두산    정수빈    박치국
   엘지    이형종    임찬규
   한화    이용규

 

 

 

 

6 교시

 

** 랜덤 클래스

=> java.util.Random

 

 

 

 

 

7 교시

 

** 날짜 관련 클래스

=> 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, ont day) : 년도는 1900년부터 지나온 년도로 월은 0부터 일은 동일

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. javal.util.Calendar

=> Date에 비해서 정확한 날짜 및 시간 설정이 가능한 클래스 - 추상 클래스

=> getInstance()라는 static 메소드를 이용해서 인스턴스를 생성 - 현재 날짜 및 시간으로 생성

=> get메소드와 set메소드를 가지고 있는데 매개변수로 Calendar의 상수를 설정해서 원하는 항목을 가져오거나 설정할 수 있다.

=> getTimeInMillis()를 이용해서 epoch time을 리턴

 

4. java.util.GregorianCalendar

=> Calendar의 하위 클래스

=> 매개변수가 없는생성자와 매개변수가 있는 생성자를 이용해서 인스턴스를 생성하는것이 가능

=> 월은 0부터 시작, 년도나 일은 우리가 사용하는 형태로 설정

 

 

8 교시

 

**Format 클래스

=> 날짜나 숫자 데이터를 특정 포맷에 맞는 문자열로 변환해주는 클래스

=> java.text 패키지에 존재

 

1. SimpleDateFormat

=> 날짜를 문자열로 변환해주는 클래스

1) 생성자

SimpleDateFormat("날짜 서식")

 

2) 문자열로 변환

String format(Date date)

 

 

2. DecimalFormat

=> 숫자를 원하는 형식의 문자열로 변환해주는 클래스

 

 

 

3. ChioceFormat

=> 구간에 해당하는 문자열을 리턴해주는 클래스

=> double 배열과 String 배열을 이용

 

4. MessageFormat

=> 문자열을 보간하는 클래스

"이름:{0}", "박문석"

 

 

 

**연습문제

=> 완전수 : 자신을 제외한 약수의 합이 자기 자신인 수

6 : 1,2,3,6 => 1+2+3은 6 그러므로 완전수

2부터 1000까지 완전수의 개수 구하기 : 3개

 
1.노래 제목을 저장할 수 있는 배열 또는 ArrayList를 만들어서 노래 제목을 저장하고 순서대로 출력 - 열 만들기

2.가수이름과 노래제목을 하나로 묶어서 저장할 수 있는 클래스 또는 Map을 생성해서 데이터를 저장하고 이러한 데이터를 여러 개 만들어서 List 나 배열에 저장하고 출력 - 테이블 만들기

3.노래 제목 배열들을 만드는데 장르별(트로트, 힙합, 락)로 생성
만들어진 배열과 장르를 Map(별도의 클래스를 생성)으로 묶어서 배열이나 리스트로 만들고 출력 - 분류된 데이터

4.야놀자는 큰 지역으로 구분하고 다시 작은 지역으로 구분하고 그 안에 데이터를 저장하는 구조입니다.