22.05.03

오혜원·2022년 5월 3일

java

목록 보기
14/18

Review - Exception

throw
: 예외를 발생시키는 명령어

package ch06;

public class Ch06Ex061 {
	public static void main(String[] args) {
		// 예외 객체 생성 / 활동 X
		new NullPointerException();
		System.out.println("after new NullPointerException");
		// 예외 객체 생성 및 활동 시작
		throw new StringIndexOutOfBoundsException();
		// error, throw 이하 코드는 실행 안됨
//		System.out.println("after new StringIndexOutOfBoundsException");
	}
}

출력 결과
after new NullPointerException
Exception in thread "main" java.lang.StringIndexOutOfBoundsException
at ch06.Ch06Ex061.main(Ch06Ex061.java:9)

throws
: 예외에 대해 try ~ catch 처리를 양도 / 전가
: 현재 예외가 발생한 메소드는 try ~ catch 처리를 하지 않으므로, 해당 메소드를 사용하는 곳이 있다면 try ~ catch 처리 필요

package ch06;

class Ch06Test1 {
	public void throwsTest() throws NullPointerException {
		throw new NullPointerException();
	}
}

public class Ch06Ex062 {
	public static void main(String[] args) {
		Ch06Test1 test = new Ch06Test1();
		
		try {
			test.throwsTest();
		} catch (NullPointerException e) {
			System.out.println("throws 표현이 있는 메소드는 내부에 예외 처리가 없다.");
		}
	}
}

출력 결과
throws 표현이 있는 메소드는 내부에 예외 처리가 없다.


return
: 일반적인 사용법 - 메소드에서 수행 결과를 메소드를 호출한 곳으로 전송
: 특별한 사용법 - return; 단독 사용 시, 메소드 종결


Collection API

Set
: interface - 객체 생성(new) 불가
: 자료 저장 구조에 대한 정의
: 순서 없음
: data 중복 저장 불가
: sub class - HashSet ...

Iterator
: data 저장 객체(List, Set)에 결합하여 data를 검색
→ 1. 데이터 간의 이동
→ 2. 데이터 유무 확인
→ 3. 데이터 추출
: 시작점은 before first, 종착점은 after last
: 데이터를 한 칸씩 이동하며 추출
: 최근 추세는 Generic을 기본적으로 사용

▷ 사용법
: hasNext() - 다음 데이터가 있는지 확인, 반환 type은 boolean
: next() - 데이터 간의 이동 후, 데이터 추출

package ch07;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Ch07Ex05 {
	public static void main(String[] args) {
		HashSet set1 = new HashSet();
		
		// HashSet의 데이터 저장
		set1.add(1);
		set1.add(3.14);
		set1.add('A');
		set1.add(true);
		set1.add("hello");
		System.out.println("set1 : " + set1);
		
		Iterator iter = set1.iterator();
		System.out.print("iter.next() : ");
		while (iter.hasNext()) {
			System.out.print(iter.next() + " ");
		}
	}
}

출력 결과
set1 : [1, A, 3.14, hello, true]
iter.next() : 1 A 3.14 hello true

HashSet
: 최근 추세는 Generic을 기본적으로 사용

▷ 기본 사용법
: add(data) - Set에 data 추가
: size() - Set에 저장된 data 개수
: contains(data) - Set에 data가 저장되어 있는지 확인, 반환 type은 boolean
: clone() - Set 복제, 결과 반환 type은 Object
: isEmpty() - Set이 비어있는지 확인, 반환 type은 boolean
: remove(data) - Set 내부에 저장된 data를 삭제
: clear() - Set 초기화

package ch07;

import java.util.HashSet;
import java.util.Set;

public class Ch07Ex04 {
	public static void main(String[] args) {
		HashSet set1 = new HashSet();
		
		// Set의 데이터 저장
		set1.add(1);
		set1.add(3.14);
		set1.add('A');
		set1.add(true);
		set1.add(true);		// 중복 저장 불가
		set1.add("hello");
		
		System.out.println("set1 : " + set1);
		
		// Set에 저장된 데이터 개수
		System.out.println("set1.size() : " + set1.size());
		
		// Set에 특정 data가 저장되어 있는지 확인
		System.out.println("set1.contains(3.14) : " + set1.contains(3.14));
		
		// Set 복제
		Object obj = set1.clone();
		HashSet set2 = (HashSet) obj;
		System.out.println("set2 : " + set2);
		
		// Set이 비어있는지 확인
		System.out.println("set2.isEmpty() : " + set2.isEmpty());
		
		// Set의 data 삭제
		set2.remove('A');
		set2.remove(true);
		System.out.println("after set2.remove A, true : " + set2);
		
		// Set 초기화
		set2.clear();
		System.out.println("after set2.clear() : " + set2);
	}
}

