Java ParseException

2023. 2. 7. 22:16Java

프로젝트 내 src 내 oracle.db 패키지 내 OracleConnect.java

package oracle.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class OracleConnect {
	// 다른 클래스에서는 new 로 생성할수 없다
	private OracleConnect() {
		// 오라클 드라이버 클래스 실행
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			System.out.println("오라클 드라이버가 없어요:" + e.getMessage());
		}
	}

	public static OracleConnect getInstance() {
		return new OracleConnect();
	}

	// db 연결해서 성공한 커넥션 반환하는 메서드
	public Connection getConnection() {
		Connection conn = null;
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
		try {
			conn = DriverManager.getConnection(url, "사용자이름", "a1234");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("오라클 서버 연결 실패:" + e.getMessage());
		}

		return conn;
	}

	// 총 4개의 dbClose 를 만듬
	public void dbClose(ResultSet rs, Statement stmt, Connection conn) {
		try {
			if (rs != null)
				rs.close();
			if (stmt != null)
				stmt.close();
			if (conn != null)
				conn.close();
		} catch (SQLException e) {

		}
	}

	public void dbClose(Statement stmt, Connection conn) {
		try {
			if (stmt != null)
				stmt.close();
			if (conn != null)
				conn.close();
		} catch (SQLException e) {
		}
	}

	public void dbClose(ResultSet rs, PreparedStatement pstmt, Connection conn) {
		try {
			if (rs != null)
				rs.close();
			if (pstmt != null)
				pstmt.close();
			if (conn != null)
				conn.close();
		} catch (SQLException e) {

		}
	}

	public void dbClose(PreparedStatement pstmt, Connection conn) {
		try {
			if (pstmt != null)
				pstmt.close();
			if (conn != null)
				conn.close();
		} catch (SQLException e) {

		}
	}
}

프로젝트 내 src 내 javabasic 패키지 내 PersonDto.java

package javabasic;

import java.util.Date;

public class PersonDto {
	private int num;
	private String name;
	private String blood;
	private int java;
	private int spring;
	private double height;
	private Date birthday;

	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 String getBlood() {
		return blood;
	}

	public void setBlood(String blood) {
		this.blood = blood;
	}

	public int getJava() {
		return java;
	}

	public void setJava(int java) {
		this.java = java;
	}

	public int getSpring() {
		return spring;
	}

	public void setSpring(int spring) {
		this.spring = spring;
	}

	public double getHeight() {
		return height;
	}

	public void setHeight(double height) {
		this.height = height;
	}

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
}

프로젝트 내 src 내 javabasic 패키지 내 PersonDao.java

package javabasic;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import oracle.db.OracleConnect;

