JAVA2 - Day2 - Exception, GUI

<Exception>
package com.tryCatch;
//#1
//예외에 대해서 공부하자!
// - 프로그램 실행 중에 발생하는 예기치 않은 사건 (ERROR)
//예외는 두가지 측면에서 발생할 수 있다.
// 1. 하드웨어적인 측면
// ex)하드디스크 문제, 주기억장치 문제 etc..
// 2. 소프트웨어적인 측면
// ex)0으로 나눈 경우, 배열첨자 오류 etc...
// >>소프트웨어적 예외는 모두 개발자 잘못!




//#4
//Exception 클래스
// - 최고 조상 예외 클래스
// - java.lang.Exception >> 상속안해도 쓸 수 있다.

//크게 두가지로 나눌 수 있다.
// - Checked Exception
// 확인시점: 컴파일 단계
// 반드시 예외를 처리해주어야 한다.
// ex)IOException,...


// - UnChecked Exception
// 확인시점: 실행 단계
// 명시적 처리를 강제하지 않는다.
// ex)NullPointerException,...









//#5
//예외 처리 방법
// - try ~ catch 문
// - throws
// - throw

public class Ex_01_1
{

public static void main(String[] args)
{





//#2
//1)컴파일 단계에서 나타나는 예외는 빨간 밑줄이 나타난다
//2)실행단계에서 나타나는 예외는 실행후 에러가 난다!!









//#3
//예외는 특이하게 작용한다.
//연산과 관련된 예외.

/*
int x=10, y=0;
int res;
res=x/y;
System.out.println("res : "+ res);
*/

//실행시키면 0으로 나눴다고 에러 뜬다.
//연산 예외와 관련된 클래스 (Exception) >> 어떤 예외인지 알려주는 메서드가 들어있다.









//#6
//try ~ catch 문
// - 예외 처리
/*
try {
//예외가 발생될만한 소스코드
}
catch(예외 클래스 매개변수) {
//예외사항을 받아서 처리
}
finally {
//필요에따라 선택적으로 사용(생략가능)
//(file close)용도로 많이 쓴다.
//불편하기 떄문에 권장하지 않음.
//다른 편리한 방법 여러가지가 있다.
}
*/

int x=10, y=0;
int res;
try
{
res=x/y; //연산예외가 발생될만한 부분
System.out.println("res : "+ res);
//출력을 try에 넣지 않으면 초기화가 안되었을 때 에러날수 있으므로 처음부터 try에 넣어주자.
}
catch(/*Arithmetic*/Exception /*그냥 실행해서 에러가 났을 때 콘솔에 나타나는 클래스*/ e)
//Exception e 라고 써도 괜찮다. 조상 클래스니까 모든 예외에관한 메서드가 들어있다!
{
System.out.println("연산ERROR");
}

System.out.println("Main 종료");

//고전적인 예외처리
//if문을 쓰면 되지 않을까?
//ㅇㅇ 똑같이 동작하게 만들 수 있음.
//그러나 권장하지 않음

/*
if(y==0)
{
System.out.println("연산 ERROR");
}
else
{
res=x/y;
System.out.println("res : "+ res);
}
*/
//불편해서 잘 쓰지 않는다.
//연산예외가 나타날법한 모든 사항을 개발자가 일일이 조건으로 달아줘야하기 때문.

}

}
----------------------------------------------------------------------------------
package com.tryCatch;

