.
사용했을때 발생chap03-1 -> ExceotionEx.class
public class ExceotionEx {
public static void main(String[] args) {
// NullPointerException 발생
String data = null;
System.out.println(data.toString());
// ArrayIndexOutOfBoundsException 발생
String data1 = args[0];
String data2 = args[1]; // 인덱스값 없음
System.out.println("args[0] : " + data1);
System.out.println("args[1] : " + data2);
// NumberFormatException 발생
String data1 = "100";
String data2 = "a100";
int value1 = Integer.parseInt(data1); // 문자열 -> 정수로
int value2 = Integer.parseInt(data2); // 오류 발생부분
int result = value1 + value2;
System.out.println(data1 + " + " + data2 + " = " + result);
}
}
try - catch - finally
블록 이용해 예외 처리 코드 작성TryCatchEx.class
public class TryCatchEx {
public static void main(String[] args) {
// NullPointerException 예외처리
try { // try 내부 : 에러가 발생할 수 있는 코드
String data = null;
System.out.println(data.toString());
}
catch (Exception e) {
System.out.println("null인 빈 데이터에서는 toString() 메서드를 사용할 때 NullPointException 오류가 발생합니다.");
}
// ArrayIndexOutOfBoundsException 예외처리
try {
String data1 = args[0];
String data2 = args[1];
System.out.println("args[0] : " + data1);
System.out.println("args[1] : " + data2);
}
catch (Exception e) {
System.out.println("배열의 최대 index 범위를 넘어서 사용 : ArrayIndexOutOfBoundsException 오류 발생");
}
}
}
public class TryCatchEx {
public static void main(String[] args) {
// ㅡㅡㅡㅡㅡㅡㅡ[ 다중 catch ]ㅡㅡㅡㅡㅡㅡㅡ
try {
// NumberFormatException 발생
String data1 = "100";
String data2 = "a100";
int value1 = Integer.parseInt(data1); // 문자열 -> 정수로
int value2 = Integer.parseInt(data2); // 오류 발생부분
int result = value1 + value2;
System.out.println(data1 + " + " + data2 + " = " + result);
}
// 예외처리를 하나로 모두 처리하면 Exception을 사용하면 됨(Exception e)
// 지정한 예외 상황만 처리하고자 하면 해당 예외클래스를 사용해야함.
catch (NumberFormatException e) {
System.out.println("정수로 변환할 수 없습니다.");
System.out.println(e.getMessage());
System.out.println(e.getStackTrace());
// e.printStackTrace();
}
// 다중 catch
// 하나의 try 구문에서 여러개의 지정된 예외처리를 하고자 하면 catch를 여러개 사용할 수 있음.
catch (NullPointerException e) {
System.out.println("null을 사용하여 진행할 수 없습니다.");
}
// Exception 클래스는 모든 예외 클래스의 최상위 클래스이므로 여러개의 catch문을 사용할 경우 가장 마지막에 입력해야 함
catch (Exception e) {
System.out.println("알 수 없는 오류가 발생했습니다.");
}
}
}
|
로 연결import java.util.Scanner;
public class TryCatchEx {
public static void main(String[] args) {
// ㅡㅡㅡㅡㅡㅡㅡ[ finally ]ㅡㅡㅡㅡㅡㅡㅡ
// finally : try ~ catch 구문에서 예외가 발생하던 발생하지 않던, 무조건 실행되어야 하는 소스코드를 입력하는 부분을 finally라고 함
// 주로 외부 리소스(파일, 네트워크 연결 등) 사용 시 해당 리소스를 해제하기 위한 목적으로 많이 사용함
// (외부 리소스에는 가비지 컬렉터;비사용 메모리 자동 해제 작동X)
Scanner scanner = new Scanner(System.in);
try{
System.out.print("문자를 입력해주세요 : ");
String data = scanner.nextLine();
if (data.equals("")) {
data = null;
}
System.out.println("입력된 내용 : " + data.toString());
System.out.println("여기는 정상 실행 완료 후 실행되는 부분입니다.");
}
catch (NullPointerException e) {
System.out.println("여기는 예외 발생 시 실행되는 부분입니다.");
System.out.println("예외 이유 : " + e.getMessage());
}
finally {
System.out.println("여기는 무조건 실행되는 부분입니다.");
}
System.out.println("try ~ catch 가 완료된 후 실행되는 부분입니다.");
}
}
finally 예제
// 파일 생성을 통해 finally 테스트
File file = new File("c:\\test.txt");
String str = "java file write test";
try { // 파일 생성
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
writer.write(str);
writer.close();
}
catch (Exception e) {
System.out.println(e.getMessage());
System.out.println("파일 쓰기 사용 시 오류가 발생했습니다.");
}
System.out.println("파일 쓰기 완료");
System.out.println("\n----- 파일 읽기 시작 -----\n");
FileReader fr = null;
BufferedReader reader = null;
try {
fr = new FileReader("c:\\test.txt"); // 파일 객체를 읽어옴
reader = new BufferedReader(fr); // 파일 내용을 읽음
String tmp; // 글자 읽어오는부분이 저장됨
while ((tmp = reader.readLine()) != null) { // 한줄씩 읽어와서 tmp에 저장하고 , 그 부분이 null과 같지않으면 while문 실행
System.out.println("파일 내용 >> " + tmp);
}
}
catch (IOException e) {
System.out.println("파일 사용 시 오류가 발생했습니다.");
System.out.println(e.getMessage());
}
finally {
try {
if (reader != null) reader.close();
if (fr != null) fr.close();
}
catch (Exception e) {
}
}
System.out.println("\n파일 읽기 완료\n");
java.lang.AutoCloseable 인터페이스 예제
FileInputStream.class
public class FileInputStream implements AutoCloseable{
private String file;
public FileInputStream(String file) {
this.file = file;
}
public void read() {
System.out.println(file + "을 읽습니다.");
}
@Override
public void close() throws Exception {
System.out.println(file + "을 닫습니다.");
}
}
TryWithResourceEx.class
public class TryWithResourceEx {
public static void main(String[] args) {
// try-with-resources
try (FileInputStream fis = new FileInputStream("file.txt")) { // 선언과 동시에 객체 생성(try 구문 안에서만 사용되고 끝나면 삭제됨)
fis.read();
throw new Exception(); // 예외 강제 발생 ->
// FileInputStream가 AutoCloseable에서 상속받아 오버라이드한 close가 실행이 됨.
// finally를 사용하지 않아도 콘솔창에 file.txt을 닫습니다. 가 뜸.
}
catch (Exception e) {
System.out.println("예외처리 코드가 실행되었습니다.");
}
}
}
Calculator.class
public class Calculator {
public void sum(String a, String b) {
try {
int result = 0;
int num1 = Integer.parseInt(a);
int num2 = Integer.parseInt(b);
result = num1 + num2;
System.out.println("두 수의 합은 : " + result + "입니다.");
}
catch (Exception e) {
System.out.println("sum 함수에서 연산 시 오류가 발생했습니다.");
}
}
// 예외 발생 시 해당 메서드를 사용하는 곳으로 예외를 떠넘김
public void sub(String a, String b) throws Exception {
int num1 = Integer.parseInt(a); // 오류가 발생할 가능성이 있는 소스 1
int num2 = Integer.parseInt(b); // 오류가 발생할 가능성이 있는 소스 2
int result = num1 - num2;
System.out.println("두 수의 차는 : " + result + "입니다.");
}
}
ThrowsEx.class
public class ThrowsEx {
public static void main(String[] args) {
Calculator cal = new Calculator();
try {
cal.sum("10a", "20");
cal.sub("10a", "20"); // 실제 오류가 발생하는곳 : Calculator 클래스의 sub() 메소드
// sub() 메소드 뒤에 붙은 throws Exception: 오류 발생시 실행부로 가서 오류처리를 하라는 의미.
}
catch (Exception e) {
System.out.println("실행 시 오류가 발생했습니다.");
}
}
}
new ArrayList<String>();
ArrayListEx
package chap07;
import java.util.ArrayList;
import java.util.List;
public class ArrayListEx {
public static void main(String[] args) {
// 뒤의 <String> 는 생략가능.
ArrayList<String> list = new ArrayList<String>(); // <-- ArrayList 선언방법 1
// List 클래스가 ArrayList의 부모이므로 부모 타입의 변수에 자식 클래스 타입인
// ArrayList 객체를 대입하여 사용
// List<String> list2 = new ArrayList<String>(); // <-- ArrayList 선언방법 2
// list.size() : 현재 list의 길이
System.out.println("ArrayList 생성\nlist의 길이 : " + list.size());
list.add("HTML5");
list.add("CSS3");
list.add("Bootstrap5");
list.add("JS ES6");
list.add("React");
list.add("Java");
list.add("Servlet/JSP");
list.add("Spring framework");
list.add("Spring boot");
list.add("Database(mySql)");
list.add("Python");
// 일반 배열은 길이가 고정이지만 arrayList는 입력되는 데이터에따라 크기가 변함
System.out.println("\n데이터 추가 후 arrayList의 길이 확인 : " + list.size());
String str = list.get(5);
System.out.println("list의 5번 index의 값 : " + str);
System.out.println("리스트의 전체 내용 출력");
for (int i = 0; i < list.size(); i++) {
System.out.println("리스트" + i + "번 index의 값 : " + list.get(i));
}
System.out.println("리스트 안 데이터 삭제하기");
list.remove(5);
list.remove(2);
list.remove("JAVA");
System.out.println("\nremove 후 list 변수의 크기");
for (int i = 0; i < list.size(); i++) {
System.out.println("리스트 " + i + "번 index 값의 : " + list.get(i));
}
}
}
초보자는 잘 사용하지 않는 기능
Board.class
public class Board {
String subject;
String content;
String writer;
public Board(String subject, String content, String writer) {
this.subject = subject;
this.content = content;
this.writer = writer;
}
}
VectorEx.class
import java.util.List;
import java.util.Vector;
public class VectorEx {
public static void main(String[] args) {
List<Board> list = new Vector<Board>();
list.add(new Board("제목1", "내용1", "글쓴이1"));
list.add(new Board("제목2", "내용2", "글쓴이2"));
list.add(new Board("제목3", "내용3", "글쓴이3"));
list.add(new Board("제목4", "내용4", "글쓴이4"));
list.add(new Board("제목5", "내용5", "글쓴이5"));
list.remove(2);
list.remove(3);
for (int i = 0; i < list.size(); i++) {
Board board = list.get(i);
System.out.println(board.subject + "\t" + board.content + "\t" + board.writer);
}
}
}
Link<E> list = new LinkedList<E>();
import java.util.LinkedList;
import java.util.List;
public class LinkedListEx {
public static void main(String[] args) {
List<String> list1 = new LinkedList<>();
list1.add("0번");
list1.add("1번");
list1.add("3번");
System.out.println("list1의 0번 index : " + list1.get(0));
System.out.println("list1의 크기 : " + list1.size());
list1.set(0, "00번");
System.out.println("list1의 0번 index : " + list1.get(0));
list1.remove(2);
list1.remove(1);
System.out.println("list1의 크기 : " + list1.size());
}
}
Set<E> set = new HashSet<E>();
특징
HashSet 예제
HashSetEx.class
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class HashSetEx {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("JAVA");
set.add("JDBC");
set.add("Servlet/JSP");
set.add("JAVA"); // HashSet 에서는 중복 데이터 입력되면 자동 제거됨
set.add("Mybatis");
int size = set.size();
System.out.println("HashSet에 저장된 수 : " + size); // 5개 add 했지만 중복데이터 JAVA 1개 삭제됨
Iterator<String> iterator = set.iterator();
// iterator.hasNext() 사용하면 리소스/배열/set/map 어디에 적용하든 사용방법 동일하다는 장점이 있다.
while (iterator.hasNext()) { // hasNext() : 순서 없음 -> 반복문 사용 불가능. iterator 타입으로 만든 후 hasNext()로 하나씩 끄집어내는것.
// 더 이상 출력할 것이 없으면 false.
String element = iterator.next();
System.out.println("\t" + element);
}
// for (String item : set) <- 이런 형식으로 for문 사용도 가능
set.remove("JDBC");
set.remove("Mybatis");
System.out.println("HashSet에 저장된 수 : " + set.size());
iterator = set.iterator();
while (iterator.hasNext()) {
String element = iterator.next();
System.out.println("\t" + element);
}
set.clear();
if (set.isEmpty()) { // isEmpty 로 내부 데이터 비어있는지 확인
System.out.println("HashSet이 비어있음.");
}
}
}
문제 1) HashSet 을 사용하여 로또 번호 7개를 생성하는 프로그램을 작성하세요.
public class HashSetEx2 {
public static void main(String[] args) {
// 문제 1) HashSet 을 사용하여 로또 번호 7개를 생성하는 프로그램을 작성하세요.
Set<Integer> lotto = new HashSet<>();
int count = 0;
while (count < 7) {
int rnd = (int)(Math.random() * 45) + 1;
if (lotto.add(rnd)) {
count++;
if (lotto.size() == 7) {
break;
}
}
}
int rnd = (int)(Math.random() * 45) + 1;
Iterator<Integer> iter = lotto.iterator();
String number = "";
while (iter.hasNext()) {
int num = iter.next();
number += String.valueOf(num) + " ";
}
System.out.println(number);
System.out.println("\n\n");
Member.class
public class Member {
public String name;
public int age;
public Member(String name, int age) {
this.name = name;
this.age = age;
}
}
HashSetEx2
public class HashSetEx2 {
public static void main(String[] args) {
// 예제
Set<Member> set = new HashSet<>();
set.add(new Member("홍길동", 30));
set.add(new Member("홍길동", 30));
// 아래 코드 실행 결과 : 2.
// 중복인데 2개 인 이유 ? new 키워드를 쓰면 객체 생성 -> 주소값이 다름. 같아보이지만 주소값 다르면 다른 데이터로 인식
System.out.println("총 객체 수 : " + set.size());
// Member 클래스에서 equals(), hashCode() 오버라이드 추가 하면 결과값 1로 변함.
// Why?
// 동일 객체임을 판단하는 기준이 equals(), hashCode() 이기 때문.
}
}
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HashMapEx {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
System.out.println("HashMap 의 크기 : " + map.size()); // 결과 : 0
map.put("아이유", 30);
map.put("유인나", 32);
map.put("유재석", 50);
map.put("홍길동", 30);
map.put("이순신", 40);
System.out.println("HashMap 의 크기 : " + map.size()); // 결과 : 5
// 찾기
// map.get(키) : 해당 키가 가지고 있는 값 출력
System.out.println("\t홍길동 : " + map.get("홍길동"));
System.out.println();
Set<String> keySet = map.keySet();
Iterator<String> keyIter = keySet.iterator(); // 키를 모두 가져와서 iterator에 집어넣기
while (keyIter.hasNext()) {
String key = keyIter.next(); // 해당 key에 깃발 꽂기
int value = map.get(key); // get(key)로 키값에 맞는 값 가져오기
System.out.println("key : " + key + " \tvalue : " + value);
}
System.out.println();
// 삭제
if (map.containsKey("김종국")) { // 김종국이라는 키가 있으면
map.remove("김종국"); // 유재석이라는 키 삭제, 없으면 삭제 안함
}
// 삭제
map.remove("이순신");
map.remove("홍길동");
System.out.println("HashMap의 크기 : " + map.size());
map.clear();
System.out.println("HashMap의 크기 : " + map.size());
}
}
import java.util.Hashtable;
import java.util.Map;
import java.util.Scanner;
public class HashTableEx {
public static void main(String[] args) {
Map<String, String> map = new Hashtable<>();
map.put("spring", "12");
map.put("summer", "123");
map.put("fall", "1234");
map.put("winter", "12345");
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("아이디와 비밀번호를 입력해주세요.");
System.out.print("아이디 : ");
String id = scanner.nextLine();
System.out.print("비밀번호 : ");
String password = scanner.nextLine();
System.out.println();
if (map.containsKey(id)) { // containsKey : id 받은것에서 key를 찾는것
if (map.get(id).equals(password)) {
System.out.println("로그인 되었습니다.");
break;
}
else {
System.out.println("비밀번호가 일치하지 않습니다.");
}
}
else {
System.out.println("입력하신 아이디가 존재하지 않습니다.");
}
}
}
}
키와 값이 = 기호로 연결되어 있는 텍스트 파일
프로퍼티 예제
파일 생성 -> database.properties
driver=oracle.jdbc.OracleDriver
url=jdk:oracle:thin:@localhost:1521:orcl
username=scott
password=tiger
PropertiesEx.class
import java.io.FileReader;
import java.net.URLDecoder;
import java.util.Properties;
public class PropertiesEx {
public static void main(String[] args) throws Exception { // throws Exception 추가(파일 불러오는 것이기때문)
Properties properties = new Properties();
// Properties는 String 타입으로 고정되어있기때문에 <String> 생략
// 현재 클래스의 리스소를 가져온다(src폴더의 리소스) -> getResource(위치) : 파일의 위치 , getPath() : 파일 위치의 전체 경로 가져오기
String path = PropertiesEx.class.getResource("database.properties").getPath(); // 불러올 파일 위치 잡기
path = URLDecoder.decode(path, "utf-8"); // 한글이 있을때 안깨지게 utf-8 로 바꿔라
System.out.println("파일 경로 : " + path); // 결과값 : /D:/java505/intellij/chap07/out/production/chap07/database.properties
// load를 통해 파일 내용을 읽어옴
properties.load(new FileReader(path)); // 해당 파일 가져오기,
String driver = properties.getProperty("driver");
String url = properties.getProperty("url");
String username = properties.getProperty("username");
String password = properties.getProperty("password");
System.out.println("driver : " + driver);
System.out.println("url : " + url);
System.out.println("username : " + username);
System.out.println("password : " + password);
}
}