220111 자료구조, Generic, 예외처리
Collection Framework
***자료구조***
java.util.*;
Set, List*, Vector, Map*, Queue, Stack etc.
: 여러가지 자료형의 객체 값을 모두 저장할 수 있음
왜냐면 값을 입력받는 메소드의 매개변수가 Object거든 -> 업캐스팅 ㄱㄱ
배열의 확장 version -> 객체를 효율적으로 추가,삭제,검색할 수 있음
>> 배열과의 차이점 1. 여러 자료형 값을 다 받을 수 있고 2. 동적으로 크기를 늘릴 수 있음
Set, List는 10일자 정리에 있음
3. Vector Class (List와 같은 기능)
: index번호 순으로 저장되어 출력. 중복 data 저장 가능
-> 인터페이스가 아니고 클래스라서, 바로 객체 생성하는게 가능-> 생성자로 설정 가능
기본 생성자Vector()-> 초기 용량capacity() 기본 10으로 생성
Vector(int n) -> 초기 capacity값 지정
Vector(x, y) -> 초기 capacity 용량 x를 y씩 증가시킴
Vector(String str) -> Vector에 값을 추가
값 입력방법
- add(Object e)
- addElement(Object e) -> Vector에만 있음
값 출력방법
- Vector 클래스의 elements() 메소드를 Enumeration나열형 클래스 객체로 할당 -> Vector에만 있음
(import 필수인데 java.util.*로 퉁치면 ㄱㅊ을걸)
Enumeration e = v.elements();
while( e.hasMoreElements() ) {
System.out.println( e.nextElement() );
}
+) elementAt(i) : get(i)처럼 인덱스번호로 저장된 값 출력
+) Vector 클래스의 iterator() 메소드를 Iterator반복자 클래스 객체로 할당
Iterator ie = v.iterator();
while( ie.hasNext() ) {
System.out.println( ie.next() );
}
- get(i) 반복문으로 출력
+) isEmpty() -> 리스트가 비어있으면 false 출력 (값 다 출력되면 false)
remove(i): 인덱스 번호 i에 저장된 값 삭제
set(i, Object) : 인덱스번호 i에 object형 값 입력
4. Map Interface -Inhe: HashMap, HashTable Class
: data 저장 시 Key, Value를 동시에 저장
key값은 중복되면 안되고, 만약 중복된다면 가장 마지막에 저장된 Value만 사용 가능
Value는 중복 가능
인터페이스는 자체적으로 객체 생성 불가능
i) HashMap() method
HashMap hm=new HashMap(); 또는 업캐스팅으로 Map 객체 만들거나 해야함
(단, 참조 범위가 줄어들기 때문에 구현클래스에만 있는 메소드를 사용한다면 업캐스팅 X)
hm.put(Object key, Object value) -> key, value를 한 쌍으로 저장해야함
-> 그대로 출력 시 {key=value} 형태로 출력됨 (단, 순서는 무작위)
keySet() : key 값만 출력
get(Object key) : key를 입력하면 value가 출력됨
ii) Hashtable() Method
Hashtable ht=new Hashtable();
출력방법
String Val = (String)ht.get("포도"); // String형으로 다운캐스팅하고 Val 출력하기
-> 다른 자료형이라면 다른 자료형으로 다운캐스팅, 아무튼 Object 자료형은 자주 쓰이는 건 아니고, 저장된 자료형이 전부 String이면 하나의 자료형으로 바꿈 보통...
또다른 방법 key와 value값 구하기
Enumeration Enum = ht.keys(); //Map의 모든 key를 구해옴
while(Enum.hasMoreElements()){ // key가 존재한다면
Object k = Enum.nextElement(); //key 값 k로 할당
Object v = ht.get(k); //get()으로 value 값 v에 할당
System.out.println(k + " : "+ v );
}
--> 여기 keys()메소드는 Hashtable에만 있으므로 Map으로 업캐스팅 하면 안 됨!!
5.Queue Interface -Inhe: LinkedList Class
: FIFO(First In First Out:선입선출)
LinkedList myQue = new LinkedList(); (Queue로 업캐스팅 가능)
입력 offer()
출력 poll()
+) get(index) 메소드 존재하니까 인덱스 번호로 특정 값 출력하는것도 됨
만약 큐에 값이 존재하지 않는데 poll을 쓴다면 null이 리턴됨
6. Stack Class
: LIFO(Last In First Out:후입선출)
Stack myStack = new Stack(); //클래스라 바로 객체 생성 가능
입력 push()
출력 pop()
+) get(index) 메소드 존재하니까 인덱스 번호로 특정 값 출력하는것도 됨
값이 존재하지 않는데(empty) pop을 쓴다면 오류(예외) 발생 - EmptyStackException
-> isEmpty()로 값이 있는지 확인하고 출력해야함 : empty()는 비어있을 때 true 리턴
peek() 가장 마지막 데이터를 구해오는 역할 (포인터로 가리키는.. 느낌)
**제네릭Generic**
Vector v = new Vector(); ---> Object 자료형이면 다 가능
String temp=(String) vec.get(i); --> 강제형변환으로 다운캐스팅해야함
Vector<String> v = new Vector<String>();
String temp=vec.get(i); --> 자료구조에서 데이터 구해올때 자료형 생략 가능!!
Vector<Integer> v = new Vector<Integer>();
Vector<Double> v = new Vector<Double>();
---> 특정 데이터형만 저장할 수 있게 됨
GenericTest02.java
Object형으로 받았을 때 특정 자료형으로 값을 넘겨야 하는 경우 다운캐스팅 과정이 필요함
GenericTest05.java
처음부터 제네릭으로 특정 데이터형만 받을 수 있게 제한시키면 다운캐스팅 과정 따로 없이 바로 그 데이터형으로 저장된다고 할 수 있음
***예외Exception처리***
교재 10장, 4시부터 반드시 강조한 예외처리 부분.. 설명 다시 듣기
: 예외란 프로그램이 실행되는 동안에 발생하는 예기치 못한 에러를 의미하고, 예외처리란 이런비정상적인 종료를 막기 위해서 사용하는 것
※에러와 예외의 차이
에러: 하드웨어의 잘못된 동작 또는 고장에 의한 오류, 에러 발생시 프로그램 종료, 정상 실행 상태로 돌아갈 수 없음
예외: 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩에 의한 오류, 예외 발생시 프로그램 종료, 예외 처리 추가하면 정상 실행 상태로 돌아갈 수 있음
주로 사용하는 곳
1 주로 파일 입출력 처리할 때 반드시 예외처리를 함(특정 파일을 열거나, 읽거나, 저장할 때 등)
java.io.* 패키지의 클래스들을 이용해야 할 때는 파일, 값 등을 이용할 때 반드시! 필수적으로! 필요한 것!
2 Database 연결, 연동을 수행할 때,
java.sql.* 패키지 이용할 때! 반드시 예외처리 함!
-> 안 그러면 형식상으로 오류가 발생해 컴파일 안 됨... 꼭.. 배워서 활용해야 함!
해야 하는 이유---> 프로그램을 안전하게 실행, 종료시키기 위해! 비정상적으로 멈추지 않게 하려고!
*예외Exception의 종류
일반 예외: 예외처리 코드 없으면 컴파일 오류
실행 예외: 예외처리 코드를 생략해도 컴파일되는 예외
1. DivideZeroExceptionHandling.java 참고
try{
예외가 발생할 '가능성'이 있는 문장; //예외 발생하지 않았을 때는 try 내부 코드만 실행
}catch(예외클래스명 매개변수){ //예외 발생시 try에서 예외 발생한 코드부터 그 아래는 실행되지 않고 catch로 넘어가 catch 코드 실행
예외 메시지;
}
Q.어떤 예외클래스를 catch에 넣어야 하나요?
A. 일단 예외를 발생시켜보면 뭘 넣어야 할지 알 수 있을 겁니다
농담임
catch ( Exception e ) {
a = 2;
c = b/a;
}
예외 중 최상위super 클래스인 Exception 클래스를 넣으면 모든 예외 커버 가능함
Q. Catch문에 예외클래스와 매개변수.. 매개변수 굳이 왜 쓰죠?
A. 당연히 예외 클래스의 메소드를 객체를 이용해 가져와 사용하기 위해서임
e.printStackTrace(); -> 예외 정보를 자세히 출력시킴
(얘는 s.o.p 안에 사용하면 안됨 값 하나 리턴하는게 아니라 void로 출력까지 한꺼번에 해주거든)
e.getMessage() -> 예외 정보 문자열로 반환 // 얘는 s.o.p 가능
e.toString() -> 예외의 간단한 설명문 반환 // 얘도
ex) ArithmeticException : 0으로 나눌때 예외가 발생한 경우
e.getMessage() -> 예외 정보 반환 ---> / by zero 출력
e.toString() -> 설명문 반환 --> java.lang.ArithmeticException: / by zero
e.printStackTrace(); -> 싸그리 싹싹 긁어 싹 출력해줌↓
java.lang.ArithmeticException: / by zero
at p2022_01_11.DivideZeroExceptionHandling2.main(DivideZeroExceptionHandling2.java:13)
* 예외 클래스
ArithmeticException : 0으로 나눌때
-> DivideZeroException어쩌고.java 확인
ArrayIndexOutOfBoundsException : 배열의 범위를 벗어났을때
NumberFormatException : 숫자외의 값을 사용할때
NullPointerException : 객체를 생성하지 않고 멤버변수나 메소드를 호출할때
IOException : 입출력에 관련된 예외
FileNotFoundException : 파일이 없을때 발생
SQLException : 데이터베이스 관련 예외