반응형

**예외처리

1.예외처리

try{

           예외가 발생할 가능성이 있는 구분

}

catch(예외클래스 변수명){

           예외 클래스에 해당하는 예외가 발생했을 때 처리할 구분

}

catch ...

 

finally{

           예외 발생 여부에 상관없이 수행하는 구무

}

=>try가 나오면 반드시 1개 이상의 cathchfinally가 와야 합니다.

=>catch는 여러 번 나올 수 있는데 위쪽의 catch에 아래쪽 catch보다 상위 클래스 예외를 처리하는 것은 안됩니다.

상위 클래스 타입의 참조형 변수에는 하위 클래스 타입의 인스턴스 참조를 대입할 수 있습니다.

=>try , catch, finally  별도의 블럭이기 때문에 각 블럭에서 만든 변수는 그 블럭에서만 사용가능

 

 

2.최상위 예외

java.lang.Throwable

=> 메소드

String getMessage() : 예외 내용을 문자열로 리턴

void printStackTrace():예외 발생 내역을 역추적해서 출력

 

3.도달할 수 없는 코드에러

       public static void main(String[] args) {

              

               try {

                      int[] ar = {100, 300};

                   System.out.println(ar[2]);//ArrayIndexOutOfBoundsException

               }

               //Exception클래스가 ArrayIndexOutOfBoundsException 상위클래스 예외가 발생하면 Exception 처리

               //아래 catch구분은 도달할 없는 코드가 됩니다.

               catch(Exception e) {

                      System.err.println(e.getMessage());

               }

               catch(ArrayIndexOutOfBoundsException e) {

                      System.out.println("예외가 발생했습니다.");

                      //메세지 내용을 출력한 것이다.

                      System.out.println(e.getMessage());

                      //출력하는 텍스트 색상을 변경하기 위해서 out대신에  err 사용

                      System.err.println(e.getMessage());

               }

       }

 

4, 모든 예외를 하나의 catch에서 처리하고자 할 때는 예외 클래스를 Exception이나 Throwable을 설정하면 됩니다.

Catch는 하나만 만들어서 사용할 수있다.

               try {

                      int[] ar = {100, 300};

                   System.out.println(ar[2]);//ArrayIndexOutOfBoundsException

               }

               catch(ArrayIndexOutOfBoundsException e) {

                      System.out.println("예외가 발생했습니다.");

                      //메세지 내용을 출력한 것이다.

                      System.out.println(e.getMessage());

                      //출력하는 텍스트 색상을 변경하기 위해서 out대신에  err 사용

                      System.err.println(e.getMessage());

               }

               //Exception클래스가 ArrayIndexOutOfBoundsException 상위클래스 예외가 발생하면 Exception 처리

               //아래 catch구분은 도달할 없는 코드가 됩니다.

               catch(Exception e) {

                      System.err.println(e.getMessage());

               }

 

 

5.throws

=>메소드를 만들 매개변수 뒤에 thrwos 기재하고 예외클래스 이름을 작성하면 메소드를 호출한 곳에서 예외를 반드시 처리해야 합니다.

자바는 RuntimeException 외에 예외가 발생할 가능성이 있는 메소드의 경우 예외 처리를 강제하는 경우가 있습니다.

=>main메소드에 Throws예외클래스 이름을 붙이면 예외처리를 하지 않아도 됩니다.

main메소드는 jvm 호출하는 메소드라서 main에서 예외를 다른 곳에서 처리하도록 하면 jvm 예이를 처리하게 됩니다.

권장하지는 않습니다.

 

 

6.예외처리를 반드시 해야 하는 경우

java.lang.Thread클래스의 sleep이라는 메소드는 밀리초 단위를 매개변수로 받아서 매개변수 만큼 스레드를 중지시켜주는 메소드 입니다.

이 메소드를 이용해서 10초동안 1초마다 Hello Exception출력하기

mainjvm이 불러서 jvm이 하는 것이다.

 

예외 처리 목적 : 2가지

예외 내용 기록하기 위해서

예외가  발생해도 계속 처리하는 것이다.

 

이렇게 하면 안 좋다.

 

예외처리 강조

바깥쪽에 있는 것이다.파일헨들링, 네트워크 , Db

파일 헨들링     

네트워크

db

스레드

 

내부  ------------ 외부

       public static void main(String[] args) {

               int i = 0;

               while(i < 10) {

                      System.out.println("Hello Exception");

                      try {

                             //sleep라는 메소드는 InterruptedException 발생할 가능성이 있으므로

                             // 예외에 대한 처리를 해야주어야만 합니다.

                             //java 예외를 강제한다.

                             Thread.sleep(1000);

                      } catch (InterruptedException e) {

                             System.err.println(e.getMessage());

                      }

                      i = i+1;

               }

       }

 

7.예외 강제 발생

=>예외가 발생할 상황이 아닌데 강제로 예외를 발생시킬 수 있는데 이 때는 throw 예외 객체를 주면 된다.