public class PersonDao {
	OracleConnect db;
	public PersonDao()
	{
		db=OracleConnect.getInstance();
	}
	
//	전체 데이타 리턴하는 메서드
	public List<PersonDto> getAllPersons()
	{
		List<PersonDto> list=new ArrayList<PersonDto>();
		Connection conn=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		String sql="select * from person2 order by num asc";
//		db 연결
		conn=db.getConnection();
		
		try {
			conn.commit();
		} catch (SQLException e1) {
			// TODO Auto-generated catch block
			System.out.println("오류 : "+e1.getMessage());
		}
		
		try {
			pstmt=conn.prepareStatement(sql);
//			실행
			rs=pstmt.executeQuery();
			while(rs.next())
			{
//				이 때 dto 선언은 반드시 while문 안에서 해야한다
				PersonDto dto= new PersonDto();
//				db에서 데이타 가져오기
				int num=rs.getInt("num");
				int java=rs.getInt("java");
				int spring=rs.getInt("spring");
				String name=rs.getString("name");
				String blood=rs.getString("blood");
				double height=rs.getDouble("height");
				Date birthday=rs.getDate("birthday");
				
//				dto 에 넣기
				dto.setNum(num);
				dto.setName(name);
				dto.setBirthday(birthday);
				dto.setJava(java);
				dto.setSpring(spring);
				dto.setBlood(blood);
				dto.setHeight(height);
				
//				list 에 dto추가
				list.add(dto);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("select 오류:"+e.getMessage());
		}finally {
			db.dbClose(rs, pstmt, conn);
		}
		
		return list;
	}
	
//	데이타를 dto 로 받아 db에 insert 하는 메서드
	public void personInsert(PersonDto dto)
	{

		Connection conn=null;

		PreparedStatement pstmt=null;
		
		String sql="insert into person2 values (seq_person.nextval,?,?,?,?,?,?)";

		conn=db.getConnection();
//		try {
//			pstmt=conn.prepareStatement(sql);
//			pstmt.setString(1, dto.getName());
//			pstmt.setString(2, dto.getBlood());
//			pstmt.setInt(3, dto.getJava());
//			pstmt.setInt(4, dto.getSpring());
//			pstmt.setDouble(5, dto.getHeight());
//			pstmt.setString(6, dto.getBirthday().toString());
//			
//			pstmt.execute();
//			
//		} catch (SQLException e) {
//			// TODO Auto-generated catch block
//			System.out.println("insert 문 오류에요 : "+e.getMessage());
//		} finally {
//			db.dbClose(pstmt, conn);
//		}
		try {
			pstmt=conn.prepareStatement(sql);
//			바인딩
			pstmt.setString(1, dto.getName());
			pstmt.setString(2, dto.getBlood());
			pstmt.setInt(3, dto.getJava());
			pstmt.setInt(4, dto.getSpring());
			pstmt.setDouble(5, dto.getHeight());
			
//			System.out.println(dto.getBirthday());
			
//			util.Date 를 String 으로 변환
			SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
			pstmt.setString(6, sdf.format(dto.getBirthday()));
			
			//실행
			pstmt.execute();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("sql insert 오류:"+e.getMessage());
		}finally {
			db.dbClose(pstmt, conn);
		}
	}
	
//	이름을 파라미터로 받고 성공한 레코드의 갯수를 반환
	public int personDelete(String name)
	{
//		int n=0;
//		Connection conn=null;
//		Statement stmt=null;
//		
//		String sql="delete from person2 where name='"+name+"'";
//		
//		conn=db.getConnection();
//		try {
//			stmt=conn.createStatement();
//			n=stmt.executeUpdate(sql);
//		} catch (SQLException e) {
//			// TODO Auto-generated catch block
//			System.out.println("오류 : "+e.getMessage());
//		} finally {
//			db.dbClose(stmt, conn);
//		}
		
		int n=0;
		Connection conn=null;
		PreparedStatement pstmt=null;
		String sql="delete from person2 where name=?";
//		db연결
		conn=db.getConnection();
		try {
			pstmt=conn.prepareStatement(sql);
//			바인딩
			pstmt.setString(1, name);
//			실행
			n=pstmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("sql delete 오류:"+e.getMessage());
		}finally {
			db.dbClose(pstmt, conn);
		}
		return n;
	}
	
//	수정후 성공한 레코드 갯수 반환
	public int personUpdate(PersonDto dto)
	{
//		int n=0;
//		Connection conn=null;
//		Statement stmt=null;
//		
//		String sql="update person2 set name='"+dto.getName()+"',blood='"+dto.getBlood()+"',java="+dto.getJava()+",spring="+dto.getSpring()+" where num="+dto.getNum();
////		System.out.println(sql);
//		conn=db.getConnection();
//		
//		try {
//			stmt=conn.createStatement();
//			n=stmt.executeUpdate(sql);
//			
////			System.out.println(n);
//			
//		} catch (SQLException e) {
//			// TODO Auto-generated catch block
//			System.out.println("sql나 sql update 오류 : "+e.getMessage());
//		} finally {
//			db.dbClose(stmt, conn);
//		}
		
		
		
		
		int n=0;
		Connection conn=null;
		PreparedStatement pstmt=null;
		String sql="update person2 set name=?,blood=?,java=?,spring=? where num=?";
		conn=db.getConnection();
		try {
			pstmt=conn.prepareStatement(sql);
//			바인딩
			pstmt.setString(1, dto.getName());
			pstmt.setString(2, dto.getBlood());
			pstmt.setInt(3, dto.getJava());
			pstmt.setInt(4, dto.getSpring());
			pstmt.setInt(5, dto.getNum());
//			실행
			n=pstmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("sql update 오류:"+e.getMessage());
		}finally {
			db.dbClose(pstmt, conn);
		}
		
		
		
		return n;
	}
	
//	혈액형 검색
	public List<PersonDto> getBloodSearch(String blood)
	{
		List<PersonDto> list=new ArrayList<PersonDto>();
		
//		Connection conn=null;
//		Statement stmt=null;
//		ResultSet rs=null;
//		
//		String sql="select name,java,spring,height,birthday from person2 where blood='"+blood+"' order by name asc";
//		
//		conn=db.getConnection();
//		try {
//			stmt=conn.createStatement();
//			rs=stmt.executeQuery(sql);
//			while(rs.next())
//			{
//				PersonDto dto=new PersonDto();
//				
//				
//				dto.setName(rs.getString("name"));
//				dto.setBlood(blood);
//				dto.setJava(rs.getInt("java"));
//				dto.setSpring(rs.getInt("spring"));
//				dto.setHeight(rs.getDouble("height"));
//				dto.setBirthday(rs.getDate("birthday"));
//				
//				list.add(dto);
//			}
//		} catch (SQLException e) {
//			// TODO Auto-generated catch block
//			System.out.println("sql select 나 sql 오류입니다 : "+e.getMessage());
//		}finally {
//			db.dbClose(rs, stmt, conn);
//			
//		}
		
		
		Connection conn=null;
		PreparedStatement pstmt=null;
		ResultSet rs=null;
		String sql="select * from person2 where blood=? order by name asc";
		
//		db 연결
		conn=db.getConnection();
		try {
			pstmt=conn.prepareStatement(sql);
//			바인딩
			pstmt.setString(1, blood.toLowerCase());
//			실행
			rs=pstmt.executeQuery();
			while(rs.next())
			{
				PersonDto dto=new PersonDto();
				dto.setName(rs.getString("name"));
				dto.setJava(rs.getInt("java"));
				dto.setSpring(rs.getInt("spring"));
				dto.setHeight(rs.getDouble("height"));
				dto.setBirthday(rs.getDate("birthday"));
//				추가
				dto.setNum(rs.getInt("num"));
				dto.setBlood(rs.getString("blood"));
//				list 에 추가
				list.add(dto);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("sql search 오류:"+e.getMessage());
		}finally {
			db.dbClose(rs, pstmt, conn);
		}
		return list;
	}
}

프로젝트 내 src 내 javabasic 패키지 내 Ex4PersonModel.java

package javabasic;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Scanner;

public class Ex4PersonModel {
	PersonDao dao=new PersonDao();
	Scanner sc=new Scanner(System.in);
	//	메뉴 선택 메서드
	public int getMenu()
	{
		int n;
		System.out.println("\t\t**메뉴**");
		System.out.println("1.추가  2.삭제  3.수정  4.검색  5.전체출력  6.종료");
		n=Integer.parseInt(sc.nextLine());
		return n;
	}
	//	출력 메서드
	public void writeAll()
	{
		System.out.println("** 출력합니다 **");
		//		dao 로부터 리스트 목록을 받아온다
		List<PersonDto> list=dao.getAllPersons();
		System.out.println("번호\t이름\t혈액형\t자바\t스프링\t키\t생년월일");
		System.out.println("----------------------------------------------------------");
		for(PersonDto dto:list)
		{
			System.out.println(dto.getNum()+"\t"+dto.getName()+"\t"+dto.getBlood().toUpperCase()+"형\t"+dto.getJava()+"\t"+dto.getSpring()+"\t"+dto.getHeight()+"\t"+dto.getBirthday());
		}
	}
	//	입력 메서드
	/*
	 * 데이타 추가
	 * 
	 * dao 의 insert 메서드
	 * 
	 * ex4 번의 add메서드
	 */
	public void dataAdd()
	{
		System.out.println("** 데이타를 추가합니다 **");

		String name,blood;
		int java,spring;
		double height;
		System.out.println("이름입력");
		name=sc.nextLine();
		System.out.println("혈액형 입력(소문자로)");
		blood=sc.nextLine();
		System.out.println("자바점수입력");
		java=sc.nextInt();
		System.out.println("스프링점수입력");
		spring=sc.nextInt();
		System.out.println("키 입력");
		height=sc.nextDouble();
		System.out.println("날짜입력(yyyy-mm-dd 형식으로 입력)");
		sc.nextLine();//버퍼의 엔터처리
		String birth=sc.nextLine();
		
		//문자열을 util.Date 로 변환하는방법
		SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
		Date birthday=null;
		try {
			birthday=sdf.parse(birth);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			System.out.println("날짜 형식으로 입력해주세요");
		}
		
//		입력한 데이타를 dto 에 넣기
		PersonDto dto=new PersonDto();
		dto.setName(name);
		dto.setBlood(blood);
		dto.setJava(java);
		dto.setSpring(spring);
		dto.setHeight(height);
		dto.setBirthday(birthday);
		
//		db insert 메서드 호출
		dao.personInsert(dto);
		System.out.println("추가되었습니다");
	}

	//	수정메서드
	/*
	 * 수정하기
	 * 
	 * dao
	 * 
	 *   public int personUpdate(PeronDto dto)
	 *   {
	 *   
	 *   }
	 *   
	 * ex4
	 *   dataUpdate
	 *   	num,name,blood,java,spring
	 *   	5개를 입력후 dto로 묶어서
	 *   	dao 의 personUpdate 로 보내면 해당 메서드에서는 num 을 조건으로 수정하고
	 *   	성공한 레코드의 갯수를 리턴
	 *   
	 *   출력은 리턴값 n 이 0 이면 "해당 번호는 없습니다"
	 *   0이 아니면 "수정했습니다"
	 */
	public void dataUpdate()
	{
		System.out.println("** 데이타를 수정합니다 **");
//		num,name,blood,java,spring
//		입력후 dto로 묶어서 메서드로 보내기
//		System.out.println("수정할 번호 입력 : ");
//		int num=Integer.parseInt(sc.nextLine());
//		
//		System.out.println("수정할 이름 입력 : ");
//		String name=sc.nextLine();
//		
//		System.out.println("수정할 혈액형 입력 : ");
//		String blood=sc.nextLine();
//		
//		System.out.println("수정할 자바점수 입력 : ");
//		int java=Integer.parseInt(sc.nextLine());
//		
//		System.out.println("수정할 스프링점수 입력 : ");
//		int spring=Integer.parseInt(sc.nextLine());
//		
//		PersonDto dto=new PersonDto();
//		dto.setNum(num);
//		dto.setName(name);
//		dto.setBlood(blood);
//		dto.setJava(java);
//		dto.setSpring(spring);
//		
//		int n=dao.personUpdate(dto);
//		
//		
////		n이 0이면 "해당 번호는 없습니다", 그 이외 "수정했습니다"
//		if(n==0)
//			System.out.println("해당 번호는 없습니다");
//		else
//			System.out.println("수정했습니다");
		
		String name,blood;
		int java,spring;
		
		System.out.println("수정할 num값");
		int num=Integer.parseInt(sc.nextLine());
		
		System.out.println("이름입력");
		name=sc.nextLine();
		System.out.println("혈액형 입력(소문자로)");
		blood=sc.nextLine();
		System.out.println("자바점수입력");
		java=Integer.parseInt(sc.nextLine());
		System.out.println("스프링점수입력");
		spring=Integer.parseInt(sc.nextLine());
		
		PersonDto dto=new PersonDto();
		dto.setNum(num);
		dto.setName(name);
		dto.setBlood(blood);
		dto.setJava(java);
		dto.setSpring(spring);
		
//		dao 메서드 호출
		int n=dao.personUpdate(dto);
		
//		n이 0이면 "해당 번호는 없습니다", 그 이외 "수정했습니다"
		if(n==0)
			System.out.println("해당 번호는 없습니다");
		else
			System.out.println("수정했습니다");
		
	}

	//	삭제메서드
	/*
	 * 삭제- 이름을 입력후 해당 이름을 찾아서 삭제
	 * 
	 * dao 의 delete 메서드
	 *  : 메서드의 인자로 이름을 받아서 sql문을 완성
	 * 
	 * ex4 번의 delete
	 * 	: 키보드로 삭제할 이름을 입력받아서 삭제 메서드 호출
	 *    해당 이름이 없을경우
	 *    "xxx 님은 명단에 없습니다"
	 *    힌트) executeUpdate 는 실행한 레코드의 갯수
	 *          만약 해당 이름이 없다면 0을 반환
	 */
	public void dataDelete()
	{
		System.out.println("** 데이타를삭제합니다 **");
//		이름 입력
		String name="";
//		System.out.println("이름을 입력하세요 : ");
		System.out.println("삭제할 이름 입력");
		name=sc.nextLine();
		
//		dao 의 delete 메서드 호출
		int n=dao.personDelete(name);
		
//		n이 0이면 "xxx 님은 명단에 없습니다"
//		0아니면 "x명의 데이타를 삭제했습니다"
		if(n==0)
			System.out.println(name+" 님은 명단에 없습니다");
		else
			System.out.println(n+"명의 데이타를 삭제했습니다");
	}

	//	검색 메서드
	/*
	 * [문제]마지막 검색 부분
	 * 
	 * 검색할 혈액형을 입력해주세요
	 * a
	 * 
	 * 이름,자바,스프링,키,생년월일 만 출력
	 * 
	 */
	public void dataSearch()
	{
		System.out.println("** 데이타를 검색합니다 **");
		String blood;
		
//		혈액형 입력
//		System.out.printf("혈액형 입력 : ");
		System.out.println("검색할 혈액형 입력");
//		blood=sc.nextLine();
		blood=sc.nextLine();
//		dao 의 메서드 호출(반환은 List)
//		list 를 반복문을 이용해서 출력
//		제목으로 ** B형 명단 **
//		이름,자바,스프링,키,생년월일(이름의 오름차순 출력)
//		List<PersonDto> listBlood=new ArrayList<PersonDto>();
		List<PersonDto> list=dao.getBloodSearch(blood);
		
		
		
//		listBlood=dao.getBloodSearch(blood);
		
		
		
//		System.out.printf("\t\t** "+blood.toUpperCase()+"형 명단 **\n");
		System.out.println("\t\t**"+blood.toUpperCase()+" 형 명단**");
		System.out.println();
		
//		System.out.printf("이름\t자바\t스프링\t키\t생년월일\n");
		System.out.println("이름\t자바\t스프링\t키\t생년월일");
		System.out.println("------------------------------------------------------");
		
		
//		PersonDto dto=new PersonDto();
		
//		for(int i=0;i<listBlood.size();i=i+1)
//		{
//			dto=listBlood.get(i);
//			System.out.printf(dto.getName()+"\t"+dto.getJava()+"\t"+dto.getSpring()+"\t"+dto.getHeight()+"\t"+dto.getBirthday()+"\n");
//		}
		
		for(PersonDto dto:list)
		{
			System.out.println(dto.getName()+"\t"+dto.getJava()+"\t"+dto.getSpring()+"\t"+dto.getHeight()+"\t"+dto.getBirthday());
		}
		
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Ex4PersonModel ex=new Ex4PersonModel();
		while(true)
		{
			switch(ex.getMenu())
			{
			case 1://추가
				ex.dataAdd();
				break;
			case 2://삭제
				ex.dataDelete();
				break;
			case 3://수정
				ex.dataUpdate();
				break;
			case 4://검색
				ex.dataSearch();
				break;
			case 5://전체출력
				ex.writeAll();
				break;
			default:
				System.out.printf("** 시스템을 종료합니다 **\n");
				System.exit(0);
			}
			System.out.printf("\n");
		}
	}

}

실행 결과

		**메뉴**
1.추가  2.삭제  3.수정  4.검색  5.전체출력  6.종료
5
** 출력합니다 **
번호	이름	혈액형	자바	스프링	키	생년월일
----------------------------------------------------------
4	이미자	AB형	100	90	156.8	1978-12-20
5	김미자	O형	98	70	167.2	1988-02-12
7	김철수	AB형	88	90	156.9	2001-12-12
8	이승기	B형	90	79	187.2	1982-08-30
10	나엄형	O형	30	20	145.3	1999-09-12
11	안노오	A형	90	100	166.3	2002-04-02
27	남희석	O형	56	78	189.1	2020-09-23
28	손호남	B형	8	9	167.9	2020-09-23
29	이순자	O형	78	56	156.8	2020-09-23
31	안소니	B형	89	99	189.2	1989-11-11
33	제니퍼	A형	89	90	155.8	1990-12-25
39	용주리	AB형	44	22	300.2	1986-01-29
40	구형구	O형	100	100	302.1	1985-01-11
41	마이리	AB형	50	20	100.2	0086-11-11
42	이태리	AB형	67	78	167.0	1978-11-12
45	간수라	A형	22	15	168.0	2023-02-07
46	앤젤라	O형	77	79	173.3	2023-02-07

		**메뉴**
1.추가  2.삭제  3.수정  4.검색  5.전체출력  6.종료
1
** 데이타를 추가합니다 **
이름입력
올리비아
혈액형 입력(소문자로)
a
자바점수입력
50
스프링점수입력
51
키 입력
160.01
날짜입력(yyyy-mm-dd 형식으로 입력)
1984-05-05
추가되었습니다

		**메뉴**
1.추가  2.삭제  3.수정  4.검색  5.전체출력  6.종료
1
** 데이타를 추가합니다 **
이름입력
Grace
혈액형 입력(소문자로)
ab
자바점수입력
100
스프링점수입력
90
키 입력
156.2
날짜입력(yyyy-mm-dd 형식으로 입력)
19961224
날짜 형식으로 입력해주세요
Exception in thread "main" java.lang.NullPointerException
	at java.util.Calendar.setTime(Calendar.java:1770)
	at java.text.SimpleDateFormat.format(SimpleDateFormat.java:943)
	at java.text.SimpleDateFormat.format(SimpleDateFormat.java:936)
	at java.text.DateFormat.format(DateFormat.java:345)
	at javabasic.PersonDao.personInsert(PersonDao.java:119)
	at javabasic.Ex4PersonModel.dataAdd(Ex4PersonModel.java:83)
	at javabasic.Ex4PersonModel.main(Ex4PersonModel.java:276)

위 코드에서 데이타베이스 테이블에 데이타를 추가하는 곳이 있다.


SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date birthday=null;
try {
     birthday=sdf.parse(birth);
} catch (ParseException e) {
      // TODO Auto-generated catch block
     System.out.println("날짜 형식으로 입력해주세요");
}

 

위와 같은 코드 단편이 있다.

PersonDto 클래스 객체를 만들어서 PersonDto 클래스의 private 멤버 변수 birthday 값이

Date 형식이라 getter 메서드로 대입할 때도 Date 형식으로 변환해서 대입해야 한다.

Scanner 클래스 객체로 입력받은 값은 문자열이기 때문에 이를 Date 로 변환하는 것을 쓴 것이다.

하지만 SimpleDateFormat 클래스의 인스턴스가 생성될 때는 파라메터로 String pattern, 즉 어떠한 문자열 패턴을

받는다. date 와 time 형식을 설명하는 String pattern 파라메터를 정했으면 parse(String source) 메서드에서 파라메터로

쓰는 String source 는 SimpleDateFormat(String pattern) 생성자 함수에서 쓰인 파라메터 String pattern 의 형식을

따라야만 한다. String pattern 형식과 다르게 쓰면 ParseException 을 던진다. 그리고 위의 콘솔창에 출력된 실행 결과

를 보면 SimpleDateFormat(String pattern) 생성자 함수에서 쓴 String pattern 형식을 parse(String source) 메서드에서

따르기 않아서 나중에 PersonDto 클래스 객체에 setter 함수로 멤버 변수 birthday 값을 넣을 때 birthday 는 여전히

null 값이라서 java.lang.NullPointerException 오류가 난다.


위의 코드 중에

dataAdd() 메서드를 본다.

처음에 Scanner 클래스의 nextLine() 메서드를 2 번 쓰다가

다음에 nextInt() 메서드를 2 번 쓰고 그 다음에 nextDouble() 메서드를 한 번 썼다.

nextLine() 은 입력받을 때 

키보드로 입력받은 값과 다 입력했다를 뜻하는 엔터까지 모두 처리하지만

nextInt() 는 키보드로 입력받은 정수와 다 입력했다를 뜻하는 엔터 중에 오직 정수만 처리해서 저장하며

nextDouble() 은 키보드로 입력받은 실수와 다 입력했다를 의미하는 엔터 중에 오직 실수만 처리해서 저장한다.

키보드에서 입력받은 값은 버퍼에 놓이게 되어서 처음에 nextLine() 을 2 번 쓰면 버퍼에는 아무 값도 안남고,

다음에 nextInt() 를 두 번 쓰니 버퍼에 엔터값 두 개가 남고 

다음에 nextDouble() 을 한 번 쓰니 버퍼에 엔터값 한 개가 추가로 남아서

버퍼에서는 총 엔터값이 3 개가 머무르고 있다.

그 후에 날짜입력을 받기 위해서 nextLine() 메서드를 쓸 텐데 nextLine() 은 엔터값도 처리하여 읽어 들이니

버퍼에 머물러있는 총 3개의 엔터값을 비워야한다. 그러니 날짜를 입력받기 위한 nextLine() 메서드를 쓰기 전에

버퍼에 남아있는 총 3개의 엔터값을 비우기 위해 Scanner 클래스의 인스턴스 sc 를 이용해 

sc.nextLine();

sc.nextLine();

sc.nextLine();

요렇게 세번 줄을 쓴 후에

String birth = sc.nextLine(); 을 써서 날짜를 입력받아야 한다고 생각한다.


Java 에서 Scanner 클래스 인스턴스으 버퍼를 비워야 할 때가 있다.

nextInt() 가 의미하는 것은 

"입력 장치를 통해 큐(파이프) 형태로 되있는 공간으로 들어온 값들 중에서 다음의 정수를 가져오겠다" 

라고 한다.

nextInt() 는 입력값으로 들어온 값 중에 

Enter 나 공백을 구분자로 하여, 그 앞의 Int 형 값을 가져온다.

즉, 입력할 때 숫자 2를 입력할 때는 2 + Enter 나 2 + 공백문자 요런식으로 입력하는 것이다.

그러면 Enter 앞의 Int 형 2 나 공백문자 앞으 Int 형 2 를 가져오게 된다.

그렇게 되면 큐(파이프) 에 남아있는 값은 Enter 또는 공백문자가 된다.

 

그런데 nextLine() 메서드는 큐(파이프) 에 남은 것들을 문자열로 가져온다고 한다.

즉, 큐(파이프)에 남은 모든 것들을 문자열로써 인식하며 가져오는 것이다.

그리고 그럴 때는 nextLine() 은 큐(파이프) 에 Enter 가 있다면 Enter 를 공백 문자열로써 인식하고 가져온다.

nextLine() 메서드가 큐(파이프) 에 남은 모든 것들을 문자열로써 인식하여 싸그리 가져오니,

위의 코드에서 nextLine() 을 두번 쓴 뒤, nextInt() 를 두 번 쓰고 나서 nextDouble() 을 썼을 때 

큐(파이프) 에 남은 총 세 개의 Enter 또는 공백문자 는 Scanner 클래스의 인스턴스 sc 를 써서

단 한번만 sc.nextLine(); 을 하면 큐(파이프) 에 남은 총 세 개의 Enter 나 공백문자가 모두 다 문자열로 가져와지고

큐(파이프) 로 이루어진 버퍼는 비워지는 것이다.


위 코드에서 다른 기능도 실행한다.

실행 결과

		**메뉴**
1.추가  2.삭제  3.수정  4.검색  5.전체출력  6.종료
5
** 출력합니다 **
번호	이름	혈액형	자바	스프링	키	생년월일
----------------------------------------------------------
4	이미자	AB형	100	90	156.8	1978-12-20
5	김미자	O형	98	70	167.2	1988-02-12
7	김철수	AB형	88	90	156.9	2001-12-12
8	이승기	B형	90	79	187.2	1982-08-30
10	나엄형	O형	30	20	145.3	1999-09-12
11	안노오	A형	90	100	166.3	2002-04-02
27	남희석	O형	56	78	189.1	2020-09-23
28	손호남	B형	8	9	167.9	2020-09-23
29	이순자	O형	78	56	156.8	2020-09-23
31	안소니	B형	89	99	189.2	1989-11-11
33	제니퍼	A형	89	90	155.8	1990-12-25
39	용주리	AB형	44	22	300.2	1986-01-29
40	구형구	O형	100	100	302.1	1985-01-11
41	마이리	AB형	50	20	100.2	0086-11-11
42	이태리	AB형	67	78	167.0	1978-11-12
45	간수라	A형	22	15	168.0	2023-02-07
46	앤젤라	O형	77	79	173.3	2023-02-07
47	올리비아	A형	50	51	160.0	1984-05-05

		**메뉴**
1.추가  2.삭제  3.수정  4.검색  5.전체출력  6.종료
3
** 데이타를 수정합니다 **
수정할 num값
1
이름입력
나탈리
혈액형 입력(소문자로)
b
자바점수입력
44
스프링점수입력
44
해당 번호는 없습니다

		**메뉴**
1.추가  2.삭제  3.수정  4.검색  5.전체출력  6.종료
3
** 데이타를 수정합니다 **
수정할 num값
11
이름입력
나탈리
혈액형 입력(소문자로)
b
자바점수입력
44
스프링점수입력
44
수정했습니다

		**메뉴**
1.추가  2.삭제  3.수정  4.검색  5.전체출력  6.종료
5
** 출력합니다 **
번호	이름	혈액형	자바	스프링	키	생년월일
----------------------------------------------------------
4	이미자	AB형	100	90	156.8	1978-12-20
5	김미자	O형	98	70	167.2	1988-02-12
7	김철수	AB형	88	90	156.9	2001-12-12
8	이승기	B형	90	79	187.2	1982-08-30
10	나엄형	O형	30	20	145.3	1999-09-12
11	나탈리	B형	44	44	166.3	2002-04-02
27	남희석	O형	56	78	189.1	2020-09-23
28	손호남	B형	8	9	167.9	2020-09-23
29	이순자	O형	78	56	156.8	2020-09-23
31	안소니	B형	89	99	189.2	1989-11-11
33	제니퍼	A형	89	90	155.8	1990-12-25
39	용주리	AB형	44	22	300.2	1986-01-29
40	구형구	O형	100	100	302.1	1985-01-11
41	마이리	AB형	50	20	100.2	0086-11-11
42	이태리	AB형	67	78	167.0	1978-11-12
45	간수라	A형	22	15	168.0	2023-02-07
46	앤젤라	O형	77	79	173.3	2023-02-07
47	올리비아	A형	50	51	160.0	1984-05-05

		**메뉴**
1.추가  2.삭제  3.수정  4.검색  5.전체출력  6.종료
4
** 데이타를 검색합니다 **
검색할 혈액형 입력
AB
		**AB 형 명단**

이름	자바	스프링	키	생년월일
------------------------------------------------------
김철수	88	90	156.9	2001-12-12
마이리	50	20	100.2	0086-11-11
용주리	44	22	300.2	1986-01-29
이미자	100	90	156.8	1978-12-20
이태리	67	78	167.0	1978-11-12

		**메뉴**
1.추가  2.삭제  3.수정  4.검색  5.전체출력  6.종료
2
** 데이타를삭제합니다 **
삭제할 이름 입력
Aubrey
Aubrey 님은 명단에 없습니다

		**메뉴**
1.추가  2.삭제  3.수정  4.검색  5.전체출력  6.종료
2
** 데이타를삭제합니다 **
삭제할 이름 입력
김철수
1명의 데이타를 삭제했습니다

		**메뉴**
1.추가  2.삭제  3.수정  4.검색  5.전체출력  6.종료
5
** 출력합니다 **
번호	이름	혈액형	자바	스프링	키	생년월일
----------------------------------------------------------
4	이미자	AB형	100	90	156.8	1978-12-20
5	김미자	O형	98	70	167.2	1988-02-12
8	이승기	B형	90	79	187.2	1982-08-30
10	나엄형	O형	30	20	145.3	1999-09-12
11	나탈리	B형	44	44	166.3	2002-04-02
27	남희석	O형	56	78	189.1	2020-09-23
28	손호남	B형	8	9	167.9	2020-09-23
29	이순자	O형	78	56	156.8	2020-09-23
31	안소니	B형	89	99	189.2	1989-11-11
33	제니퍼	A형	89	90	155.8	1990-12-25
39	용주리	AB형	44	22	300.2	1986-01-29
40	구형구	O형	100	100	302.1	1985-01-11
41	마이리	AB형	50	20	100.2	0086-11-11
42	이태리	AB형	67	78	167.0	1978-11-12
45	간수라	A형	22	15	168.0	2023-02-07
46	앤젤라	O형	77	79	173.3	2023-02-07
47	올리비아	A형	50	51	160.0	1984-05-05

		**메뉴**
1.추가  2.삭제  3.수정  4.검색  5.전체출력  6.종료
ㅂㅁ
Exception in thread "main" java.lang.NumberFormatException: For input string: "ㅂㅁ"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:580)
	at java.lang.Integer.parseInt(Integer.java:615)
	at javabasic.Ex4PersonModel.getMenu(Ex4PersonModel.java:18)
	at javabasic.Ex4PersonModel.main(Ex4PersonModel.java:273)
		**메뉴**
1.추가  2.삭제  3.수정  4.검색  5.전체출력  6.종료
1000
** 시스템을 종료합니다 **

ArrayList 는

리스트 인터페이스(규격) 를 크기 조절이 가능한 배열로 구현한 것이다. 동기화는 안된다. 벡터는 동기화를 한다. 

스레드에 안전한 구현을 할 필요가 있을 때 동기화를 하는 벡터를 ArrayList 대신 쓴다.

ArrayList < List

ArrayList 와 Vector 에서 전자는 동기화안하고 후자는 동기화한다. 

리스트 인터페이스(규격) 는 Set 클래스와 다르게 중복 요소를 가진다.

'Java' 카테고리의 다른 글

Java ItemEvent  (0) 2023.02.09
Java setLayout(LayoutManager manager)  (0) 2023.02.08
Java PreparedStatement  (0) 2023.02.07
Java createStatement()  (0) 2023.02.07
Java executeUpdate(String sql)  (0) 2023.02.07