1. 여러 개의 항목을 묶어서 저장하기
1) Class 이용 -> 관계형 DBMS (Oracle, MySQL ...)
DTO (Data Transfer Object) & VO (Variable Object)
=>여러 개 항목의 데이터를 하나로 저장하기 위한 클래스를 DTO 또는 VO라고 합니다.
=>저장하고자 하는 항목을 private 변수로 만들고 접근자 메소드를 추가해서 사용
=>객체를 생성하고 .을 이용하면 사용할 수 있는 메소드들이 보여지기 때문에 코딩하기가 쉽고 다양한 여러가지 메소드를 추가할 수 있기 때문에 많이 사용
=>저장 구조가 변경되면 화면에 출력하는 부분도 변경해야 하기 때문에 유지보수에 불리
2) Map 이용 -> NoSQL(MongoDB ...)
=> java.util.Map 클래스의 객체 이용
=>Map은 DTO 클래스와 유사한 용도로 사용할 수 있는 자료구조입니다.
=>Map은 키의 몰라도 데이터 전체를 출력할 수 있습니다.
public class Data {
private int num;
private String name;
private int age;
private String position;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getPosition() {
return position;
}
public void setPosition(String position) {
this.position = position;
}
@Override
public String toString() {
return "Data [num=" + num + ", name=" + name + ", age=" + age +
", position=" + position + "]";
}
}
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
public class Main1 {
public static void main(String[] args) {
Data data = new Data();
//데이터 대입
data.setNum(12);
data.setName("hello");
data.setAge(27);
data.setPosition("healer");
//데이터 출력
System.out.println("번호: "+data.getNum());
System.out.println("이름: "+data.getName());
System.out.println("나이: "+data.getAge());
System.out.println("포지션: "+data.getPosition());
System.out.println("-------------------");
//지정한 순서를 기억하고 있는 Map 객체 생성
Map <String, Object> map = new LinkedHashMap<String,Object>();
//데이터 저장
map.put("num", 10);
map.put("name", "good morning");
map.put("age", 30);
map.put("position", "dealer");
//데이터 출력
Set <String> keySet = map.keySet();
for(String key: keySet) {
System.out.println(key+": "+map.get(key));
}
}
}
2. 스칼라 & 벡터
스칼라 : Value, ...
벡터 : 1)array(배열):크기 고정, 삽입하거나 삭제를 하는 경우에는 직접 복사를 해야합니다.
저장공간 절약
2)Lis(가변배열) ArrayList(.순회에 강함)
LinkedList (삽입과 삭제에 강함), Stack(LIFO), Queue(FIFO), Deque(양쪽에서 삽입과 삭제)
3) Set: 중복없이 저장, 검색은 가장 빠름
HashSet, LinkedHashSet, TreeSet
3. 2차원 배열과 맵의 배열
=>데이터를 2중으로 저장해야 하는 경우 배열의 배열이나 List의 List를 사용하게 되면 배열이나 List를 인덱스(번호)로 구분하기 때문에 나중에 데이터를 꺼내서 사용할 때 어떤 데이터를 꺼내 온 것인지 알 수가 없어서 데이터를 저장할 때의 내용을 확인해보아야 합니다.
=>배열을 배열에 다시 저장할 때는 먼저 Map을 생성해서 배열과 특징을 같이 저장하고 이 Map을 배열로 만들기를 권장합니다.
마지막 배열에서 Map을 꺼내가지고 특징을 확인해서 이 데이터가 어떤 데이터인지 알 수 있습니다.
import java.util.HashMap;
import java.util.Map;
public class Main2 {
public static void main(String[] args) {
//다차원배열
String [] healer = {"수사","신사","회드"};
String [] dealer = {"암사","조드","냥꾼","법사","징기"};
String [] tanker = {"보기","수드","전사"};
String [] pet = {"용","개"};
//위의 배열을 배열로 묶기
String [][] wow = {healer, dealer, tanker};
//위의 배열의 데이터 출력하기
//배열과 List는 데이터를 인덱스로 구별해서 저장
for(int i =0; i<wow.length; i=i+1) {
//배열들을 순서대로 가져오기
String [] member = wow[i];
if(i==0) {
System.out.print("힐러:");
}else if(i==1) {
System.out.print("딜러:");
}else {
System.out.print("탱커:");
}
for(String person : member) {
System.out.printf("%5s",person);
}
System.out.println();
}
System.out.println("==============");
//배열의 배열 구조가 필요한 경우
//배열->Map -> 배열의 구조 사용
//배열 대신에 List 사용 가능
Map <String, Object> map1 = new HashMap<String, Object>();
//각 배열을 구분할 수 있는 속성을 1개 설정
map1.put("position", "Healer");
//실제 데이터를 맵에 설정
map1.put("data", healer);
Map <String, Object> map2 = new HashMap<String, Object>();
//각 배열을 구분할 수 있는 속성을 1개 설정
map2.put("position", "Dealer");
//실제 데이터를 맵에 설정
map2.put("data", dealer);
Map <String, Object> map3 = new HashMap<String, Object>();
//각 배열을 구분할 수 있는 속성을 1개 설정
map3.put("position", "Tanker");
//실제 데이터를 맵에 설정
map3.put("data", tanker);
Map <String, Object> map4 = new HashMap<String, Object>();
//각 배열을 구분할 수 있는 속성을 1개 설정
map4.put("position", "Pet");
//실제 데이터를 맵에 설정
map4.put("data", pet);
//맵의 배열 만들기
Map [] data = {map1, map2, map3, map4};
//데이터 출력하기
//Map 을 사용할 시, 데이터 추가때 for문을 건드릴 필요가 없다
for(Map<String,Object>map : data) {
System.out.print(map.get("position")+": ");
//실제 데이터 가져오기
String [] s = (String[])map.get("data");
for(String imsi:s) {
System.out.print(imsi+" ");
}
System.out.println();
}
}
}
4. 날짜 관련 클래스
1) java.util.Date
=>1970년 1월 1일 자정을 기준으로 해서 1/1000초 단위의 정수값을 소유하고 있는 클래스
=>이 클래스는 Cloneable 인터페이스를 implements 했으므로 .clone()을 이용해서 복제가 가능합니다.
=>Comparable<Date> 인터페이스를 implements 했으므로 .compareTo(Date)를 이용해서 크기 비교가 가능합니다.
앞에 있는 Date가 매개변수 Date 보다 크면 양수 같으면 0 작으면 음수를 리턴합니다.
- 생성자
Date(): 현재 시간을 갖는 Date 객체를 생성
Date(long timestamp): 1970년 1월 1일 자정 이후에 지나온 시간을 1/1000초 단위의 시간으로 대입하면 Date 객체를 생성합니다.
Date(int year, int month, int date): 년월일을 대입해서 생성하는 생성자인데 deprecated - 여기서 연도는 1900년 이후에 지나온 연도를 대입해야 하고 월은 0부터 시작하는 숫자로 date는 일을 대입해야 해서 년도에 혼돈이 있을 수 있습니다.
- 메소드
String toString(): 년월일시분초를 하나의 문자열로 리턴
출력하는 메소드에 객체의 이름을 대입하면 toString()이 호출된 것과 동일한 효과
- 용도
=>기존의 관계형 데이터베이스 들의 날짜가 Date와 동일하게 저장되어 있어서 데이터베이스 연동할 때 주로 사용하게 됩니다.
2. java.util.Calendar
=>추상 클래스(abstract class): 객체 생성을 할 수 없고 상속을 받아서만 사용하는 클래스
하위 클래스에서 구현할 메소드들의 이름을 가지고 있는 클래스
=>GregorianCalendar 클래스가 Calendar 클래스를 상속받은 클래스입니다.
- 생성자
GregorianCalendar(): 현재 시간을 저장하는 Calendar 객체 생성
GregorianCalendar(int year, int month, int dayOfMonth)
GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute, int second)
- 메소드
int get(Calendar.상수): 상수에 해당하는 값을 리턴
void set(Calendar.상수, 값): 상수에 해당하는 데이터에 값을 설정
long getTimeInMillis(): 1970년 1월 1일 자정 이후의 지나온 시간을 1/1000초 단위로 리턴
실습) 오늘 날짜에 해당하는 Calendar 객체를 만들고 올해 년도를 출력
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class DateMain {
public static void main(String[] args) {
//원래 날짜 및 시간을 저장하고 있는 java.util.Date
//클래스의 객체를 생성
Date date = new Date();
//저장하고 있는 데이터 확인
System.out.println(date);
//년도 확인
System.out.println(date.getYear());
//Calendar 객체 생성
Calendar cal = new GregorianCalendar();
//년도 가져오기
int year = cal.get(Calendar.YEAR);
System.out.println(year);
//오늘부터 1986년 5월 5일까지의 지나온 날수를 출력
//1. 오늘 날짜를 갖는 Calendar 객체와 1986년 5월 5일을
//날짜로 갖는 Calendar
Calendar today = new GregorianCalendar();
Calendar meetday = new GregorianCalendar(1986,4,5);
//2. 위 2객체의 값을 long 타입으로 변환
//long 타입으로 변경하면 1/1000 으로 저장
long time1 = today.getTimeInMillis();
long time2 = meetday.getTimeInMillis();
//3. 구해진2개의 차를 구하고 일 수로 변경
long days= (time1-time2)/1000/84000;
System.out.println("지나온 날: "+days);
}
}
5. seed : 직접 설정하지 않으면 현재 시간을 가지고 설정
6. StringTokenier
=>문자열을 특정 Token 단위로 분할해주는 클래스
=> 최근에는 String 클래스와 정규식을 이용한 split 메소드로 대체
=> CSV: 구분자(컴마, 공백, 탭등) 로 구분된 문자열
웹에서 데이터를 제공하는 포멧
=> CSV -> XML -> JSON -> CSV
html -> 화면 구현
import java.util.Random;
import java.util.TreeSet;
public class RandomMain {
public static void main(String[] args) {
//Random 클래스: 랜덤한 숫자를 만들어내기 위한 클래스
//매개변수 없는 생성자로 만들면 정말 랜덤이 되고
//매개변수에 seed 값을 설정하면 seed에 있는 숫자들이 하나씩 순서대로 리턴
Random r = new Random();
System.out.println(r.nextInt());
//45로 나눈 나머지 값만
System.out.println(r.nextInt(45));
//1-45사이의 숫자를 6개 랜덤하게 저장해서 출력
//숫자는 중복되면 안됍니다.
TreeSet <Integer> ts = new TreeSet<Integer>();
while(ts.size()>6) {
ts.add(r.nextInt(45)+1);
}
//A,B,C,D,E 에서 랜덤하게 3개 추출
//중복허용
String [] ar = {"A", "B", "C", "D"};
for(int i=0 ;i<3;i=i+1 ) {
System.out.print(ar[r.nextInt(ar.length)]+" ");
}
System.out.println();
//시드 고정, 일정한 패턴의 숫자가 순서대로 출력
r.setSeed(100);
System.out.println(r.nextInt());
}
}
import java.util.Random;
import java.util.TreeSet;
public class RandomMain {
public static void main(String[] args) {
//Random 클래스: 랜덤한 숫자를 만들어내기 위한 클래스
//매개변수 없는 생성자로 만들면 정말 랜덤이 되고
//매개변수에 seed 값을 설정하면 seed에 있는 숫자들이 하나씩 순서대로 리턴
Random r = new Random();
System.out.println(r.nextInt());
//45로 나눈 나머지 값만
System.out.println(r.nextInt(45));
//1-45사이의 숫자를 6개 랜덤하게 저장해서 출력
//숫자는 중복되면 안됍니다.
TreeSet <Integer> ts = new TreeSet<Integer>();
while(ts.size()<6) {
ts.add(r.nextInt(45)+1);
}
System.out.println(ts);
//A,B,C,D,E 에서 랜덤하게 3개 추출
//중복허용
String [] ar = {"A", "B", "C", "D"};
for(int i=0 ;i<3;i=i+1 ) {
System.out.print(ar[r.nextInt(ar.length)]+" ");
}
System.out.println();
//시드 고정, 일정한 패턴의 숫자가 순서대로 출력
r.setSeed(100);
System.out.println(r.nextInt());
}
}
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Random;
public class RandomMap {
public static void main(String[] args) {
//A~J
//10개 중에서 3개 랜덤 추출
//중독된 데이터 없이
// 1. 데이터를 하나외 배열이나 lIST이요
ArrayList<String> a1 = new ArrayList<String>();
a1.add("a");
a1.add("b");
a1.add("c");
a1.add("d");
a1.add("e");
a1.add("f");
a1.add("g");
a1.add("h");
a1.add("i");
a1.add("j");
Random r = new Random();
HashSet <Integer> set = new HashSet<Integer>();
while(set.size()<3) {
//0-9사이의 숫자를 랜덤하게 set에 추가
set.add(r.nextInt(10));
}
for(Integer temp : set) {
System.out.println(a1.get(temp));
}
}
}
실습 과제 1) 공백 제거해서 출력하기
public class Problem1 {
public static void main(String[] args) {
String str = "Hello World";
//str에서 공백을 제거하고 출력
//char(). 와 length만을 이용
//처음부터 문자열의 길이가 될때까지
for(int i=0; i<str.length();i=i+1) {
//각 문자를 꺼내서 ch에 저장
char ch = str.charAt(i);
if(ch==' ') {
System.out.print("");
continue;
}
else System.out.print(ch);
}
}
}
실습 과제 2) 긴문자열에 "AOA" 위치 찾기, "AOAOA" 일 경우 앞에 AOA만 인정
public class Problem2 {
public static void main(String[] args) {
String pattern = "AOA";
String search = "AOASDAOAOASAOADAGOAOA";
int psize = pattern.length();
int ssize = search.length();
for(int i =0; i<=ssize-psize; i=i+ 1) {
int j= 0;
boolean flag = false;
int pos = i;
if(search.charAt(i)==pattern.charAt(j)) {
for(j=1; j<psize; j=j+1) {
pos = pos + 1;
// System.out.println(pos);
if(search.charAt(pos)!=pattern.charAt(j)) {
flag=false;
break;
}
flag=true;
}
}
if(flag==true) {
System.out.println(i+" ");
i=pos;
}
}
}
}
'IT > JAVA (17.12.18~)' 카테고리의 다른 글
17일 JAVA(17) (0) | 2018.01.11 |
---|---|
16일 JAVA(16) (0) | 2018.01.10 |
14일차 JAVA(14) (0) | 2018.01.09 |
13일차 JAVA(13) (0) | 2018.01.05 |
12일차 JAVA(12) (0) | 2018.01.04 |