출력 결과
set1 : [1, A, 3.14, hello, true]
set1.size() : 5
set1.contains(3.14) : true
set2 : [1, A, hello, 3.14, true]
set2.isEmpty() : false
after set2.remove A, true : [1, hello, 3.14]
after set2.clear() : []

Map
: interface - 객체 생성(new) 불가
: 자료 저장 구조에 대한 정의
: {key, value} 한 쌍으로 저장 (이름 - 값)
: key에 따라 저장, key에 따라 출력하므로 순서 불필요
: key의 중복 저장 불가 / value의 중복 허용 (key가 같은 경우 마지막 value 값 저장)
: sub class - HashMap ...

HashMap
: 최근 추세는 Generic을 기본적으로 사용

▷ 기본 사용법
: put(key, value) - key에 value 저장
: size() - Map에 저장된 data 개수 파악
: keySet() - Map에 저장된 key
: get(key) - key에 저장된 value 추출
: clone() - Map 복제, 결과 반환 type은 Object
: isEmpty() - Map이 비어있는지 확인, 반환 type은 boolean
: remove(key) - Map에 저장된 key와 value 삭제
: clear() - Map 초기화

package ch07;

import java.util.HashMap;

public class Ch07Ex03 {
	public static void main(String[] args) {
		HashMap map1 = new HashMap();
		map1.put("first", 1);
		map1.put("second", 3.14);
		map1.put("third", 'A');
		map1.put(4, true);
		map1.put(4, false);
		map1.put(5, "hello");
		map1.put(6, 3.14);
		
		// Map에 저장된 data 개수 파악
		System.out.println("map1.size() : " + map1.size());
		System.out.println("map1 : " + map1);
		
		// Map에 저장된 key
		System.out.println("map1.keySet() : " + map1.keySet());
		// HashMap에 저장된 value
		System.out.println("map1.values() : " + map1.values());
		
		// key에 저장된 value 추출
		System.out.println("map1.get(third) : " + map1.get("third"));
		
		// Map 복제, 반환 type은 Object
		Object obj = map1.clone();
		HashMap map2 = (HashMap) obj;
		System.out.println("map2 : " + map2);
		
		// Map이 비어있는지 확인
		System.out.println("map2.isEmpty() : " + map2.isEmpty());
		
		// Map data 삭제
		map2.remove("third");
		map2.remove(5);
		System.out.println("after map2.remove thrid, 5 map2 : " + map2);
		
		// Map 초기화
		map2.clear();
		System.out.println("after map2.clear() map2 : " + map2);
	}
}

출력 결과
map1.size() : 6
map1 : {third=A, 4=false, 5=hello, 6=3.14, first=1, second=3.14}
map1.keySet() : [third, 4, 5, 6, first, second]
map1.values() : [A, false, hello, 3.14, 1, 3.14]
map1.get(third) : A
map2 : {third=A, 4=false, 5=hello, 6=3.14, first=1, second=3.14}
map2.isEmpty() : false
after map2.remove thrid, 5 map2 : {4=false, 6=3.14, first=1, second=3.14}
after map2.clear() map2 : {}

List
: interface - 객체 생성(new) 불가
: 자료 저장 구조에 대한 정의
: 순서에 따라 저장, 순서에 따라 출력 (index)
: 저장 내용의 중복 허용
: 길이 개념은 size()
: 저장 index는 0부터 시작, size()-1 에서 종료
: sub class - ArrayList, LinkedList, Vector ...

Enumeration
: Iterator와 동작 방식이 동일
: 데이터 저장 객체와 결합, 검색의 역할을 수행

▷ 사용법
: hasMoreElements() - 다음 데이터가 있는지 확인, 반환 type은 boolean
: nextElements() - 데이터 간의 이동 후, 데이터 추출

package ch07;

import java.util.Enumeration;
import java.util.Vector;

public class Ch07Ex06 {
	public static void main(String[] args) {
		Vector vec1 = new Vector();
		
		vec1.add(1);
		vec1.add(3.14);
		vec1.add('A');
		vec1.add(true);
		vec1.add("hello");
		
		System.out.println(vec1);
		
		Enumeration enu = vec1.elements();
		
		System.out.print("vec1 : ");
		// before first에서 after last까지 검색
		while (enu.hasMoreElements()) {
			System.out.print(enu.nextElement() + "  ");
		}
	}
}

