Throws Exception
* Exception
* +---------IOException
* +--------FileNotFoundException
* 1) try ~ catch절로 처리해보기
* 2) throws로 선언해보기
Error를 직접 찾아서 해결하는 것이면 try catch
다른 곳에서 처리하고 싶으면 thorws IOExcpetion 같은 것을 이용한다.
(ex db와 연결시 SqlException을 이용한다.)
package day19;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JOptionPane;
/*
* Exception
* +---------IOException
* +--------FileNotFoundException
* 1) try ~ catch절로 처리해보기
* 2) throws로 선언해보기
*
* */
public class FileIO {
public static String readFile(String filename) {
String contents="";
FileReader fr=null;
char data[]=new char[1000];
try {
fr = new FileReader(filename); //파일을 읽기 위해 스트림 연결
fr.read(data);//파일 내용을 읽어서 data배열에 담아둔다.
fr.close();//스트림 연결 끊기
}catch(FileNotFoundException e) {
System.out.println("이런 파일은 없다");
}catch(IOException e) {
System.out.println("파일 읽는 중 에러발생");
}
contents = new String(data);//읽은 내용을 문자열로 만든다.
return contents;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String filename=JOptionPane.showInputDialog("읽을 파일명을 입력");
String str = FileIO.readFile(filename);
System.out.println(str);
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
package day19;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JOptionPane;
public class FileIO2 {
public static String readFile(String filename)
throws IOException
{
String contents="";
FileReader fr=null;
char data[]=new char[1000];
fr = new FileReader(filename); //파일을 읽기 위해 스트림 연결
fr.read(data);//파일 내용을 읽어서 data배열에 담아둔다.
fr.close();//스트림 연결 끊기
contents = new String(data);//읽은 내용을 문자열로 만든다.
return contents;
}
public static void main(String[] args)
throws IOException{
// TODO Auto-generated method stub
String filename=JOptionPane.showInputDialog("읽을 파일명을 입력");
System.out.println(FileIO2.readFile(filename));
}
}
사용자 정의 예외 클래스 만들기
Exception을 상속받는 클래스를 만든다.
생성자를 구성하고, 생성자 안에서
super(예외 메시지);를 호출한다.
--> 여기에 들어간 예외 메시지가 getMassage()를 호출할 떄 반환되는 메시지가 된다.
옵션: toString() 메소드를 오버라이딩해 예외 관련 정보를 문자열로 돌려준다.
ex) class NotKongException extends Exception
{
public NotKongException(){
super("콩씨는 등록할 수 없어요!");
}
}
IOException
getMessage()
printStackTrace()
예외가 발생한 지점의 스택 기록을 출력해줌 디버그 때 사용
package day19;
/*
* 사용자 정의 예외 클래스 만들기
* 1. Exception을 상속받는다.
* 2. 생성자를 구성하고 생성자 안에서 super("예외메시지")를 호출한다. *
* */
public class NotSupportedNameException extends Exception{
public NotSupportedNameException () {
super("NotSupportedNameException");
}
public NotSupportedNameException(String msg) {
super(msg);
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
package day19;
import javax.swing.JOptionPane;
public class PongApp {
public static void login(String name)
throws NotSupportedNameException
{
if(name.startsWith("풍")) {
System.out.println("환영합니다 "+name);
}
//이름이 "콩"씨로 시작한다면 사용자 정의 예외 발생
//=> 콩씨는 절대로 입장 불가
else if(name.startsWith("콩")) {
NotSupportedNameException ne =new NotSupportedNameException("콩씨는 입장 불가");
throw ne;
//사용자 정의 예외를 발생시킬 때는 throw로 발생시키며
//이 때 메소드 헤더에 throws로 해당 예외를 선언해주어야 한다.
}
//그 외 기타 성씨일 경우는 "이용에 제한이 있어요"
else {
NotSupportedNameException ne =new NotSupportedNameException(name);
throw ne;
}
}
public static void main(String[] args)
throws NotSupportedNameException{
String name = JOptionPane.showInputDialog("이름을 입력하세요");
try {
PongApp.login(name);
}catch(NotSupportedNameException e) {
//public String getMessage()
System.out.println(e.getMessage());
//public void printStacTrace():
//예외가 발생한 지점의 스택 기록을 출력해줌 디버그 때 사용
}
}
}
JMenu
JFileChooser을 이용해서 파일 값을 가져오고
text에 붙이기
package day19;
import java.awt.Container;
import java.awt.Font;
/*
* 이벤트 소스 : JMenuItem
* 이벤트 : ActionEvent
* 이벤트 핸들러: ActionListener를 상속받아 구현
* [실습]
* New아이템 선택하면 ta를 지워주기
* Open 선택하면 JFileChooser 띄워주기 (API 문서 살펴보기)
* */
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
public class MyNotePad extends JFrame implements ActionListener{
JMenuBar bar;
JMenu mnFile, mnFont, mnColor;//파일, 편집, 색상
JMenuItem miNew, miOpen, miSave, miExit, miFont1,miFont2,miFont3, b22,b36;
JTextArea ta;
JLabel lb;
public MyNotePad() {
super("::MyNotePad::");
Container cp = getContentPane();
ta= new JTextArea();
JScrollPane p =new JScrollPane(ta);
cp.add(p, "Center");
ta.setFont(new Font("sans-serif",Font.PLAIN,28));
//1. 메뉴바를 생성해서 JFrame에 붙인다.
bar = new JMenuBar();
this.setJMenuBar(bar);
lb = new JLabel("Status");
cp.add(lb,"South");
//2. 메뉴 생성해서 메뉴바에 부착
mnFile = new JMenu("파일");
mnFont = new JMenu("Font");
mnColor = new JMenu("Color");
bar.add(mnFile);
bar.add(mnFont);
bar.add(mnColor);
//3. 메뉴 아이템 생성해서 메뉴에 부착 메뉴가 실행된 상태에서 shift x 누르면 종료
miNew = new JMenuItem("New",new ImageIcon("images/new.PNG"));
miOpen = new JMenuItem("Open",'O');
miSave = new JMenuItem("Save",new ImageIcon("images/save.PNG"));
miExit = new JMenuItem("Exit",'X');
mnFile.add(miNew);
mnFile.add(miOpen);
mnFile.add(miSave);
mnFile.addSeparator();//구분선추가
mnFile.add(miExit);
miNew.addActionListener(this);
miOpen.addActionListener(this);
miExit.addActionListener(this);
miSave.addActionListener(this);
miNew.setMnemonic('N');
miSave.setMnemonic('S');
//폰트 메뉴에 메뉴아이템 부착하기 "궁서체","Dialog","Sans-serif"
//등 서체 3개 이상 붙이기
miFont1 = new JMenuItem("궁서체");
miFont2 = new JMenuItem("Dialog");
miFont3 = new JMenuItem("Sans-serif");
mnFont.add(miFont1);
mnFont.add(miFont2);
mnFont.add(miFont3);
mnFont.addSeparator();
//서브 메뉴를 붙이려면 JMenu에 JMenu를 붙인다.
JMenu subSize = new JMenu("글자 크기");
mnFont.add(subSize);
b22 = new JMenuItem("22");
b36 = new JMenuItem("36");
b22.addActionListener(this);
b36.addActionListener(this);
subSize.add(b22);
subSize.add(new JMenuItem("28"));
subSize.add(b36);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
@Override
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if(obj==miNew) {
ta.setText("");
ta.validate();
}
else if(obj==miOpen) {
//JFileChooser showXXX메소드 이용해서 열기 모드로 다이얼로그 띄어주기
//JFileChooser에서 선택한 파일명의 절대경로 얻기
//JFileIO의 readFile()메소드에 2번에서 얻은 파일경로명을 매개변수로 전달하면
//파일 내용을 문자열로 반환해줌
//이를 ta에 붙이자
JFileChooser chooser = new JFileChooser();
int a = chooser.showOpenDialog(null);
File file= chooser.getSelectedFile();
String path = file.getAbsolutePath();
String content = FileIO.readFile(path);
ta.setText(content);
ta.validate();
//FileIO2 사용하는 경우
try {
String content = FileIO2.readFile(path);
ta.setText(content);
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
lb.setText(e1.getMessage());
} catch (IOException e1) {
lb.setText(e1.getMessage());
}
ta.validate();
///////////////////////
}
else if(obj==miExit) {
System.exit(0);
}
else if(obj==miSave) {
}
//1. 서체 선택하면 해당 서체로 ta에 적용시키기
//2. 서체의 글자 크기 선택하면 해당 글자크기로 ta에 적용
else if(obj==miFont1) {
ta.setFont(new Font("궁서체",Font.BOLD,22));
}
else if(obj==b36) {
ta.setFont(new Font("궁서체",Font.BOLD,36));
}
}
public static void main(String[] args) {
MyNotePad ae = new MyNotePad();
ae.setSize(800, 800);
ae.setLocation(800, 200);
ae.setVisible(true);
}
}
숫자형 함수
-------------------------------------------------------------
함수 사용목적
-------------------------------------------------------------
ROUND 숫자를 반올림
TRUNC 숫자를 절삭
MOD 나머지 구함
POWER 거듭제곱
SQRT 제곱근
SIGN 양수,음수,0인지를 구분
CHR ASCII값에 해당하는 문자를 구함
ABS 절대값을 구함
CEIL 올림함수
FLOOR 내림함수
-------------------------------------------------------------
ROUND
- ROUND(값) 또는 ROUND(X,Y) : 반올림 함수.
- 한자리 숫자일 경우에는 반올림하고
두 자리 숫자일 경우에는 소수점의 오른쪽에서 Y 자리만큼 반올림된 X를
나타낸다. 이때 Y값이 음수와 양수에 따라 다른 결과를 보여준다.
SELECT ROUND(4567.678), ROUND(4567.678,0), ROUND(4567.678,2),
ROUND(4567.678,-2) FROM DUAL;
숫자를 Y자리 만큼 반올림할 때 Y자리가 양수면 소수자리를
Y자리가 음수이면 정수 자리를 반올림한다.
생략할 경우 디폴트는 0이다.
[실습]
select mileage,age,mileage/age,round(mileage/age)
from member where mileage>0
TRUNC
- TRUNC(값) 또는 TRUNC(X,Y) : 버림을 담당하는 함수.
ROUND함수와 사용방법은 같다.
일정한 단위로 절사하는 경우에
주로 사용하는 함수. 영수증에서 10이하 단위는 잘라내고 10원 단위로
금액을 출력시킬때 사용
SELECT TRUNC(4567.678), TRUNC(4567.678,0),
TRUNC(4567.678,2), TRUNC(4567.678,-2) FROM DUAL
[문제]
상품 테이블의 상품 정보가운데 천원단위까지 버린 배송비를 비교하여 출력하세요.
select products_name,trans_cost, trunc(trans_cost,-4) from products
MOD
- MOD(값1, 값2) : 나머지 값을 돌려주는 함수
사원테이블에서 부서번호가 10인 사원의 급여를
30으로 나눈 나머지를 출력하세요.
SELECT SAL, MOD(SAL,30) FROM EMP WHERE DEPTNO=10
ABS(값)
:선택된 값의 절대값을 보여주는 함수.
음수값이 있는 컬럼 값을 양수로 나타내고자 할 때 사용.
select name, age, age-40, abs(age-40) from member;
CEIL(값): 올림 함수
SELECT CEIL(123.12) FROM DUAL
FLOOR(값): 내림 함수
SELECT FLOOR(123.12) FROM DUAL
# 날짜 함수
오러클은 세기,년,월,일,시,분,초를 내부 숫자(7BYTE)형식으로
날짜를 지정한다.
-날짜 연산
--------------------------------------------------
연산 결과 설명
--------------------------------------------------
1) DATE + NUMBER DATE 일수를 날짜에 더함
2) DATE - NUMBER DATE 일수를 날짜에 뺌
3) DATE - DATE 일수
4) DATE + NUMBER/24 DATE 시간을 날자에 더함
--------------------------------------------------
[실습]
사원테이블에서 현재까지의 근무 일수가 몇 주 몇일인가를 출력하세요.
단 근무일수가 많은 사람순으로 출려하세요.
먼저) DATE- DATE를 하면 일수가 나온다.
SELECT HIREDATE,SYSDATE,(SYSDATE-HIREDATE) FROM EMP;
SELECT ENAME,SYSDATE,HIREDATE,SYSDATE-HIREDATE "TOTAY DAYS",
TRUNC((SYSDATE-HIREDATE)/7) WEEKS,
ROUND(MOD((SYSDATE-HIREDATE),7)) DAYS
FROM EMP
ORDER BY SYSDATE-HIREDATE DESC;
DATE 형식으로 바꿔주는 것 TO_DATE
select sysdate - TO_date('20/04/11','YY/MM/DD') from dual;
CHAR 형태로 바꿔주는 것
select to_char(sysdate + 3/24 ,'YY/MM/DD HH:MI:SS') from dual;
--------------------------------------------------
함수 사용목적
--------------------------------------------------
MONTHS_BETWEEN 두 날짜사이의 월수를 계산
ADD_MONTHS 월을 날짜에 더함
LAST_DAY 월의 마지막 날을 구함
SYSDATE 오러클이 설치되어 있는 서버의
현재 날짜와 시간을 반환
--------------------------------------------------
MONTHS_BETWEEN
- 날짜와 날짜 사이의 월수를 계산한다.
- MONTHS_BETWEEN(DATE1,DATE2)
- 결과는 음수 또는 양수가 될 수 있다.
- 결과의 정수 부분은 월을, 소수 부분은 일을 나타낸다.
SELECT MONTHS_BETWEEN(SYSDATE,HIREDATE) FROM EMP;
ADD_MONTHS
- 정해진 컬럼이나 날짜형 변수에 원하는 개월을 더하고자 할 때 사용
- ADD_MONTHS(D,X)
- 결과값: 날짜 D에 X월 만큼 더한 날짜를 리턴한다. 여기서 X는 정수이고,
만약 결과값의 월이 D
의 월보다 날짜 수가 적다면 결과값의 월의 마지막 일이 리턴된다.
select add_months('08/09/11',2) from dual;==>08/11/11
SELECT ADD_MONTHS('08/11/11',2) FROM DUAL ==> 09/01/11
_
select add_months('08/01/31',1) from dual;==>08/02/29
select add_months(sysdate,-1) from dual;
select hiredate,add_months(hiredate,-10) from emp
고객 테이블이 두 달의 기간을 가진 유료 회원이라는 가정하에 등록일을 기준으로
유료 회원인 고객의 정보를 보여주세요.
select name, reg_date, add_months(reg_date,2) as expire from member;
LAST_DAY
- 월의 마지막 날짜를 구할 대 사용하는 함수(윤년,평년은 자동으로 계산함)
일정 관리 프로그램이나 다이어리 등을 만들 때 1월 ~12월까지의 마지막 일자를
LAST_DAY 함수를 이용하여 구하면 쉽게 달력프로그램을 만들 수 있다.
- LAST_DAY(D)
- 결과값: D가 포한되어 있는 월의 마지막 날짜 값을 리턴
select last_day('03/12/11') from dual==>03/12/31
사원테이블에서 입사한 달의 근무일수를 계산하여 출력하되,
토요일과 일요일도 근무일수에 포함하는 것으로 하자.
select ename, hiredate, last_day(hiredate) last,
last_day(hiredate)-hiredate days from emp
order by days desc
SYSDATE
- 현재 시간을 DATE타입으로 출력하는 함수.
- SYSDATE
- 결과값: 현재 로컬 데이터베이스의 날짜와 시간값을 리턴한다.
select to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual;
select to_char(sysdate,'cc year-month-ddd day') from dual
-cc, scc : 세기
-yyyy, year, yyy, yy : 연도
-iyyy, iy, i : ISO 년을 의미
-month,mon, mm: 월
-ww, w : 주
-ddd, dd: 일 [ddd->1년의 날짜, dd->1개월의 날짜, d->1주일의 날짜]
-hh, hh24, hh12: 시간
-day, dy, d: 그주의 시작 일자
-mi : 분
-ss : 초
3. 변환함수
TO_CHAR(날짜)
- 문자가 아닌 자료형의 값을 문자형으로 변환시키는 함수
- TO_CHAR(날짜) 함수는 DATE타입을 문자로 바꾼다.
- TO_CHAR(D, 출력형식)
- 결과값: DATE형인 D를 출력형식에 맞는 VARCHAR2 로 변환하여 리턴.
출력형식이 없을 경우에는 기본이 되는 날짜형을 문자형으로 변환하여 리턴.
select to_char(sysdate) from dual;
select to_char(sysdate,'yyyy-mm-dd hh12:mi:ss') from dual;
고객테이블의 등록일자를 0000-00-00 의 형태로 출력하세요.
select name, to_char(reg_date,'yyyy-mm-dd') from member;
고객테이블에 있는 고객 정보 중 등록연도가 2003년인
고객의 정보를 보여주세요.
select userid,name,age, job, to_char(reg_date,'yyyy-mm-dd') as d
from member where to_char(reg_date,'yyyy') = '2003';
이렇게 하는 것도 가능하다 where hiredate like '08%';
고객테이블에 있는 고객 정보 중 등록일자가 2003년 5월1일보다
늦은 정보를 출력하세요.
단, 고객등록 정보는 년, 월만 보이도록 합니다.
select userid,name,age, job, to_char(reg_date,'yyyy-mm-dd') as d
from member where reg_date >='2003-05-01';
TO_DATE
- TO_CHAR(날짜)와 상반된 기능을 갖는다. 즉, 문자 데이터를 강제로
날짜형 데이터로 변환시키는 것.
TO_CHAR(날짜)는 출력을 위해 사용하는 함수이며,
TO_DATE 는
프로그램 내부에서 날짜를 계산하거나 비교하기 위해
날짜형 데이터로 변환하는데 사용되는 함수이다.
- TO_DATE(변수, 출력형식)
- 결과값: CHAR나 VARCHAR2 형식의 변수를 날짜형 데이터
DATE로 변환하여 값을 리턴
만일 출력형식이 없다면 세션의 기본 날짜 출력형식을 사용해야 한다.
68] select to_date('20080601','yyyymmdd') as d from dual;
69] select sysdate - to_date('20080601','YYYYMMDD') from dual;
...sysdate와 문자값을 - 연산할 수 없으므로 Date타입으로 변경하여 연산하는 예제.
70] 고객테이블의 고객 정보 중 등록일자가 2003년 6월1일 이후 등록한 고객의 정보를
보여 주세요.
select name,reg_date from member
where reg_date > to_date('20030601','YYYYMMDD')
TO_CHAR(숫자)
- TO_CHAR(X, 출력형식)
- 결과값: 숫자형인 X를 오른쪽의 출력 형식에 맞는 varchar2로
변환하여 리턴.
71] select to_char(10000,'99,999') from dual;
72] select to_char(10000,'$99G999') from dual==> $10,000
...G는 지정된 위치에서 그룹 구분 문자를 리턴한다.
------------------------------------------------------------------------
포맷요소 포맷된 문자 설명
------------------------------------------------------------------------
9 99 각각의 9는 결과에서 유효 자리를 나타냄
여기서 리턴되는 값은 9의 수와 같은 유효 자리
의 수를 갖는다.
------------------------------------------------------------------------
0 999 빈칸이 아니라 앞에 붙은 0을 리턴함
------------------------------------------------------------------------
$ $999 통화기호와는 무관하게 앞에 달러 기호를
가진 값을 리턴함
------------------------------------------------------------------------
B B999 정수 부분이 0일 경우 소수의 정수 부분에 대해
빈칸을 리턴함
------------------------------------------------------------------------
S S9999 앞에 붙은 기호를 리턴함. 양수에 대해서는 "+"
음수에 대해서는 "-"를 리턴
------------------------------------------------------------------------
S 9999S 뒤에 붙은 기호를 리턴함. 양수에 대해서는 "+"
음수에 대해서는 "-"를 리턴
------------------------------------------------------------------------
D 99D9 지정된 위치에서 소수점을 리턴함
------------------------------------------------------------------------
G 9G999 지정된 위치에서 그룹 구분 문자를 리턴함
------------------------------------------------------------------------
C C99 지정된 위치에서 ISO 통화 기호를 리턴함
------------------------------------------------------------------------
L L999 지정된 위치에서 지역 통화기호를 리턴함
------------------------------------------------------------------------
EEEE 9.99EEEE 과학적 표기법을 사용하여 값을 리턴함
------------------------------------------------------------------------
RM RM 대문자 로마 숫자를 사용하여 값을 리턴함
------------------------------------------------------------------------
, 999,999 지정된 위치에 ","를 표시함
------------------------------------------------------------------------
. 999.99 소수점 자리를 표시함
------------------------------------------------------------------------
73] 상품 테이블에서 상품의 공급 금액을 가격 표시 방법으로 표시하세요.
천자리 마다 , 를 표시합니다.
select products_name, to_char(input_price,'99,999,999') as A from products;
74] 상품 테이블에서 상품의 판매가를 출력하되 주화를 표시할 때 사용하는 방법을
사용하여 출력하세요.[예: \10,000]
select products_name, to_char(output_price,'L99,999,999') as A from products
TO_NUMBER
-TO_CHAR와 상반되는 함수. 문자열을 숫자로 변환해주는 역할을 함
-TO_NUMBER(변수, 출력형식)
-결과값: CHAR나 VACHAR2 형식의 변수를 NUMBER값으로 변환함.
출력 형식이
있는 경우에는 변수가 숫자 출력형식과 같아야 한다.
75] select to_number('1,234','9,999') from dual ==>1234
76] select to_number('$1,234','$9,999') from dual ==>1234
77] select to_char(-23,'999S') from dual ==> 23-
78] select to_char(-23,'99D99') from dual ==> -23.00
79] select to_char(23,'99.99') from dual ==>23.00
80] select to_char(23,'99.99EEEE') from dual ==>2.30E+01