메소드로부터 값을 전달받는 방법
1. return
2. 멤버필드 활용
3. 예외 객체의 메시지
예외사항 처리를 활용한 메시지(문자열) 전송
Exception 클래스를 상속받아 새로운 예외사항 객체를 만들 수 있는데, 이 객체에 메시지를 담아서 던지면(throw) 메시지를 전달하는데 활용할 수 있다.
throw 명령어 - 예외 인스턴스를 전송하는 명령어
public class ThrowExceptionEx {
public static void main(String[] args) {
int res = 0;
String rstr = null;
try {
res = method1(10, 0);
rstr = "결과 : " + res;
} catch (MessageException e) {
rstr = e.getMessage();
}
System.out.println(rstr);
try {
ecMethode();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
static int method1(int a, int b) throws MessageException {
int r = 0;
try {
r = a / b;
} catch (Exception e) {
throw new MessageException("0으로 나눌 수 없습니다.");
}
return r;
}
static void ecMethode() throws Exception {
// 예외사항 인스턴스 생성 시 메시지를 삽입
Exception ex = new Exception("보낼 메세지");
// 예외사항 전송
throw ex;
}
}
// 상속
// 메시지 전송을 목적으로 하는 예외객체(예외가 아님)
class MessageException extends Exception {
public MessageException(String msg) {
super(msg);
}
}
Collection Framework(CF, 컬렉션 프레임워크)
Collection : 데이터 처리용 여러 객체를 모아 놓은 것(최상위 인터페이스)
Framework : 정형화된 프로그래밍 도구 = 라이브러리
java.util 패키지 소속 클래스 및 인터페이스 집합
핵심 인터페이스
1. List : 순서가 있는 객체의 집합을 정의하기 위한 인터페이스
순서로 구별되기 때문에 중복을 허용한다.
구현클래스 - ArrayaList, LinkedList, Stack, Vector, Queue 등
2. Set : 순서가 없이 모아놓은 객체의 집합을 정의하기 위한 인터페이스.
중복을 허용하지 않는다. 마지막 입력값으로 덮어쓴다.
구현클래스 - (순서가 없기 때문에 구별하기 위해서 해시함수 이용) HashSet, TreeSet 등
3. Map : 키 key와 값 value의 쌍으로 구성되는 데이터 집합을 정의하기 위한 인터페이스(사전형태)
키는 중복을 허용하지 않으나, 값을 중복을 허용.
구현클래스 - HashMap, TreeMap, HashTable(표형태), Properties 등
예) 이미 완성되어 있는 클래스, 어떤 데이터를 넣을지 알 수 없지만 클래스를 만들 수 있다.
추상화 어떤 것이 될지 모르지만 만드는 것이 비슷, 다형성x
실제로 처리되어야 할 데이터의 형태로 바뀌어야 하기 때문에 제네릭스를 사용
ArrayLIst<String> strArry = new ArrayList<>(); 문자열 저장
ArrayList<Integer> intArray = new ArrayList<>(); 정수 저장
ArrayList<Object> objArray = new ArrayList<>() 뭐든지 저장 가능
제네릭스(Generics)
클래스 코드 작성 시 자료형을 지정하지 않고, 컴파일(클래스 사용) 시 자료형을 체크하여 지정하는 기능
장점 : 객체 자료형의 안정성을 높이고, 형 변환의 번거로움을 줄여준다.
import java.util.ArrayList;
public class GnericsEx {
public static void main(String[] args) {
Book b1 = new Book();
b1.name = "우동 한 그릇";
b1.price = 10000;
Cloth c1 = new Cloth();
c1.brand = "나이키";
c1.size = "M";
c1.kind = "티셔츠";
Box box1 = new Box();
box1.setItem(b1); // 책 상자
Box box2 = new Box();
box2.setItem(c1); // 옷 상자
// 여기는 다른 메소드라고 가정
// 책을 꺼내서 사용
Object obj = box1.getItem();
if(obj instanceof Book){
// 형변환하는 것과 동일
Book b2 = (Book) obj;
} else if(obj instanceof Cloth){
Cloth c2 = (Cloth) obj;
}
//-------------------------
//제네릭스 박스를 이용, 형변환을 하지 않아도 사용 가능
Gbox<Book> box3 = new Gbox<>();
Gbox<Cloth> box4 = new Gbox<>();
box3.setItem(b1);
box4.setItem(c1); // 옷만 가능, 책X
Book b3 = box3.getItem();
Cloth c3 = box4.getItem();
ArrayList<Book> bList = new ArrayList<>();
bList.add(b1);
}
}
// Object를 상속 받음
class Book {
String name;
int price;
}
class Cloth {
String brand;
String size;
String kind;
}
// 다형성을 활용하여 어떤 인스턴스라도 저장 가능한 객체 생성
class Box {
private Object item;
public Object getItem() {
return item;
}
public void setItem(Object item) {
this.item = item;
}
}
// 제네릭스를 활용한 Box 클래스
class Gbox<T> {
private T item;
public T getItem(){
return item;
}
public void setItem(T item){
this.item = item;
}
}
각 인터페이스 별 핵심 클래스(보편적으로 많이 사용하는 클래스)
1. ArrayList - 배열 형식으로 저장하는 객체 목록 클래스, 순서가 존재, 중복된 객체 저장 가능
2. HashSet - 해시 코드를 사용하여 객체를 배치, 순서가 없음. 중복된 객체 저장 불가,
순차적으로 사용해야 할 경우 iterator(순서를 부여하는) 구조체로 변환
저장할 객체에 equals 메소드를 재정의(override)해야 한다.
equals 메소드 : Object 클래스의 추상 메소드
String에서는 equals로 문자열의 실제 값을 비교하는 데 사용
3. HashMap - 해시코드를 사용하여 객체를 배치, 키(숫자나 문자열)와 값(객체)의 쌍으로 객체를 저장
Iterator 인터페이스
Collection의 순차적인 접근 방법을 제공하는 인터페이스
Set의 경우 비순차적으로 저장하기 때문에, Iterator를 활용
Iterator의 메소드
1) hasNext() : 처리할 원소가 있는지 여부 확인, 처리할 원소가 있으면 true, 없으면 false(While에서 활용)
2) next() : 해당 순번의 원소를 가져오는 메소드
3) remove() : 가져온 원소를 삭제
package setex;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class HashSetEx {
public static void main(String[] args) {
// 정수형 집합
Set<Integer> iSet = new HashSet<>();
// 집합에 데이터 입력 : add(값)
iSet.add(1);
iSet.add(2);
iSet.add(3);
iSet.add(4);
iSet.add(5);
System.out.println(iSet);
System.out.println("원소 개수 : " + iSet.size());
// 순서대로 출력되기도 하나 보장이 되지 않는다.
for(int a : iSet){
System.out.print(a + " ");
}
// 집합의 데이터 유무 확인 메소드 : contains();
boolean b = iSet.contains(3);
System.out.println("\n" + b);
// 순서가 없기 때문에 실행불가
// int i = iSet.indexOf(3);
// 원소의 삭제 : remove(데이터);
// 실제 값을 넣어서 지움
iSet.remove(5);
System.out.println(iSet);
// Set 원소의 순자적인 사용 : iterator로 변환 후 사용
Iterator<Integer> iter = iSet.iterator();
while (iter.hasNext()){
int n = iter.next();// 원소 꺼내기
System.out.print(n + " ");
if(n == 3){
iter.remove();// 원소 제거
break;
}
}
System.out.println("\n" + iSet);
}
}
'공부기록' 카테고리의 다른 글
4월 24일 Java - StringBuffer, 날짜, 시간처리 (1) | 2023.04.24 |
---|---|
4월 24일 Java - Collection Framework, Iterator, 기타 객체들 (0) | 2023.04.24 |
4월 20일 Java - 예외 처리 (1) | 2023.04.20 |
4월 20일 Java - 내부클래스, 익명클래스, GUI (0) | 2023.04.20 |
4월 14일 - 주소록 프로그램 구현 (0) | 2023.04.14 |