public class Ex_02_2
{

public static void main(String[] args)
{
//#1
System.out.println("#1");
int [] list = {2,4,0,5};
int x = 100;
int res;

try
{

for(int i =0; i<5; i++)
{
res=x/list[i];
System.out.println("res : "+res);
}
}
catch(Exception e)
{
System.out.println("ERROR!!");
}
//이렇게 하면 예외가 나타났을 때 catch가 출력되고 반복문이 끝난다.



System.out.println();
System.out.println("#1 해결하기");
for(int i =0; i<5; i++)
{
try
{
res=x/list[i];
System.out.println("res : "+res);
}
catch(Exception e)
{
System.out.println("ERROR!!");
}

}
//for문 안에 try~catch를 넣으면 반복문이 모두 돌아서 해결된다.

//#2
System.out.println();
System.out.println("#2");
System.out.println("다중 catch문");
for(int i =0; i<5; i++)
{
try
{
res=x/list[i];
System.out.println("res : "+res);
}
catch(ArithmeticException e)
{
System.out.println("연산 ERROR!!");
e.printStackTrace();
//어떤 클래스에서 에러가 났고, 왜 에러가 났는지 알려주는 메서드.
}
catch(ArrayIndexOutOfBoundsException e)
{
System.out.println("배열첨자 ERROR!!");
}
catch(Exception e)
{
System.out.println("그 외 ERROR");
}
}


//이때 주의할 점은 Exception e을 항상 맨 마지막에 써야한다는 것이다.
//위에다 쓰면 모든 예외를 Exception이 모두 받아서 뒤에 나열되는 catch 들이 쓰레기가 된다.


System.out.println();
System.out.println("Main 종료");





}

}
----------------------------------------------------------------------------------
package com.tryCatch;

//throws
// - 호출한 곳으로 예외를 양도(던진다)
// - 예외를 처리 / 예외가 사라지는 것은 아니고, 책임을 전가하는 것.
// - 결국 마지막에 예외를 처리해야한다.
// - 사용방법  : 메서드에 사용
//   제어자 반환형 메서드 이름(매개변수) throws 예외 클래스, ... {}



public class Ex_03_3
{
//#1
//오류를 만들고 실행시켜보자.
public static void fn1() /*#3*/throws ArithmeticException, /*#4*/Exception{
int x = 10, y = 0;
int res;
res= x/y;
System.out.println("res : "+ res);
}

public static void fn2() /*#3*/throws ArrayIndexOutOfBoundsException{
int [] list = {1,2};
System.out.println(list[3]);
}

public static void main(String[] args) {
//#1
/*
fn1();
fn2();
*/
//실행시키면 당연히 오류남.

//#2
//해결방법
//1. try~catch
// 그러나 try~catch는 코드가 길어지면 시간이 오래걸린다.
// 모든 방에 들어가 폭탄을 하나하나 처리.
//2. throws
// 모든 예외를 한곳으로 모아서 처리.
// 방에있는 폭탄들을 한곳에 모은다.

//#3
try {
fn1();
fn2();
}catch(ArithmeticException e) {
System.out.println("연산 ERROR");
}catch(ArrayIndexOutOfBoundsException e) {
System.out.println("배열첨자 ERROR");
}/*#4*/catch(Exception e) {
System.out.println("그 외 ERROR");
}


//#4
//throws 에서 참조한 모든 예외 클래스에 대하여 catch를 써주어야한다.
//Exception 을 썼어도 예외처리를 해야한다.

//#5
//실행시키면 연산 ERROR만 뜨는데,
//에러를 발견하고 종료되기 때문이다.
//모든 에러를 보고싶으면 try~catch문을 하나 더 쓰자.
}

}
----------------------------------------------------------------------------------
package com.tryCatch;

import java.io.IOException;

public class Ex_04_4 {

public static void main(String[] args) {
/*
Motivator
System.out.print("입력: ");
System.in.read();
//IOException 이 뜨면서 빨간줄이 뜬다..!
//Checked Exception >> 예외처리를 해주자.
*/

System.out.print("입력: ");
try {
System.in.read();
}catch(IOException e/*import java.io.IOException 를 해야한다!!*/) {
System.out.println("입출력 ERROR");
}

//이게 귀찮으니까 그냥 Scanner를 쓰자.

}

}
----------------------------------------------------------------------------------
package com.tryCatch;

//throw
// - 특징: 에외 강제 발생!
// throw new 예외클래스 생성자
//소프트웨어적 예외는 아닌데 프로그램에서 예외이고 싶을 때. >> 나만의 예외를 정의해 주고 싶을 때 쓴다.

//#1
//사용자 정의 예외 클래스
//새로운 페이지를 만드는 것을 권장. 지금은 가독성을 위해 하나에 다 쓰자.
class MyException extends Exception /*예외클래스임을 나타냄. & 에외클래스로 만들어짐.*/{
}


