Java - Format, java.sql.date, StringTokenizer, Calendar, Class, Reflection
| Java 2019. 7. 16. 11:23
package Week02.day0716;
import java.util.Arrays;
abstract class Project{
private String name;
private String startDt;
private String endDt;
private String location;
private Developer[] dev; // 사이즈 초기값을 정해놓고 시작하는게 좋다.(실무에서도 보통 그러함)
private int count;
Project(String name, String startDt, String endDt, String location){ // 초기세팅 개발자 안 들어가있는 프로젝트
this.name = name;
this.startDt = startDt;
this.endDt = endDt;
this.location = location;
}
Project(String name, String startDt, String endDt, String location, Developer[] dev){ // 초기세팅 개발자 들어가있는 프로젝트
this.name = name;
this.startDt = startDt;
this.endDt = endDt;
this.location = location;
this.dev = dev;
}
public Project(String name, int period) {
// TODO Auto-generated constructor stub
}
public void process() { // 모든 Project는다음의 4가지 과정을 거치게 된다 plan(),join(), design(), develop()
plan();
design();
develop();
}
public void plan() { // “Project 준비” 출력
System.out.println("Project준비");
}
public void join(Developer[] d) { // Proejct에 개발자 Add(추가로 조인시키는 방법)
this.dev = d;
count++; // 예외처리해주는게 좋음.
}
public abstract void design(); // “설계작업수행” 출력
public abstract void develop(); // “개발작업수행” 출력
public int getPeriod() { // Project 기간 리턴
int endDt1 = Integer.parseInt(endDt);
int startDt1 = Integer.parseInt(startDt);
int period = endDt1 - startDt1;
return period;
}
public void getMMByDeveloper() { // Project에 참여한 개발자의 총 월간 개월수
int sum =0;
for(int i=0; i<dev.length; i++) {
sum+=dev[i].getPeriod();
}
System.out.println("Project에 참여한 개발자들의 총 월간 개월수는 = " + sum + "개월 입니다.");
// System.out.println("참여상황 = 개발자 : " + Arrays.toString(dev) + ", 총 개월수 : "+ (dev.length*(Integer.parseInt(endDt)-Integer.parseInt(startDt))));
// dev.length 대신 this.count 로 써도됨?
}
public void printDeveloper() {
for(int i=0; i<dev.length; i++) {
if(dev[i]!=null && dev[i] instanceof HighDeveloper)
System.out.println("고급개발자 " + dev[i].getName() + "/ 특기 " + ((HighDeveloper)dev[i]).getSpecialSkill()); // (HighDeveloper)로 변환한뒤 가져와야함.
else
System.out.println("일반개발자 " + dev[i].getName());
}
// System.out.println(dev[i] instanceof HighDeveloper? "고급개발자":"일반개발자");
// System.out.println(dev[i].getName());
// System.out.println(dev[i] instanceof HighDeveloper? "자바개발":" ");
}
}
class HrProject extends Project{
HrProject(String name, String startDt, String endDt, String location) {
super(name, startDt, endDt, location);
// TODO Auto-generated constructor stub
}
public void design() { // “HR 설계작업수행” 출력
System.out.println("HR 설계작업 수행");
}
public void develop() { // “HR 개발작업수행” 출력
System.out.println("HR 개발작업 수행");
}
}
class Developer{
private String name;
private int period;
public Developer(String name, int period) {
this.name = name;
this.period = period;
}
public String getName() {
return name;
}
public int getPeriod() {
return period;
}
public void setName(String name) {
this.name = name;
}
public void setPeriod(int period) {
this.period = period;
}
}
class HighDeveloper extends Developer{
private String specialSkill; // HighDeveloper만의 속성
HighDeveloper(String name, int period, String specialSkill){
super(name, period);
this.specialSkill = specialSkill;
}
String getSpecialSkill() {
return specialSkill;
}
void setSpecialSkill(String specialSkill) {
this.specialSkill = specialSkill;
}
}
public class 실습6일차 {
public static void main(String[] args) {
HrProject hr = new HrProject("사람인HR시스템구축", "20190716", "20190816", "서울");
Developer[] dev = new Developer[3];
dev[0] = new Developer("홍길동", 12);
dev[1] = new Developer("김길동", 24);
HighDeveloper dev2 = new HighDeveloper("김고급", 36, "java");
dev[2] = dev2;
hr.join(dev);
hr.process();
hr.getMMByDeveloper();
hr.printDeveloper();
}
}
--------------------------------------------------------------------------
package Week02.day0716;
import java.util.Arrays;
class CompanyMan{
private String name;
private int age;
private String[] hobby = new String[3]; //array가 있으면 count를 써라.
private Company nowCompany;
private Company[] hisCompany = new Company[3];
private int hobbyCnt;
private int hisCompanyCnt;
CompanyMan(String name, int age, Company nowCompany){
this.name = name;
this.age = age;
this.nowCompany = nowCompany;
}
public boolean setHobby(String hobby) { // 취미를 추가
int temp = hobbyCnt;
try {
this.hobby[this.hobbyCnt] = hobby;
hobbyCnt++;
} catch(Exception e) {
hobbyCnt = temp;
return false;
}
return true;
}
public boolean delHobby(String hobby) { // 취미를 삭제. 예외처리 사용할것. temp로 담았다가 실패하면 temp로 복귀.
int index = -1;
String[] temp = Arrays.copyOf(this.hobby, this.hobby.length);
try {
// 삭제할 취미가 있는 index구하기
for(int i=0; i<this.hobbyCnt; i++) {
if(this.hobby[i].equals(hobby)) {
index = i;
}
}
//삭제할 취미가 존재하지 않는 경우
if(index<0) {
return false;
}
//해당 index 제외하고 새로운 취미배열 만들기
for(int i=0; i<this.hobbyCnt; i++) {
if(i>=index) {
this.hobby[i] = this.hobby[i+1];
}
}
// 삭제대상 취미가 있는 경우 마지막 값 초기화
this.hobby[this.hobbyCnt-1]= null;
} catch(Exception e) {
this.hobby = temp;
return false;
}
this.hobbyCnt--;
return false;
}
public void setNowCompany(Company company) { // 현재 근무 회사등록. 현재근무회사가 변경되면 historyCompany에 이력을 추가
hisCompany[hisCompanyCnt] = this.nowCompany;
hisCompanyCnt++;
this.nowCompany = company;
}
public void printHobby() {
for(int i=0; i<this.hobbyCnt; i++) {
System.out.println(hobby[i]);
}
}
public void printHistoryCompany() {
for(int i=0; i<this.hisCompanyCnt; i++) {
System.out.println(hisCompany[i].getName());
}
}
}
class Company{
private String name;
private int period;
Company(String name, int period){
this.name = name;
this.period = period;
}
Company(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPeriod() {
return period;
}
public void setPeriod(int period) {
this.period = period;
}
}
public class 실습6일차_2 {
public static void main(String[] args) {
CompanyMan cm = new CompanyMan("홍길동", 32, new Company("비트교육센터"));
cm.setHobby("바둑");
cm.setHobby("조깅");
cm.printHobby();
System.out.println("============================");
cm.delHobby("조깅");
cm.printHobby();
System.out.println("============================");
cm.setNowCompany(new Company("LG전자"));
cm.printHistoryCompany();
}
}
--------------------------------------------------------------------------
package Week02.day0716;
import java.util.StringTokenizer;
public class StringTokenizerTest {
public static void main(String[] args) {
StringTokenizer st = new StringTokenizer("This \t is a \n String");
while(st.hasMoreTokens())
System.out.println(st.nextToken());
System.out.println("==========================================");
//인자로 주어진 문자열을 :을 구분자로서 구분한다.
String str = "80::95::70";
StringTokenizer st2 = new StringTokenizer(str, ":", false);
int i = 0;
while(st2.hasMoreTokens()) {
System.out.println(i+":"+st2.nextToken());
i++;
}
System.out.println("==========================================");
//StringTokenizer 는 구분자끼리 붙어 있는 경우 위와 같이 구분을 하지 못하는 문제가 있다.
String[] result = str.split(":"); //배열은 오류가능성 내포. index로 접근하므로 split을 써야함.
for(int x = 0; x<result.length;x++) {
System.out.println(x+":"+result[x]);
}
System.out.println("==========================================");
//하지만 split도 마지막에 구분자가 있을 땐 이를 처리하지 못함-> 2개의 인자를 받는 split사용
String str2 = "81-2-010-1234-5678";
String[] arr2 = str2.split("-", 4);
for(int x=0; x<arr2.length; x++) {
System.out.println(x+":"+arr2[x]);
}
}
}
--------------------------------------------------------------------------
package Week02.day0716;
import java.text.ChoiceFormat;
import java.text.DecimalFormat;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class FormatTest {
public static void main(String[] args) {
// DecimlaFormat : 숫자 형식화
DecimalFormat df2 = new DecimalFormat("#,###,##");
System.out.println(df2.format(123456789.98)); // 1,23,45,67,90
DecimalFormat df3 = new DecimalFormat("#,###");
System.out.println(df2.format(123456789)); // 1,23,45,67,89
//SimpleDateFormat : 날짜 형식화
Date today = new Date();
SimpleDateFormat sdf4 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss a");
System.out.println(sdf4.format(today)); // 2019-07-16 04:26:49 오후
//ChoiceFormat : 특정범위를 문자열로 변환
//# : 경계값 포함(작거나 같다), <은 경계값 미포함
String pattern = "60#D|70#|80<B|90#A"; //90은 A, 80은 C
int [] scores = {91, 90, 80, 88, 70, 52, 60};
ChoiceFormat form = new ChoiceFormat(pattern);
for(int i=0; i<scores.length; i++) {
System.out.println(scores[i] + "form.format(scores[i]))"); // 91form.format(scores[i]))
}
//MessageFormat - 많이 쓰임.
String msg = "Name: {0} \nTel: {1} \nAge: {2} \nBirthday:{3}";
Object[] arguments = {"이자바", "02-123-1234", "27", "07-09"};
String result = MessageFormat.format(msg, arguments);
System.out.println(result);
/*Name: 이자바
Tel: 02-123-1234
Age: 27
Birthday:07-09
*
*/
}
}
--------------------------------------------------------------------------
package Week02.day0716;
import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class JavaSqlDateTest {
public static void main(String args[]) throws ParseException {
//java.util.Date : 오라클 날짜 타입과 연동불가
//java.sql.Date : 오라클 날짜타입과 연동가능 -> 대부분의 회사에서 많이 쓰임.
//String->java.sql.Daste 변환
String day = "2016-11-22"; //형식을 지켜야 함
java.sql.Date d = java.sql.Date.valueOf(day);
System.out.println(d); // 2016-11-22
//String -> java.sql.Timestamp 변환
String day2 = "2016-11-22 11:22:30.0"; // 형식을 지켜야 함.
java.sql.Timestamp t = java.sql.Timestamp.valueOf(day2);
System.out.println(t); // 2016-11-22 11:22:30.0
//String -> java.util.Date 변환
String day3 = "20161122"; // SimpleDateFormat 생성자에 전달되는 형식과 일치해야함
java.util.Date d2 = new java.text.SimpleDateFormat("yyyyMMdd").parse(day3);
System.out.println(d2); // Tue Nov 22 00:00:00 KST 2016
//java.util.Date -> java.sql.Date 변환
java.util.Date u = new java.util.Date();
java.sql.Date s = new java.sql.Date(u.getTime());
System.out.println(u); // Tue Jul 16 16:37:32 KST 2019
System.out.println(s); // 2019-07-16
}
public Date transformDate(String date) {
//날짜가 yyyymmdd 형식으로 입력되었을 경우 Date로 변경하는 메소드
SimpleDateFormat beforeFormat = new SimpleDateFormat("yyyymmdd");
//Date로 변경하기 위해서는 날짜 형식을 yyyy-mm-dd로 변경해야 한다,
SimpleDateFormat afterFormat = new SimpleDateFormat("yyyy-mm-dd");
java.util.Date tempDate = null;
try {
//현재 yyyymmdd로 된 날짜형식으로 java.util.Date객체를 만든다.
tempDate = beforeFormat.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
//java.util.Date를 yyyy-mm-dd 형식으로 변경하여 String로 반환한다.
String transDate = afterFormat.format(tempDate);
//반환된 String 값을 Date로 변경한다.
Date d3 = Date.valueOf(transDate);
System.out.println(d3);
return d3;
}
}
--------------------------------------------------------------------------
package Week02.day0716;
import java.util.Calendar;
public class CalendarEx4 {
public static void main(String[] args) {
Calendar date = Calendar.getInstance(); // Singleton(힙에 자신의 인스턴스는 1개만 존재하도록 해놓은 규칙.)
date.set(2005, 7, 31); // 2005년 8월 31일
System.out.println(toString(date)); // 2005년8월31일
System.out.println("= 1일 후 =");
date.add(Calendar.DATE, 1);
System.out.println(toString(date)); // 2005년9월1일
System.out.println("= 6달 전 =");
date.add(Calendar.MONTH, -6);
System.out.println(toString(date)); // 2005년3월1일
System.out.println("= 31일 후(roll) =");
date.roll(Calendar.DATE, 31);
System.out.println(toString(date)); // 2005년3월1일
System.out.println("= 31일 후(add) =");
date.add(Calendar.DATE, 31);
System.out.println(toString(date)); // 2005년4월1일
}
public static String toString(Calendar date) {
return date.get(Calendar.YEAR)+"년"+(date.get(Calendar.MONTH)+1)+"월" + date.get(Calendar.DATE) + "일";
}
}
--------------------------------------------------------------------------
package Week02.day0716;
import java.util.Calendar;
public class CalendarEx5 {
public static void main(String[] args) {
//기본적으로 현재날짜와 시간으로 설정된다.
Calendar today = Calendar.getInstance();
System.out.println("이 해의 년도 : " + today.get(Calendar.YEAR));
System.out.println("월(0~11, 0:1월)" + today.get(Calendar.MONTH)); // month는 0부터 시작
System.out.println("이 해의 몇 째 주 : " + today.get(Calendar.WEEK_OF_YEAR));
System.out.println("이 달의 몇 째 주 : " + today.get(Calendar.WEEK_OF_MONTH));
//DATE와 DAY_OF_MONTH는 같다.
System.out.println("이 달의 몇 일 : " + today.get(Calendar.DATE));
System.out.println("이 달의 몇 일 : " + today.get(Calendar.DAY_OF_MONTH));
System.out.println("이 해의 몇 일 : " + today.get(Calendar.DAY_OF_YEAR));
// 1:일요일, 2:월요일,... 7:토요일
System.out.println("요일(1~7, 1:일요일) : " + today.get(Calendar.DAY_OF_WEEK));
System.out.println("이 달의 몇 째 요일 : " + today.get(Calendar.DAY_OF_WEEK_IN_MONTH));
System.out.println("오전_오후(0:오전, 1:오후): " + today.get(Calendar.AM_PM));
System.out.println("시간(0~11) : " + today.get(Calendar.HOUR));
System.out.println("시간(0~23) : " + today.get(Calendar.HOUR_OF_DAY));
System.out.println("분(0~59) : " + today.get(Calendar.MINUTE));
System.out.println("초(0~59) : " + today.get(Calendar.SECOND));
System.out.println("1000분의 1초(0~999): " + today.get(Calendar.MILLISECOND));
//천분의 1초를 시간으로 표시하기 위해 3600000으로 나누었다.(1시간 = 60*60초)
System.out.println("TimeZone(-12~+12) : " + (today.get(Calendar.ZONE_OFFSET)/(60*60*1000)));
//이 달의 마지막 일을 찾는다.
System.out.println("이 달의 마지막 날 : " + today.getActualMaximum(Calendar.DATE));
}
}
--------------------------------------------------------------------------
package Week02.day0716;
import java.util.Calendar;
public class CalendarEx6 {
public static void main(String[] args) {
//실무에서 많이 쓰임.
//년월 가져올때 캘린더 쓰임.
if(args.length!=2) {
System.out.println("Usage : java CalendarEx6 2015 9");
return;
}
int year = Integer.parseInt(args[0]);
int month = Integer.parseInt(args[1]);
int START_DAY_OF_WEEK = 0;
int END_DAY = 0;
Calendar sDay = Calendar.getInstance(); // 시작일
Calendar eDay = Calendar.getInstance(); // 끝일
//월의 경우 0부터 11까지의 값을 가지므로 1을 빼주어야 한다.
//예를 들어, 2004년 11월 1일은 sDay.set(2004, 10, 1):과 같이 해줘야 한다.
sDay.set(year, month-1, 1);
eDay.set(year, month, 1);
//다음달의 첫날에서 하루를 빼면 현재달의 마지막 날이 된다.
//12월 1일에서 하루를 빼면 11월 30일이 된다.
eDay.add(Calendar.DATE, -1);
//첫번째 요일이 무슨 요일인지 알아낸다.
START_DAY_OF_WEEK = sDay.get(Calendar.DAY_OF_WEEK);
//eDay에 지정된 날짜를 얻어온다.
END_DAY = eDay.get(Calendar.DATE);
System.out.println(" " + args[0] + "년" + args[1] + "월");
System.out.println(" SU MO TU WE TH FR SA ");
//해당월의 1일이 어느 요일인지에 따라서 공백을 출력한다.
//만일 1일이 수요일이라면 공백을 세번 찍는다.(일요일부터 시작)
for(int i=1; i<START_DAY_OF_WEEK; i++) {
System.out.print(" ");
}
for(int i=1, n=START_DAY_OF_WEEK; i<=END_DAY; i++, n++) {
System.out.print((i<10)? " " +i : " " +i);
if(n%7==0) System.out.println();
}
}
}
--------------------------------------------------------------------------
/* class */
1. class의 정보를 가지고 있는 클래스
2. Class.forName("java.util.Vector").newInstance(); // ★★★==> Vector V = new Vector(); 같은 문장! 문법이므로 꼭 기억할 것
- newInstance() 를 호출하게 되면 java.util.Vector의 인스턴스를 생성한 다음 기본 생성자를 호출
하여 인스턴스를 초기화하고 인스턴스를 리턴한다.
3. class 객체 얻는 방법
- class obj = new Card().getClass();
- class obj = Card.class;
- class obj = class.forName("card");
package Week02.day0716;
class A{
public int i;
public A() {
System.out.println("A 생성자");
}
public void m() {
System.out.println("A.m()");
}
}
class B extends A{
public B() {
System.out.println("B 생성자");
}
public void m() {
System.out.println("B.m()");
}
public void m2() {
System.out.println("B.m2()");
}
}
public class ClassTest {
public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
A a = new B(); // Class 클래스의 인스턴스는 자바상에서 Class들을 표현한다.
Class c1 = a.getClass(); //Object의 runtime상의 class를 반환한다.
System.out.println("class name:" + c1.getName());
System.out.println("super class name : " + c1.getSuperclass());
// 새로운 instance를 생성한다.
B b = (B)(c1.newInstance());
b.m2(); //B라는 이름의 클래스 객체를 반환, package까지 표현
Class c2 = Class.forName("data.B"); // B instance를 A가 가르키로 override된 B.m()을 호출
((A)c2.newInstance()).m();
System.out.println("abc".getClass().getName());
}
}
--------------------------------------------------------------------------
/* Reflection */
1. framework에서 쓰임
2. Runtime에 클래스를 전달받아서 임의의 Method를 실행하는 시스템이 있다고 가정할때
이때 전달되는 파라미터, return 되는 파라미터 모두 개발당시에는 알지못한다고 한다면
그 클래스에 대한 정보를 제공하는 API가 Reflection API이다.
package Week02.day0716;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectTest {
public String str;
public ReflectTest(String str) {
this.str = str;
System.out.println("REFLECT 생성자호출 : " + str);
}
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Class c = Class.forName("data.ReflectTest");
System.out.println(c); // class 명 출력
Constructor[] ctor = c.getConstructors(); // 생성자를 얻는다.
for(int i=0; i<ctor.length; i++) {
System.out.println("생성자 : " + ctor[i].toString());
}
Method m[] = c.getMethods(); // 메소드를 얻는다.
for(int i=0; i<m.length; i++) {
System.out.println("메소드 : " + m[i].toString());
}
//메소드 호출하기
Class c2 = Class.forName("data.ReflectTest");
//String 하나를 매개변수로 가지는 파라미터를 형식을 만든다.
Class[] parameterTypes = new Class[] {String.class};
//String을 인자로 받는 생성자에 접근하는 정보를 얻는다.
Constructor constructor = c2.getConstructor(parameterTypes);
//객체 생성
Object obj = constructor.newInstance(new Object[] {"REFLECT"});
//String 하나를 매개변수로 가지는 파라미터를 형식을 만든다.
Class[] parameterTypes2 = new Class[] {String.class};
//String을 인자로 받는 메소드에 접근하는 정보를 얻는다.
Method method = c2.getMethod("test01", parameterTypes2);
Object[] parameters = new Object[] {"메소드호출"};
//메소드를 호출한다.
Object oResult = method.invoke(obj, parameters);
}
public void test01(String paramStr) {
System.out.println("test01 메소드호출 : " + paramStr);
}
public void test02() {
}
}
'Java' 카테고리의 다른 글
Java - 제네릭스, Wildcard, 열거형, Thread (0) | 2019.07.18 |
---|---|
Java - ArrayList, LinkedList, Stack, Queue, Iterator, ListIterator, Comparator, HashSet, TreeSet, HashMap, Set (0) | 2019.07.17 |
Java - 자료구조(Collection), Random, Wrapper (0) | 2019.07.15 |
Java - 다형성, 상속, 예외 (0) | 2019.07.12 |
Java - Switch, 다중for문, Break문, 반복문복합, Singleton, Prototype패턴, 인터페이스, String, StringBuffer (0) | 2019.07.11 |