Java - Format, java.sql.date, StringTokenizer, Calendar, Class, Reflection

|

 

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() {
		
	}

}







And