예외 객체를 만들 때는 new 예외클래스이름(메시지) 형태로 작성

 

8.사용자 정의 예외 클래스

=>Exception 클래스러부터 상속받아서 생성

 

9.try - with - resources

=>1.7버전부터 지원

try(인스턴스 생성){

           인스턴스를 생성

}catch(예외 클래스 이름 변수명){

           예외처리 구문

}

=>try()안에서 생성한 자원은 예외 발생 여부에 상관없이 catch구문 뒤에서 자동으로 해제를 합니다.

try()안에서 생성한 자원은 close().를 호출할 필요가 없습니다.

파일핸들링, 네트워크 , db=>는 마지막에 무조건 close(), disconnect해야 한다.ㅏ 반드시 자원 해제를 해야 한다.

 

예전 구문

Socket socket = null;//try , catch, finally는 따른 블록이다.finally에 사용할려고 한다.

try{

           socket = 소켓 생성

           socket 사용;

}catch(예외클래스 변수명){

           예외가 발생했을 때 처리를 구문;

}finally{ 

           sockte.close();

}

 

1.7이후에 가능한 구문

try (Socket socket = 소켓생성) {

           socket = 소켓 생성

           socket 사용;

}catch(예외클래스 변수명){

           예외가 발생했을 때 처리를 구문;

}

이 소켓은 try- catch구문을 나오면 자동으로 자원 해제가 됩니다.

 

=============java의 패키지

**java.lang패키지

=>자바의 기본 패키지

=>이 패키지는 import하지 않아도 패키지 이름을 생략 가능

1.Object클래스

=>자바의 최상위 클래스

=>자바의 모든 클래스는 Object클래스로부터 상속됨

=>이 클래스의 모든 속성이나 메소드는 다른 모든 클래스에서 사용 가능

=>이 클래스는 자바의 모든 클래스의 공통된 내용을 가지기 위해서 만들어진 클래스라서 인스턴스 생성은 하지 않습니다.

 

 

Object clone();복제를 위한 메소드인데 재정의 해서 사용

boolean equals(Object obj): 인스턴스의 내용을 비교하기 위한 메소드로 재정의해서 사용

 == : 참조형의 경우 참조가 같은지 비교

equals: 참조형에서 내부 데이터가 같은지 비교

 

int hashCode(): 인스턴스의 해시코드(참조)를 리턴해주는 메소드

해시코드가 같으면 동일한 메모리 영역을 참조하는 것


wait
notify메소드는 멀티스레드에서 사용하는 메소드

 

String toString():인스턴스를 문자열로 표현하기 이한 메소드

이메소드는 직접 호출해도 되지만 출력하는 메소드에 인스턴스를 대입하면 자동 호출 재정의하지 않으면 클래스 이름과 해시코드를 리턴

python__str__이다.

print() => __str__부르고

system.out.print() => toString()부른 것이다.

 

실습

=>번호와 이름을 갖는 클래스

package java;

 

//여러개의 속성을 표현하기 위한 클래스는 속성의 값을 빠르게 확인하기 위해서 (디버깅)

//toString 오버라이딩 합니다.

public class DTO {

       //속성은 private으로 만들고 접근자 메소드를 public으로 선언해서 사용

       private int num;

       private String name;

      

       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;

       }

      

       //[Source] - toString()

       @Override

       public String toString() {

               return "DTO [num=" + num + ", name=" + name + "]";

       }

}

 

 

public class Main3 {

 

       public static void main(String[] args) {

               //DTO클래스의 인스턴스를 만들고 내용을 채운후 출력

               DTO dto1= new DTO();

               dto1.setNum(1);

               dto1.setName("김정화");

              

               //출력 -인스턴스 이름을 출력하는 메소드에 대입하면 toString() 호출한 결과가 출력

               System.out.println(dto1);

               //toString() 없을 경우 java.DTO@15db9742

               //toString() 있을 경우 DTO [num=1, name=김정화]

       }

 

}

 

 

**기본형과 참조형

=>기본형은 변수 자체가 데이터이고 참조형은 변수가 데이터가 저장된 곳의 참조를 의미

==는 변수를 비교하는 연산자

기본형의 경우는 데이터를 비교하지만 참조형의 경우는 데이터를 비교하는 것이 아니고 데이터의 참조를 비교

 

String str = sr.nextLine();

String msg = "문자열";

 

str에 입력한 내용과 msg에 저장한 내용이 같더라도 == 로 비교하면 false가 나올 수 있습니다.

내용이 같더라도 저장 장소가 다를 수 있다.

참조형 데이터의 경우 내용을 비교할 때  equals메소드를 이요합니다.