출력 결과
[1, 3.14, A, true, hello]
vec1 : 1 3.14 A true hello

ArrayList
: 최근 추세는 Generic을 기본적으로 사용

▷ 기본 사용법
: add(data) - List 내부에 저장
: size() - List의 길이
: get(index) - List 내부 index에 저장된 데이터 추출
: clone() - List 복제, 결과 반환 type은 Object
: toArray() - List를 Object[]로 변환
: isEmpty() - List가 비어있는지 확인, 반환 type은 boolean
: clear() - List 초기화
: indexOf(data) - List의 앞에서부터 data의 위치를 검색, 첫 위치를 반환
: lastIndexOf(data) - List의 뒤에서부터 data의 위치를 검색, 마지막 위치를 반환
: remove(index) - index 위치에 저장된 데이터 삭제
: remove(data) - List 내부에 저장된 data를 삭제

Object
: 모든 class의 최상위 class
→ 어떤 class를 생성해도 자동 상속
→ Collection API는 Object의 HeteroGeneous Collection
→ ArrayList == Object[] 이므로, ArrayList.clone(), ArrayList.toArray()의 결과값이 Object[]

package ch07;

import java.util.ArrayList;

public class Ch07Ex02 {
	public static void main(String[] args) {
		// Generic Type
		ArrayList<String> listGStr = new ArrayList<String>();
		// error, String Type이 아님
//		listGStr.add(1);	
//		listGStr.add(3.14);
//		listGStr.add('A');
//		listGStr.add(true);
		listGStr.add("hi");
		
		ArrayList list1 = new ArrayList();
		list1.add(1);	// add : data 추가
		list1.add(3.14);
		list1.add('A');
		list1.add(true);
		list1.add("hi");
		
		// List 길이
		System.out.println("list1.size() : " + list1.size());
		
		// List 내부 데이터 추출
		System.out.println("list1.get(0) : " + list1.get(0));
		
		// List 복제, 반환 type은 Object
		Object obj = list1.clone();
		ArrayList list2 = (ArrayList) obj;
		
		// List의 배열 변환
		Object [] objArr = list2.toArray();
		System.out.println("objArr[4] : " + objArr[4]);
		
		// List가 비어있는지 확인
		System.out.println("list2.isEmpty() : " + list2.isEmpty());
		
		// List 초기화
		list2.clear();
		System.out.println("list2.clear() after list2.isEmpty() : " + list2.isEmpty());
		
		// List 내부 위치 검색
		System.out.println("list1.indexOf('A') : " + list1.indexOf('A'));
		System.out.println("list1.lastIndexOf(3.14) : " + list1.lastIndexOf(3.14));
		
		// List 내부 데이터 삭제
		System.out.println(list1);
		list1.remove(3);
		list1.remove(3.14);
		System.out.println(list1);
	}
}

출력 결과
list1.size() : 5
list1.get(0) : 1
objArr[4] : hi
list2.isEmpty() : false
list2.clear() after list2.isEmpty() : true
list1.indexOf('A') : 2
list1.lastIndexOf(3.14) : 1
[1, 3.14, A, true, hi][1, A, hi]

Vector

▷ 기본 사용법
: add(data) - Vector 내부에 저장
: addElement(data) - Vector 내부에 저장
: size() - Vector의 길이
: capacity() - Vector의 용량
: get(index) - Vector 내부 index에 저장된 데이터 추출
: contains(data) - Vector 내부에 data 값이 저장되어 있는지 확인
: elementsAt(index) - Vector 내부 index에 저장된 데이터 추출
: indexOf(data) - Vector의 앞에서부터 data의 위치를 검색, 첫 위치를 반환
: lastIndexOf(data) - Vector의 뒤에서부터 data의 위치를 검색, 마지막 위치를 반환
: firstElement() - 첫 번째 저장 data 검색
: lastElement() - 마지막 저장 data 검색
: remove(index) - index 위치에 저장된 데이터 삭제
: remove(data) - Vector 내부에 저장된 data를 삭제
: clone() - Vector 복제, 반환 type은 Object
: isEmpty() - Vector 내부에 data가 없는지 확인, 반환 type은 boolean
: toArray() - 배열로 변환
: clear() - Vector 초기화
: insertElementAt(data, index) - Vector의 index 위치에 data 저장
: setElementAt(setData, index) - Vector의 index 위치에 data를 setData로 수정
: remove(index/data) - Vector의 index 위치의 data / 저장된 data 삭제
: removeElementAt(index) - Vector의 index 위치 data 삭제
: removeElement(data) - Vector에 있는 data 삭제
: removeElementAll() - Vector에 있는 모든 data 삭제