public class Ex_05_5 {

public static void main(String[] args) /*#2*/ throws MyException{
//#1
int money = 3000; //잔액
int x = 4000; //출금할 금액
if(money < x) {
throw new MyException();
//#2
//예외가 만들어졌으니까 처리해주자.
//#3
//실행시키면 MyException에서 에러가 났다고 콘솔에 뜬다!!!
}
}
}
----------------------------------------------------------------------------------
----------------------------------------------------------------------------------
<GUI>
package com.gui;

//#1
//GUI
//Graphic User Interface

//두가지 컴포넌트를 사용할 수 있다.
// - AWT 컴포넌트
// java.awt 패키지
// 첫번째로 등장한 아이
// 운영체제의 특징에 따라 화면을 구성
// 운영체제마다 디자인이 다르다!
// 운영체제에 부탁~!
// 문제점: linux에서는 되는데 mac에서는 안됨..

// - Swing 컴포넌트
// javax.swing 패키지
// AWT의 단점을 보완
// 그래픽을 JVM이 자체적으로 처리.
// 모든 운영체제가 동일한 디자인을 가진다!
// AWT를 상속받아 메서드 이름을 동일하게 쓴다 (오버라이딩)
// 즉, AWT만 잘 안다면 Swing 컴포넌트를 사용하는데 문제 없다!










//#2
import java.awt.*;
import java.awt.event.WindowListener;

//AWT패키지
//크게 3가지 클래스로 나눌 수 있다.

// - Container
// 창의 역할을 한다. Component를 올려 화면을 구성한다.
// 패널, 윈도우, 프레임을 자손으로 갖고 있다.

// - Component
// 화면(Container)에 올라갈 구성요소들을 자손으로 갖고 있다.
// ex)버튼, 라벨(글자), ... 
// container클래스도 자손으로 갖고 있다.

// - LayoutManager
// Container 위에 Component를 배치할때 자리 배치 설정
// Swing패키지에는 없다.
// 디자인적 요소가 아니기 때문이다.

public class Main_1 {

public static void main(String[] args) {
//#3
//먼저 창을 만들어 보자.
//Container
// - Panel
// 화면을 구성할 때, 수월하게 레이아웃을 구성할 수 있도록 도와준다.
// - Window
// 응용프로그램에서 윈도우(창)을 생성하기 위해 사용되는 클래스.
// 윈도우를 이용하여 만들면 최소화, 최대화, 종료버튼 같은것이 없다...
// 그래서 Window클래스의 자손인 Frame 클래스를 이용한다.
// -Frame
// 기본적으로 여러 기능을 제공한다.
// (최소화, 최대화, 종료, etc...)
Frame myFrame = new Frame();
/*
Frame 안에는 여러가지 속성들이 있는데, 은폐되어 있다.(private)
private String title
private int width
private int height
private boolean visible .. (false가 기본값) >> 그냥 실행시키면 보이지 않는다.
*/
//따라서 getter, setter를 이용한다.
myFrame.setTitle("AWT");
//myFrame.setSize(300, 300); 
//단위 : px (픽셀)
//화면 해상도에 따라 다르게 보인다!
//실행시키면 테두리, 최소화, 최대화, X버튼이 기본적으로 있다. (Frame이 자동으로 제공)
//화면을 늘릴 수도 있다.
//cf. 계산기는 크기를 늘릴 수 없다.
//하지만 X버튼을 눌러도 꺼지지 않는다.
//X버튼의 기능을 Frame이 자동으로 넣어주지 않았기 때문.
//console에서 terminate시키면 종료된다.
//#4 
//이벤트
//X버튼을 눌렀을 때, 프로그램이 종료되도록 해보자.
/*
myFrame.addWindowListener();
*/
//#5
//WindowListener interface를 이용하기위해 클래스를 만들자.
//#6
MyWindow win = new MyWindow();
myFrame.addWindowListener(win);
//이제 X를 누르면 프레임이 종료된다.
//#7
//프레임과 관련된 여러가지 메서드
//위치정보를 지정하지 않았기 때문에 왼쪽 맨위에 붙어서 창이 나타난다. 
//좌표가 (0,0)이기 때문.
//좌표에 대해서 알아보자.
//x축은 같은데, y축이 반대이다. (아래가 +, 위가 -)
//myFrame.setLocation(300,300);
//사이즈와 위치 한꺼번에 지정해주는 메서드
myFrame.setBounds(300,300,300,300);
//(300,300) 위치에, (300,300) 사이즈
//사이즈 변경을 허용/불허용 하는 메서드
myFrame.setResizable(false);
//#8
myFrame.setVisible(true);
//visible은 제일 나중에 하는것이 좋다.
}

}
----------------------------------------------------------------------------------
package com.gui;

