IT/JAVA (17.12.18~)

15일 JAVA(15)

만두토끼 2018. 1. 10. 12:12

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 -> 화면 구현 




7. Random 

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