package ch07;

import java.util.ArrayList;
import java.util.Vector;

public class Ch07Ex021 {
	public static void main(String[] args) {
		// Vector(n, m) - 특별한 배열, 처음 생성 시 n칸, 이후 추가로 더 필요할 때 m칸 생성
		Vector vec1 = new Vector(5, 5);
		
		vec1.add(1);
		vec1.addElement(3.14);
		System.out.println("vec1.size() : " + vec1.size());
		System.out.println("vec1.capacity() : " + vec1.capacity());
		
		vec1.add('A');
		vec1.add(true);
		vec1.add("hi");
		vec1.add("hi");
		
		System.out.println("vec1.size() : " + vec1.size());
		System.out.println("vec1.capacity() : " + vec1.capacity());
		
		System.out.println("vec1.get(3) : " + vec1.get(3));
		System.out.println("vec1.contains(\"hi\") : " + vec1.contains("hi"));
		System.out.println("vec1.elementsAt(1) : " + vec1.elementAt(1));
		System.out.println("vec1.indexOf(\"hi\") : "  + vec1.indexOf("hi"));
		System.out.println("vec1.lastIndexOf(\"hi\") : "  + vec1.lastIndexOf("hi"));
		System.out.println("vec1.firstElement() : " + vec1.firstElement());
		System.out.println("vec1.lastElement() : " + vec1.lastElement());
		
		Vector vec2 = (Vector) vec1.clone();
		System.out.println("vec2.isEmpty() : " + vec2.isEmpty());
		
		Object [] objArr = vec2.toArray();
		System.out.println("objArr[1] : " + objArr[1]);
		
		vec2.clear();
		System.out.println("after vec2.clear() : " + vec2);
		
		System.out.println("vec1 : " + vec1);
		vec1.insertElementAt(777, 2);
		System.out.println("vec1 : " + vec1);
		
		vec1.setElementAt("setElement", 2);
		System.out.println("vec1 : " + vec1);
		
		vec1.remove(3);
		vec1.remove(true);
		System.out.println("vec1 : " + vec1);
		
		vec1.removeElementAt(4);
		System.out.println("vec1 : " + vec1);
		
		vec1.removeElement("setElement");
		System.out.println("vec1 : " + vec1);
		
		vec1.removeAllElements();
		System.out.println("vec1 : " + vec1);
		System.out.println("vec1.size() : " + vec1.size());
		System.out.println("vec1.capacity() : " + vec1.capacity());
	}
}

**출력 결과
vec1.size() : 2
vec1.capacity() : 5
vec1.size() : 6
vec1.capacity() : 10
vec1.get(3) : true
vec1.contains("hi") : true
vec1.elementsAt(1) : 3.14
vec1.indexOf("hi") : 4
vec1.lastIndexOf("hi") : 5
vec1.firstElement() : 1
vec1.lastElement() : hi
vec2.isEmpty() : false
objArr[1] : 3.14
after vec2.clear() : []
vec1 : [1, 3.14, A, true, hi, hi]
vec1 : [1, 3.14, 777, A, true, hi, hi]
vec1 : [1, 3.14, setElement, A, true, hi, hi]
vec1 : [1, 3.14, setElement, hi, hi]
vec1 : [1, 3.14, setElement, hi]
vec1 : [1, 3.14, hi]
vec1 : []
vec1.size() : 0
vec1.capacity() : 10

Generic Class
: 일반적인 사용법은 다양한 데이터를 담을 수 있지만, 원하지 않은 데이터가 섞일 수 있는 의도치 않은 상황 발생 가능
→ Generic Type 탄생 배경
: Generic Type - 저장할 수 있는 형태를 제한한 용법

▶다른 글에서 보충


override

: Object를 상속받아 사용자 정의의 toString()과 equals() 작성 가능
→ 모든 class의 최상위 class - Object

package ch07;

// Object 상속으로 사용자 정의 toString()과 equals() 생성

class Ch07MyClass {
	String compareStand;
	
	public Ch07MyClass() {}
	
	public Ch07MyClass(String str) {
		compareStand = str;
	}
	
	// equals() 메소드를 override > 사용자 정의의 비교문 작성 가능
	@Override
	public boolean equals(Object obj) {
		Ch07MyClass tmp = (Ch07MyClass) obj;
		
		return (this.compareStand == tmp.compareStand);
	}
	