import java.awt.event.WindowEvent;
//#5
import java.awt.event.WindowListener;

public class MyWindow implements WindowListener{
// 에러발생!
//추상 메서드를 오버라이딩 해주자.

@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}

@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}

//X버튼 눌렀을 떄 호출되는 메서드.
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}

@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}

@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}

@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}

@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}

}

----------------------------------------------------------------------------------
package com.gui;

import java.awt.Button;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

//...Adapter라는 클래스는 implements ...Listener{ 추상메서드 오버라이딩 }라는 인터페이스를 구현하고있다.

/*
?????????????????????????????????????????????????????????????????????????
implements를 쓰는것보다 이렇게 하는것이 코드가 간결해진다.
상속을 여러개 해야하는경우에는 권장하지 않음.
*/

public class MyEvent_2_1 extends MouseAdapter {
//ctrl+space하면 오버라이딩 할수있는 메서드들이 나열된다.
@Override
public void mouseClicked(MouseEvent e) {
//#1
//마우스 클릭할 때 호출되는 메서드.
System.out.println("클릭");
//#2
//클릭한 개체의 주소값을 반환.
e.getSource();
//return 타입: Object (객체주소)
/*
* ex)
* Object obj = e.getSource();
* 이떄, 버튼타입으로 다운캐스팅을 해줘야한다. (알고있으니까..)
* Button bt = (Button)e.getSource();
* bt에는 버튼객체의 주소값이 담겨지게 된다.
*/
//Button import할 것!
Button bt = (Button)e.getSource();
bt.setLabel("Click");
 
//#3
//여러가지 메서드
System.out.println(e.getX()+","+e.getY()+","+e.getButton());
//e.getX(),e.getY()
//버튼을 기준으로 X,Y값 출력.
//절대 50을 넘을 수 없다. (50,50)이기 떄문.
 
//e.getButton()
//왼쪽 클릭 : 1
//휠 : 2
//오른쪽 클릭: 3
 
}
}

----------------------------------------------------------------------------------
package com.gui;

//#2
import java.awt.Button;
import java.awt.Label;

//#1
import java.awt.Frame;

public class MyFrame_2 extends Frame{
//#3
//Component의 자손 클래스
// - Button, Label, TextField, TextArea, Canvas, ...
Button bt; // 인스턴스 변수
Label la;
//#1
public MyFrame_2() {
setTitle("MyFrame");
setBounds(100,100,300,300);
MyWindow win = new MyWindow();
addWindowListener(win);
//#2
init();
}
//#2
//LayoutManager에 관해 알아보자.
public void init() {
//LayoutManager
// - null 
// - 내가 직접 위치와 크기를 배열하겠다!
setLayout(null);
bt= new Button("Button");
la = new Label("Label");
add(bt); /*#4*/ bt.setBounds(200,200,50,50); //(200,200)좌표에 (50,50)크기
add(la); /*#4*/ la.setBounds(100,100,50,50);
//????????????????????????????????????????add에 대해서 자세히 알아보자
//add의 매개변수는 컴포넌트 타입.
//#4
//이때 실행시키면 위치와 크기정보를 잡지않았기때문에 창만 뜨고 아무것도 뜨지 않는다.
//#5
//버튼에 이벤트를 추가하자.
/*
bt.addMouseListener();
*/
//#6
//인터페이스를 이용하기위해 클래스를 만들자.
//#7
MyEvent_2_1 evt = new MyEvent_2_1();
bt.addMouseListener(evt);
}
public static void main(String[] args) {
MyFrame_2 my = new MyFrame_2();
my.setVisible(true);

}

}

댓글

이 블로그의 인기 게시물

11 - Scanf

JAVA - Day3 - Scanner, if, if else

JAVA - Day5 - Array,Random