봉봉의 개인 블로그
2017-06-01-P 본문
Exceptions : 예외
예외가 발생하는 경우는
1번 사용자에 의한 실수
2번 있어야 할 파일이 없는것과 같은것
3번 네트워크 관련되서 예외가 날수 있다
예외의 종류예는
checked exceptions
(예외 처리를 하여야 한다 try catch 문을 통해서 예외 처리를 해야한다 ex.드라이버 로딩같은 예외)
위 사진과 같이 파일이 없을 수도 있고 D드라이버 자체가 없을 수도 있기 때문이다.
unchecked exceptions
(굳이 예외 처리를 하지 않아도 해결이 가능하다 ex. if문으로 그 예외가 일어나지 않게끔 한다던지)
위 사진과 같이 사용자에 의해 발생한 예외등이기 때문에 개발자가 해결이 가능한 예외같은것이다.
Errors
(try catch 절로도 어떻게 해결이 안되는것이다 ex. 컴퓨터의 용량이 부족한다든지 갑자기 컴퓨터가 갑자기 종료 된던지)
** 라이브러리를 사용하게된 이유중 하나도**
** 예외를 처리하는데 있어서 try catch 문을 사용하게 되면 코드 자체가 너무 길어지고 지저분해지기 때문에
코드의 간결성을 위해 사용하는데 사용할수 있게 되는 이유는 checked 예외를 uncecked 예외로 바꿔서 사용할수 있기 때문이다.
예를 들어 이런식으로 적게 되면 dbconn 안에서 예외를 호출한 곳으로 던져버렸기 때문에 호출한곳에서 예외를 처리하여야하는것이다. 그러면 이렇게 되면 호출한곳에서 try catch 문을 통해서 예외를 처리하여야 하기 때문에
코드가 더 지저분해지고 가소성이 떨어진다. 그래서 이때 SQLexception예외를 Runtiome 예외로 바꿔서 호출한곳에서 간결하게 바꿔줄수 있다 예를 들면 아래 사진과 같이 바꾸면 되는것이다.
이런식으로 바꿔 주게 되면 dbconn안에서 getConnection 예외를 처리하고 다시 안에서 예외를 만들어서 밖으로 던져주는것이다 즉 이렇게 하게 되면 메서드 안에서 예외를 처리함과 동시에 호출한곳에 예외를 알릴수 있는것이다.(이런경우 메세지를 적어서 표현을 해주게 되면 되는것이다throw new RuntimeException(예외 발생); 이런식으로) 이런식으로 작성을 하는 이유로는 먼저 호출하는곳에 try catch 문이 없으므로 중간 개발자 입장에서 받아서 작업하는데 있어서 편하고 호출한곳이 간결해지고 호출한곳에서 예외가 난부분의 내용을 알수 있기 때문에 좋다.
하지만 만약 중간개발자가 사용하지 않고 최종적으로 사용자가 사용하게 될경우에는 나중에 이러한 부분들의 예외의 메세지들을 더 자세하게 바꿔줄 필요성이있다.
*상속 관계*
java.lang
Object
Throwable
Errors
Exceptions
Runtime exceptions
other exception
Multiple Catch
2개 이상의 예외를 처리하여야 할때를 말한다
이런경우에는
하나의 메서드 안에 2개 이상의 예외가 나게 되면
Catch (IOExcrption | FileNotFoundException ex){
logger.log(ex);
throw ex;
이런식으로 적어주면 좋다.
The Throws/Throw Keywords
여기서
Throws 는 예외를 알리기 위함이고
Throw 는 예외를 강제로 만들기 위함이다.
(Throw 뒤에는 무조건 new 생성자가 와야한다)
The Finally
항상 코드가 실행되야 할때 사용되고 주로 resources에서 많이 사용된다(반납받아야할때 file 같은건 반납을 받아야하기 때문이다)
User-defined Exceptions 사용자의 예외 (개발자가 예외를 만들수있다)
Class MyException extends Exception{
}
이런식으로 MyException 과 같이 자신이 예외 자체를 만들수 있다 물론 상속으로 Exception,RuntimeException등을 받아서 만들어야 하며 나중에 이 예외가 무슨 예외인지 알아야할때 주로 사용한다.
Inner Classes (안드로이드 할때 많이 필요하다)
inner Class 는 내부 클래스 라고 생각하면된다.
그런데 inner 클래스 에서도 Anonymous inner class가 있다 이건 익명 클래스라고 한다
상속에 관련된 것중
instanceof Keyword 가 있다
이건 다형성을 적용할수 있냐 없냐를 알고 싶을때 사용하는 연산자이다.
ex. System.out.println(m instanceof Animal) 이런식으로 사용한다.
Polymorphism
Polymorphism은 다형성 이다
하나의 형태가 여러 타입이 되는것이라고 크게 생각하면된다.
여기서 모든 걸 통합한예제를 한번 보고가자
이런식의 예제가 있다고 하자
설명을 하자면 먼저 9번줄에서 보면 ButtonTest 클래스가 있는데 이 클래스는 JFrame클래스를 상속받는다.
JFrame 네모난 상자를 만드는것이다 일반 프로그램 박스같은거라고 보면된다. 그리고 이 ButtonTest 클래스안에 10~12번과 같이 버튼을 만들겠다는 뜻이다
그후 14~16번의 메인메서드에서는 ButtonTest클래스 타입으로 변수를 선언하고 ButtonTest생성자를 통해서 매매개변수 값을 입력하면서 객체를 하나 만듭니다
그후 18~41번에서 보면 객체가 생성될때 아래의 것도 같이 실행되게끔 만든것이다.
즉 ButtonTest 클래스 안에 내용이라고 보면 된다.
여기서 먼저 18번 줄에서 ButtonTest 의 객체는 String 타입의 title이라는 매개변수를 받게 된다.
또한 받은 title의 값은 상속받은 JFrame안에 메서드중하나에 입력되어 타이틀이 되는것이다
그다음 setLayout 은 프로그램에서 아래 사진과 같은곳을 말한다
위 사진의 이름과 같은곳에 들어가는 곳을 말한다
그리고 addActionListener 은
버튼 3개가 들어간 곳을 말한다. 여기 안에 이제 버튼을 누를때마다 new MyListener 를 통해서 MyListener가 계속 새로 생성 되면서 이벤트가 발생하는것이다 그리고 btnEnd 키를 눌렀을때는 ActionListener 를 통해서 계속 객체를 생성해서 이벤트를 발생시키는데 지금 28~32번과 같은 경우는 ActionListener클래스 안에 있는 메서드를 Override 하여 다시 재정의 하여 사용하는것이다. 즉이런 클래스를 익명클래스 라고 한다.
36~41번까지의 문은 버튼의 순서 라든지 전체 JFrame 을 통해 생성된 객체 즉 프로그램창의 크기을 나다내는것이다
그리고 40번같은경우는 true 일때 프로그램이 화면에 보이는것이다
그다음으로는 43번에서 57번까지의 문은 내부 클래스 즉 inner 클래스라고 하고 클래스 안에 클래스가 있는것을 말한다.
이걸 사용하는 이유는 간단하게 그냥 이 클래스 에서만 사용하기 위해서 이런식으로 내부 클래스를 만드는것이다
설명을 조금 하자면 ActionListener 클래스를 상속받게 된다 그리고 그안에 메서드로 actionPerformed이 선언되어있고
매개변수 값으로 ActionEvent이벤트의 값을 매개변수로 받게 된다 클릭이라든지 키보드 입력이라는 것이라던지 받게 되고
그 받은게 뭐가 될지 모르니깐 46번의 문에서 Object라는 커다란 곳에 담습니다. 매개변수값으로 받은걸
그후 if elseif 를 통해서 obj의 값이 만약 btnX 이면 JOptionPane.showMessageDialog 통해서 알림창(경고창)이 뜨게 되는것이다. 마찬가지로 btnY를 눌렀을때도 JOptionPane.showMessageDialog 통해서 알림창(경고창)이 뜨는것이다.
Abstraction 추상
추상에는 추상 메서드 , 추상 클래스 ,인터페이스 라는게 있다
위 사진과 같은 소스 코드가 있다
처음 나오는 public abstract class person1 같은 것이 추상 클래스 이다
그리고 이 추상 클래스는 추상 메서드를 가지고 있으면 추상 클래스가 되는것이다
여기서 그럼 추상 메서드가 무엇이냐면
public abstract void work(); 라는게 추상 메서드가 되는것이다
이렇게 되었을때 9번줄과 같이
Student1 라는 클래스에서는 person1을 상속받습니다.
그렇게 되면 Student1 은 person1을 상속받았기 때문에 그안에 있는
public abstract void work(); 추상메서드를 가지게 되는데 여기서 추상메서드를 상속 받앗기 떄문에
student1 클래스 안에서는 상속받은 추상메서드를 재정의 즉 오버라이딩 해서 사용하여야 하기 때문에 사진에서도 11~13번 줄과 같이 메서드를 제 정의해서 사용하여야 하는것이다.
그리고 여기서 또 배운내용을 설명하자면 5번은 다형성을 가지고 있다. person1을 상속받아서 work를 사용하였고 호출에서 person1 타입으로 new student1 객체를 생성하엿지만
person1을 상속받기 때문에 person1의 형태로 써의 객체가 만들어지는것이다. 그렇지만 객체참조변수 p 안에는 결국 student1 안에 메서드만 호출할수 있게 된다.
Java - Advanced
Enumeration Interface = 는 배열을 편하게 사용하는 API 이다
예제를 잠깐 보자면
위 사진과 같은 코드가 있다.
8번에서 Enumeration 타입으로 days 를 선언합니다
그후 Vector 타입으로 dayNames 라는 변수를 선언하고 Vector생성자 메서드를 통해서 새로운 객체를 만들고 그 주소값을변수안에 할당해줍니다.
(*Vector은 배열이다 ArrayList와 같은 배열이지만 보다 안정적이지만 속도는 느리다)
그리고나서 dayNames 변수안에 add 를 통해서 값을 넣어줍니다
그후 dayNames 의 변수를 16번문과 같이 적어 Enumeration 화 시켜줍니다. ( 표준화가 된다고 생각하면된다)
그후 while 문을 통해서
17번에서 days 안에 값이 있으면 계속 반복문을 실행해 주세요 라는 말이 hasMoreElements 이다
그후 출력을 할때 그 안에 값을 출력해 달라는 뜻으로 nextElement 를 사용하였다 이것은 자주 사용하였던 rs.next와도 비슷한 형태라고 생각하면된다.
BitSet = 01001101 형태에 사용하는 데이터 setter 이다.
Vector = 배열 같은것이다
아래와 같은 예제를 만들어 보았다
위 사진과 같은 소스가 있다.
설명을하자면 7번에서 Vector 타입으로 객체를 생성하고 주소값을 변수 v 에 할당합니다 이때 객체를 생성할때 뒤에 숫자 3,2 라고 적힌것은
3개의 배열을 만들고 3개의 배열이 넘어가면 2개씩 배열이 늘어나게 되는데 늘어난다는 개념보다는 새로운 5개 짜리 배열을 만들고 원래 있던값을 새로운 배열에 담고 원래 있던걸 지우는것이다.
위와 같이 출력을 해보게 되면 3, 3 , 4 ,5 이런식으로 출력이 되게 될것이다.
(*capacity 메모리 할당 크기를 볼때 사용하고 size는 데이터가 들어가 있는 크기를 볼때 사용한다.*)
stack = 배열에 관련된 것이다.
위 사진과 같은 예제가 있다
먼저 7번과 같이 Stack 타입으로 st 가 선언되고 Stack 생성자 메서드를 통해 객체를 생성합니다(배열이다)
그리고 생성된 객체의 주소값을 st 변수에 할당합니다.
그후 st 주소값안에 add 를 통해서 a , b , c 를 추가해줍니다.
그후 String 타입의 s 를 선언하고 st주소값안에 pop메서드를 통해 불러온값을 형변환하여 s 안에 담고 출력해줍니다. 그렇게 되면 c가 먼저 나오게 된다.
그리고나서 한번더 s 안에 st 주소값안에 pop 메서드를 통해 불러온값을 형변환 하여 s 안에 담고 출력해주게 되면
이번에는 b 가 나오게 된다.
Stack은 들어갈땐 차곡차곡 들어가고 나올땐 들어간 숫자의 반대부터 나오는것이다 즉 맨마지막으로 들어간것이 먼저 나오게 되는것이다.
그리고 우리가 흔히 메서드를 호출할때도 이런 stack 구조로 호출된다.
Map
Map도 배열과 관련된것이다
설명을 조금 하자면 Map 타입으로 m 을 선언하고 HashMap 을 통해서 생성된 객체의 주소를 m 에 할당합니다 그후 그안에 m.put 을 통해 값을 set하고 출력을 하게 되면
이런식으로 출력이 되게 된다
즉 Map 은 key 값과 데이터 값으로 출력되는것이다 key=데이터값 으로 되어있고 호출할때도
m.get안에 key 값으로 호출하면 8이라는 값이 나오게 된다.
Collections
위 사진과 같은 코드가 있다.
설명을 하자면 모두다 list 배열에 관련된것이다
11~15번까지는 ArraryList에 관련된 것이고
17~21번까지는 LinkedList 에 관련된 내용이다
ArraryList는 배열인데 만들기도 쉽고 가소성도 좋은 반면에 중간에 내용이 사라지면 수정하기가 힘들다
Linked는 1번이 2번하고 연결되있고 2 번은 또 3번하고 연결되있고 이런식이다
그런데 여기서 만약 2번을 삭제하게 되면 1번이 3번하고 연결되면 되기 때문에 하나만 수정하면 되는것이다
25~29번까지는 HashSet 에 관련된 내용이다.
set배열은 중복된 값은 들어가지 않는다.
Generics
이건 타입이라고 생각하면된다
배열에서는 List<String> 같이 <String> 이걸 Generics 라고 한다.
Collections
Collections 는 Math와 비슷하다 배열의 연산을 간단하게 할수있다.
이런식으로 되있는 코드가 있다
먼저 ArraryList 안에 배열로 1,2,3,4,5 가 있다
그리고 17번줄에서 ball 을 섞어준다 그후 18번에서 출력하면 랜덤으로 나오게 되고 19번줄에서는 다시 순서되로 만들어준다.
21~23번줄과 같이 Iterator를 사용하면 배열안에 모든 값을 가지고 올수 있다.
'학원에서 배운것들 > TEA - P' 카테고리의 다른 글
2017-06-07-P (0) | 2017.06.07 |
---|---|
2017-06-02-P (0) | 2017.06.02 |
2017-05-31-P (0) | 2017.05.31 |
2017-05-26-P (0) | 2017.05.26 |
2017-05-25-P (0) | 2017.05.25 |