	// toString() 메소드를 override > 사용자 정의의 메세지 출력문 작성 가능
	@Override
	public String toString() {
		
		return "객체에 대한 안내문입니다.\n\"" + compareStand + "\"가 저장된 데이터입니다.\n감사합니다.";
	}
}
public class Ch07Ex07 {
	public static void main(String[] args) {
		Ch07MyClass test1 = new Ch07MyClass("hello");
		Ch07MyClass test2 = new Ch07MyClass("hello");
		Ch07MyClass test3 = new Ch07MyClass("hello?");
		
		System.out.println("test1.equals(test2) : " + test1.equals(test2));
		System.out.println("test1.equals(test3) : " + test1.equals(test3));
		System.out.println("test1.toString()");
		System.out.println(test1.toString());
	}
}

출력 결과
test1.equals(test2) : true
test1.equals(test3) : false
test1.toString()
객체에 대한 안내문입니다.
"hello"가 저장된 데이터입니다.
감사합니다.


AWT

: 글 작성

◆ Ch10Test4WriteGUIRe.java

package ch10.ch10test;

import java.awt.Button;
import java.awt.Frame;
import java.awt.Label;
import java.awt.TextArea;
import java.awt.TextField;

import ch10.WindowAdapterObject;

public class Ch10Test4WriteGUIRe {
	
	Frame frm;
	TextField tf1, tf2;
	TextArea ta;
	Label lb1, lb2, lb3;
	Button btn;
	Ch10Test4WriteEventRe event;
	
	public Ch10Test4WriteGUIRe() {
		frm = new Frame();
		tf1 = new TextField();
		tf2 = new TextField();
		ta = new TextArea();
		lb1 = new Label("Title");
		lb2 = new Label("Writer");
		lb3 = new Label("Content");
		btn = new Button("Save");
		event = new Ch10Test4WriteEventRe(tf1, tf2, ta);
	}
	
	public void makeGUI() {
		frm.setSize(300, 350);
		frm.setLayout(null);
		frm.setVisible(true);
		
		frm.add(lb1);	frm.add(lb2);	frm.add(lb3);
		frm.add(tf1);	frm.add(tf2);	frm.add(ta);	frm.add(btn);
		
		lb1.setBounds(25, 40, 40, 20);
		tf1.setBounds(70, 40, 200, 20);
		lb2.setBounds(25, 70, 40, 20);
		tf2.setBounds(70, 70, 200, 20);
		lb3.setBounds(25, 100, 60, 20);
		ta.setBounds(25, 130, 250, 170);
		btn.setBounds(225, 310, 50, 20);
		setEvent();
	}
	
	public void setEvent() {
		frm.addWindowListener(new WindowAdapterObject());
		btn.addActionListener(event);
	}
	
}

◆ Ch10Test4WriteEventRe.java

package ch10.ch10test;

import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

public class Ch10Test4WriteEventRe implements ActionListener{
	TextField tf1, tf2;
	TextArea ta;
	
	ArrayList<BoardRe> list = new ArrayList<BoardRe>();

	public Ch10Test4WriteEventRe(TextField tf1, TextField tf2, TextArea ta) {
		this.tf1 = tf1;
		this.tf2 = tf2;
		this.ta = ta;
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		String cmd = e.getActionCommand();
		
		if (cmd.equals("Save")) {
			BoardRe board = new BoardRe(tf1.getText(), tf2.getText(), ta.getText());
			list.add(board);
			System.out.println(list);
			
			tf1.setText("");
			tf2.setText("");
			ta.setText("");
		}
	}

}

◆ Ch10Test4WriteMainRe.java

package ch10.ch10test;

public class Ch10Test4WriteMainRe {
	public static void main(String[] args) {
		Ch10Test4WriteGUIRe write = new Ch10Test4WriteGUIRe();
		write.makeGUI();
	}
}

◆ BoardRe.java

package ch10.ch10test;

public class BoardRe {
	String title;
	String writer;
	String content;

	public BoardRe(String title, String writer, String content) {
		this.title = title;
		this.writer = writer;
		this.content = content;
	}
	
	@Override
	public String toString() {
		return "제목 : " + title + ", 작성자 : " + writer + ", 내용 : " + content;
	}
}

출력 결과

[제목 : a, 작성자 : b, 내용 : cccc],
[제목 : a, 작성자 : b, 내용 : cccc, 제목 : d, 작성자 : e, 내용 : fff]

0개의 댓글