Stringequals가 재정의 되어 있어서 equals를 이용하면 내용 비교가 가능

 

               String id = "root";

               Scanner sc =  new Scanner(System.in);

               System.out.print("아이디 : ");

               String input = sc.nextLine();

              

               //참조형이라서 내용이 같더라도 false 나올 있습니다.

               System.out.println(id == input);

               System.out.println(id.equals(input));

              

               sc.close();

 

데이터베이스에서도 같는지 안 같는지 equals로 비교하면 된다.

num이 기본키일 경우 아래의 것으로 비교한다.

if (this.num == other.num) {

                      return true;

               }else {

                      return false;

               }

 

모델링 컬럼에 들어갔는지

       private int num;

       private String name;

똑같으면 안되라는 것을 처리 하기 위해서

       //인스턴스의 내용을 비교하는 메소드

       public boolean equals(DTO other) {

               //내용 비교

               //num name 일치하면 true 그렇지 않으면 false

               if (this.num == other.num && this.name.equals(other.name)) {

                      return true;

               }else {

                      return false;

               }

       }

 

       //인스턴스의 내용을 비교하는 메소드

       public boolean equals(DTO other) {

               //내용 비교

               //num name 일치하면 true 그렇지 않으면 false

               if (this.num == other.num && this.name.equals(other.name)) {

                      return true;

               }else {

                      return false;

               }

       }

 

               //DTO클래스의 인스턴스를 만들고 내용을 채운후 출력

               DTO dto1= new DTO();

               dto1.setNum(1);

               dto1.setName("김정화");

              

               //출력 -인스턴스 이름을 출력하는 메소드에 대입하면 toString() 호출한 결과가 출력

               System.out.println(dto1);

               //toString() 없을 경우 java.DTO@15db9742

               //toString() 있을 경우 DTO [num=1, name=김정화]

              

              

               DTO dto2 = new DTO();

               dto2.setNum(1);

               dto2.setName("김정화");

              

               //new 하면  instance생기고 메모리 할당한다.

               //참조를 비교 - 각각 new 했기 때문에 참조가 다름

               System.out.println(dto1 == dto2);

               //내용을 비교 - equals 재정의해서 내용을 비교

               System.out.println(dto1.equals(dto2));

 

Database

 

응용프로그램

 

 

디자인

 

코딩

 

디자인과 코딩을 연경할려면 DTO dto3 = dto1;원리를 사용한다.

 

디비접속 디비에 바로 반영이 된다. COMMIT,작업 취소 같은 것을 쉽게 못한다.

디비에 접속하면 DB에 연결하는 것이 아니라 COPY본을 준다.

 

 

 

 

 

COMMIT하면 DB COPY에 것을 DB에 반영하는 것이고

ROLLBACK하면 DB COPY 없어진다.

원본을 복재해서 사용한다.

 

원본을 복제 :

자바에서는 CLONE이라고 하고

자바이외에 했던 언어는 deep copy(깊은 복사)

clone는 나랑 똑같은 것을 준다.

public DTO 자바는 이름을 맞추는 것이기 때문에 이름을 맞추는 것이 좋다.

public DTO clone(){

           //새로 만들어줘야 한다.

           DTO ? = new DTO();

           ?.setNum(this.num);

           ?.setName(this.name);

           return ?

}

DTO dto1 = new DTO();

dto1.setNum(1);

dto2.setName("김정화");

 

DTO dto1 = new DTO();

static 에서 DTO클래스 ->static(메소드)

DTO dto3 = dto1;

dto3.setNum(2);

System.out.println(dto1.getNum()); //2가 뜬다. 복사는 메모리 라는 것이다.

 

 

 

set값은 바꾸는 것이고

get은 꺼내는 것이다.

 

변수.get

변수.set

 

실습

=>DTO복재 CLONE

DTO.java

       //인스턴스의 내용을 복사해서 리턴해주는 메소드

       public DTO clone() {

               //새로운 인스턴스를 생성

               DTO other = new DTO();

               //기존 인스턴스의 내용을 복제

               //this 생략해도 되는데 기존 인스턴스의 내용이라는 것을 강조하기 위해서 thisfmf 붙임

               other.setNum(this.num);

               other.setName(this.name);

               return other;

       }

Main3.java

               //참조를 복사 -하나의 변경이 다른 것에도 영향을 주게 됩니다.

               DTO dto3= dto1;

               dto3.setNum(2);

               System.out.println(dto1);

              

               //내용을 복제 - 하나의 변경이 다른 것에 영향을 주지 않음

               DTO dto4 = dto1.clone();

               dto4.setNum(3);

               System.out.println(dto4);

 

결과 =>

 

heap , stackuser mode가 한다.

jvm으로 하기 때문에

운영체제게 kernel mode로 까지 하기 때문이다.

 

 

반응형

'Study > Java' 카테고리의 다른 글

java-10  (0) 2020.09.30
java-9  (0) 2020.09.29
java-7  (0) 2020.09.27
java-6  (0) 2020.09.26
java-5  (0) 2020.09.24

+ Recent posts