1. 예외 처리 (Exception Handling)
예외처리란, 프로그램 실행 시 발생할 수 있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는 것이다.
예외 처리의 목적은 예외의 발생으로 인한 실행 중인 프로그램의 갑작스런 비정상적인 동작을 막고, 에러를 잡아
복구를 시도하거나 회피하는 식으로 처리를 하여 프로그램이 정상적인 실행상태를 유지할 수 있도록 하는 것이다.
💡 Try - Catch문
Tty 블록에는 예외 발생 가능 코드가 위치하고 만일 코드에 오류가 발생되면, 오류 종류(예외 클래스)에 맞는 Catch문으로 가서 Catch 블록 안에 있는 코드를 실행시킨다.
만일 오류가 발생하지 않으면 Catch문은 실행하지 않는다.
Catch 문을 보면 예외 클래스 타입 변수 e가 선언되어 있다. 만일 Try문에서 예외가 발생하면 그 예외에 맞는 예외클래스가 Catch문에 아규먼트로 선언되어 있으면 실행되어 옳지 못한 동작에 대해서 대비를 할 수 있다.
💡 Try - Catch - Finally문
위에서 봤듯이 프로그램 수행 도중 예외가 발생하면 프로그램이 중지되거나 예외 처리에 의해 Catch 구문이 실행된다. 하지만 어떤 예외가 발생하더라도 반드시 실행되어야 하는 부분이 있어야 한다면 Finally 문으로 처리가 가능하다.
💻 예시 코드
만일 어떠한 메소드를 반드시 실행시켜야 하는데 중간에 에러가 나버리면
Catch문으로 점프해 버려 결국 뒤의 코드는 실행을 못하게 된다.
Sample sample = new Sample();
try {
sample.addSample(100);
sample.printSample(); // 만일 이 메서드를 실행하는데 에러가 나버리면
sample.shouldBeRun(); // 바로 catch로 넘어가 버리고 결국 이 코드는 실행되지 않는다.
} catch (Exception e) {
// ...
}
이럴 경우 Finally문으로 처리해 주면 Try 문장 수행 중 예외발생 여부에 상관없이
무조건 실행되도록 지정해 줄 수 있다.
Sample sample = new Sample();
try {
sample.addSample(100);
sample.printSample(); // 만일 이 메서드를 실행하는데 에러가 나버리면
} catch (Exception e) {
// ... catch 문의 코드가 실행되고
} finally {
sample.shouldBeRun(); // 에러가 나든 안나든 무조건 finally 문은 실행된다.
}
심지어 메소드의 return문이 있어도 일단 Finally의 코드를 실행하고 리턴한다.
예외가 발생한 경우에는 Try - Catch - Finally의 순서로 실행되고
예외가 발생하지 않는 경우에는 Try - Finally의 순으로 실행된다고 보면 된다.
💻 예제 코드
package pack04;
import java.io.FileNotFoundException;
import java.io.FileReader;
import javax.sound.sampled.SourceDataLine;
// 예외 처리 : 키보드, 파일, 네트워크, DB 연동 처리 등 외부와 접속을 통한 프로그래밍 작업 중
// 예상치 못한 에러가 발생할 수 있는데 이와 같은 경우에 주로 사용하고, try ~ catch 구문을 사용한다.
public class Ex26_Try {
public void testMethod() {
System.out.println("testMethod");
try {
int a[] = {1, 2, 3};
System.out.println("배열 요소 값 출력 : " + a[0]);
System.out.println("배열 요소 값 출력 : " + a[3]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("testMethod 오류 : " + e);
}
}
// public static void main(String[] args) throws Exception{
public static void main(String[] args) {
try {
// 보조기억장치의 파일 읽기
FileReader fr = new FileReader("c:/Workstation/Acorn/aa.txt");
// 객체가 인스턴스의 주소를 갖지 않은 경우
// Ex26_Try try1 = null;
Ex26_Try try1 = new Ex26_Try();
try1.testMethod();
int re = 10/0;
System.out.println("re : " + re);
} catch (FileNotFoundException e) {
System.out.println("해당 파일이 없어요");
} catch (NullPointerException e) {
// e2.printStackTrace();
System.out.println("객체 변수 에러 원인은" + e.getMessage());
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("배열 처리 중 에러 : " + e);
} catch (ArithmeticException e) {
System.out.println("연산 오류 : " + e);
} catch (Exception e) {
System.out.println("연산 오류 : " + e);
} finally {
System.out.println("에러와 상관 없이 반드시 출력");
}
System.out.println("프로그램 종료");
}
}
💻 결과
testMethod
배열 요소 값 출력 : 1
testMethod 오류 : java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
연산 오류 : java.lang.ArithmeticException: / by zero
에러와 상관 없이 반드시 출력
프로그램 종료
☕ 자바 예외 처리(try catch) 문법 & 응용 정리
예외(Exception) 처리하기 예외 처리(exception handling) 이란, 프로그램 실행 시 발생할 수 있는 예기치 못한 예외의 발생에 대비한 코드를 작성하는것이다. 자바의 코드를 예외 처리를 한다고 해서 프
inpa.tistory.com
- 출처 : inpa tistory
2. Collection
자바에서 Collection이란 데이터의 집합, 그룹을 의미하며 JCF(Java Collections Framework)는 이러한 데이터, 자료구조인 Collection과 이를 구현하는 클래스를 정의하는 Interface를 제공한다.
다음은 자바 Collection 프레임워크의 상속구조이다.
Collection Interface는 Set, List, Queue로 크게 3가지 상위 Interface로 분류할 수 있다.
Map의 경우 Collecion Interface를 상속받고 있지는 않지만 Collection으로 분류된다.
ArrayList, HashMap, Hashtable을 주로 쓴다.
💡 Collection Interface의 특징
인터페이스 | 구현클래스 | 특징 |
Set | HashSet TreeSet |
순서를 유지하지 않는 데이터의 집합으로 데이터의 중복을 허용햐지 않는다. |
List | LinkedList Vector ArrayList |
순서가 있는 데이터의 집합으로 데이터의 중복을 허용한다. |
Map | HshTable HashMap TreeMap |
키(Key), 값(Value)의 쌍으로 이루어진 데이터의 집합으로 순서는 유지되지 않으며 키(Key)의 중복을 허용하지 않으나, 값(Value)의 중복은 허용한다. |
Queue | LinkedList PriorityQueue |
List와 유사하다. |
💡 Set Interface
- Set 인터페이스는 중복을 허용하지 않는 데이터 집합을 관리한다. 즉, 같은 요소가 두 번 이상 포함될 수 있다.
- HashSet, LinkedHashSet, TreeSet 등이 Set Interface를 구현한 대표적인 클래스들이다.
💻 예제 코드
package pack04;
import java.util.HashSet;
import java.util.Iterator;
// Collection : 다수의 객체를 담을 수 있는 집합형 자료구조
public class Ex27_SetTest {
public static void main(String[] args) {
// set류의 HashSet으로 연습 : 중복 불가, 순서 X
// Ex27_SetTest test = new Ex27_SetTest();
// HashSet<Ex27_SetTest> list = new HashSet<Ex27_SetTest>();
// list.add(1);
HashSet<String> list = new HashSet<String>();
list.add("lee");
list.add("lee");
list.add("lee");
list.add("park");
list.add("hong");
// list.remove("park"); // 부분적인 삭제
// list.clear(); // 모두 삭제
System.out.println("크기 : " + list.size());
for(Object obj:list) {
System.out.println(obj);
}
System.out.println();
// Iterator(반복자) : 개발자가 컨테이너, 특히 리스트를 순회할 수 있게 해주는 객체이다.
Iterator iter = list.iterator();
while(iter.hasNext()) {
String ss = (String)iter.next();
System.out.println(ss);
}
}
}
🚀 Iterator란?
자바의 컬렉션 프레임워크에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화한 것이다.
컬렉션 프레임워크란 데이터를 저장하는 클래스들을 표준화한 설계이다.
컬렉션 프레임워크는 아래 그림과 같이 데이터를 저장하는 구조에 따라 3가지 인터페이스로 구성된다.
💡 List Interface
- List Interface는 순서가 있는 컬렉션을 관리하며, 데이터의 중복을 허용한다.
사용자는 데이터의 정확한 위치를 지정하여 저장하고 검색할 수 있다. - ArrayList, LinkedList, Vector 등이 List Interface를 구현한 클래스이다.
💻 예제 코드
package pack04;
import java.util.ArrayList;
import java.util.Iterator;
public class Ex28_ListTest {
public static void main(String[] args) {
// List류의 ArrayList로 연습 : 중복 가능, 순서O
ArrayList<String> list = new ArrayList<String>();
list.add("lee");
list.add("lee");
list.add("lee");
list.add("park");
list.add("hong");
// list.remove("park"); // 특정해서 지울 수도 있지만, 순서로 지울수도 있다.↓ (11줄의 lee를 지우며 크기는 4로 변경됨.)
list.remove(0); // list는 가능, set은 불가
// list.clear();
System.out.println("크기 : " + list.size());
for(Object obj:list) {
System.out.println(obj);
}
System.out.println();
// Iterator(반복자) : 개발자가 컨테이너, 특히 리스트를 순회할 수 있게 해주는 객체이다.
Iterator iter = list.iterator();
while(iter.hasNext()) {
String ss = (String)iter.next();
System.out.println(ss);
}
}
}
💡 Map Interface
- Map Interface는 키(Key)와 값(Value)의 한 쌍으로 데이터를 관리한다.
각 키는 유일해야 하며, 하나의 키는 정확히 하나의 값을 매핑한다. - HashMap, TreeMap, LinkedHashMap 등이 있다.
💻 예제 코드
package pack04;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
public class Ex29_MapTest {
public static void main(String[] args) {
// Map류의 HashMap으로 연습 : 자료를 키와 값으로 저장한다. 검색이 편리하다.
HashMap<String, String> list = new HashMap<String, String>();
list.put("1", "lee"); // 키는 중복되면 x, 벨류는 중복 가능
list.put("2", "kim");
list.put("3", "kim");
list.put("4", "han");
list.put("5", "choi");
System.out.println("크기 : " + list.size()); // 크기 : 5
System.out.println(list.containsKey("2")); // false
System.out.println(list.containsKey("7")); // false
System.out.println(list.containsValue("han")); // true
System.out.println();
Set set = list.keySet();
Iterator iter = set.iterator();
while (iter.hasNext()) {
String ss = (String) iter.next();
System.out.println(ss); // 키 찍기
System.out.println(list.get(ss)); // 값 출력
}
}
}
🚀 Generic이란?
Class와 Interface, 그리고 Method를 정의할 때 타입(Type)을 파라미터로 사용할 수 있게 한다.
이를 통해 컴파일 시점에 타입 안정성을 제공하며, 타입 캐스팅 문제를 줄일 수 있다.
💡 Generic의 장점
- 타입 안전성(Type Safety) : 잘못된 타입이 사용되는 것을 컴파일 단계에서 방지하여,
런타임에 발생할 수 있는 ClassCastExceprion을 예방할 수 있다. - 코드 재사용성 : 하나의 코드를 다양한 타입에 재사용할 수 있기 때문에 코드 중복을 줄이고,
유지보수성을 향상시킬 수 있다.
💻 예시 코드
ArrayList<Integer> list = new ArrayList<>();
정수 리스트를 생성하고, 이 리스트에는 Integer 타입의 객체만 추가할 수 있다.
[Java]이터레이터(Iterator) 란?
Iterator는 자바의 컬렉션 프레임워크에서 컬렉션에 저장되어 있는 요소들을 읽어오는 방법을 표준화한 것이다. 컬렉션 프레임워크란 데이터를 저장하는 클래스들을 표준화한 설계이다. 컬렉션
thefif19wlsvy.tistory.com
- 출처 : thefif19wlsvy tistory
Java Generic 을 파헤쳐보자 - 활용편
Java Generic 시리즈 마지막 포스팅입니다. 이번에는 Java Generic 을 활용하는 여러 가지 상황들에 대해 살펴보겠습니다. 이번 포스팅에서도 개념편, 심화편 에서 사용했던 예제를 활용해보겠습니다.
dev.gmarket.com
- 출처 : dev.gmarket
[JAVA] Java 컬렉션(Collection) 정리
[JAVA] Java 컬렉션(Collection) 정리 ■ Java Collections Framework(JCF) Java에서 컬렉션(Collection)이란 데이터의 집합, 그룹을 의미하며 JCF(Java Collections Framework)는 이러한 데이터, 자료구조인 컬렌션과 이를 구
gangnam-americano.tistory.com
- 출처 : gangnam-americano tistory
3. Lombok
Lombok이란 여러 가지 @어노테이션 을 제공하고 컴파일 과정에서 자동으로 개발자가 원하는 메소드를 생성/주입 방식으로 동작하는 라이브러리이다. Lombok의 기능은 Model Class나 Entity같은 도메인 클래스 등에 반복되는 Getter, Setter, Equals, ToString 등의 메소드를 자동완성 시킬 수 있다.
💡 Lombok의 장점
- @어노테이션 기반의 코드 자동 생성을 통한 생산성을 향상시킨다.
- 반복되는 코드 다이어트를 통한 가독성 및 유지보수성을 향상시킨다.
- Getter, Setter 외에 빌더 패턴이나 로그 생성 등 다양한 방면으로 활용이 가능하다.
💻 예제 코드
package pack04;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Ex32_HaksaengDto {
private String name;
private int kor, eng, mat;
}
package pack04;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Ex32_DtoTest02 {
private ArrayList<Ex32_HaksaengDto> dtos = new ArrayList<Ex32_HaksaengDto>();
// 타입 맞추기!!
public void inputData(String[] datas) {
// System.out.println(datas[0]);
// "김밥,100,100,100" 이런 문자열을 콤마(,)를 기준으로 분리
/*
* StringTokenizer tokenizer = new StringTokenizer("kbs,mbc,sbs", ","); //
* (구분하고자 하는 대상, 구분할 문자?) String s1 = tokenizer.nextToken(); // 0번째 String s2 =
* tokenizer.nextToken(); // 1번째 String s3 = tokenizer.nextToken(); // 2번째
* System.out.println(s1 + " " + s2 + " " + s3);
*/
for(int i = 0; i <datas.length; i++) {
StringTokenizer tok = new StringTokenizer(datas[i], ","); // StringTokenizer datas의 i번째를 ","로 구분.
String ir = tok.nextToken(); // 김밥
int kor = Integer.parseInt(tok.nextToken()); // 100
int eng = Integer.parseInt(tok.nextToken()); // 100
int mat = Integer.parseInt(tok.nextToken()); // 100
Ex32_HaksaengDto dto = new Ex32_HaksaengDto(); // DTO 처리용 클래스
dto.setName(ir);
dto.setKor(kor);
dto.setEng(eng);
dto.setMat(mat);
// 생성자를 통해 값을 줄 수도 있다.
// Ex32_HaksaengDto dto = new Ex32_HaksaengDto(ir,kor, eng, mat);
dtos.add(dto); // dto를 여러개 담는 arraylist를 만듦.
}
}
public void displayData() {
for(Ex32_HaksaengDto hd:dtos) {
int tot = hd.getKor() + hd.getEng() + hd.getMat();
double avg = tot / 3.; // .을 붙여야 실수연산.
System.out.println(hd.getName() + ", 총점 : " + tot + ", 평균 : " + avg);
}
}
public static void main(String[] args) {
String[] datas = new String[3];
datas[0] = "김밥,100,100,100";
datas[1] = "주먹밥,80,75,88";
datas[2] = "비빔밥,77,88,80";
Ex32_DtoTest02 test02 = new Ex32_DtoTest02();
test02.inputData(datas);
test02.displayData();
}
}
💻 결과
김밥, 총점 : 300, 평균 : 100.0
주먹밥, 총점 : 243, 평균 : 81.0
비빔밥, 총점 : 245, 평균 : 81.6666666666666
[Java] Lombok이란? 및 Lombok 활용법
Java 언어를 이용해 개발을 하다 보면 기계적으로 작성해야 하는 코드들이 상당히 많다. 이번에는 기계적인 코드 작성을 자동화하여 코드 다이어트를 해주는 Java 필수 라이브러리 Lombok에 대해 알
mangkyu.tistory.com
- 출처 : mangkyu tistory
Lombok 롬복이란?
velog.io
- 출처 : java.log
4. StringTokenizer
StringTokenizer는 java.util 패키지에 속한 클래스로, 문자열을 특정 구분자(Delimiter)를 기준으로 여러 개의 토큰(Token) 으로 분리할 때 사용한다. 이 클래스는 간단한 문자열 파싱이 필요할 때 유용하며, 구분자로 여러 문자를 동시에 지정할 수 있다.
💡 StringTokenizer 사용법
- StringTokenizer 클래스의 인스턴스를 생성한다. 생성자는 분리할 전체 문자열과 사용할 구분자를 아규먼트로 받는다.
- hasMoreTokens() 메소드를 사용하여 토큰이 더 있는지 확인한다.
- nextToken() 메소드를 호출하여 다음 토큰을 가져온다.
💻 예시 코드
import java.util.StringTokenizer;
public class StringTokenizerExample {
public static void main(String[] args) {
String str = "apple,banana,orange";
StringTokenizer st = new StringTokenizer(str, ",");
while (st.hasMoreTokens()) {
System.out.println(st.nextToken());
}
}
}
예시문의 문자열 str의 apple,banana,orange는 콤마(,)를 구분자로 사용하여 각각의 과일 이름으로 분리된다.
💡 StringTokenizer의 주요 생성자와 메소드
📍 생성자
- StringTokenizer(String str)
기본 구분자(공백)를 사용하여 문자열 str을 토큰화한다. - StringTokenizer(String str, String delim)
문자열 str을 구분자 delim을 사용하여 토큰화한다. - StringTokenizer(String str, String delim, boolean returnDelims)
returnDelims가 true일 경우 구분자도 토큰으로 간주한다.
📍 메소드
- boolean hasMoreTokens()
다음 토큰이 있는지 확인한다. - String nextToken()
다음 토큰을 반환한다. - int countToken()
남아 있는 토큰의 수를 반환한다.
5. Token이란?
프로그래밍에서 데이터나 정보를 구분할 수 있는 단위로 사용되는 문자열 조각을 의미한다.
텍스트 데이터를 처리하거나 언어 구분 분석, 데이터 분리 등 다양한 컴퓨터 과학 분야에서 중요한 역할을 한다.
💡 Token의 역할 및 사용 사례
- 프로그래밍 언어 분석
컴파일러나 인터프리터가 소스 코드를 해석할 때, 코드는 우선 토큰으로 분리된다.
예를 들어 int a = 5; 라는 코드는 int, a, =, 5, ;와 같은 토큰들로 나뉜다. 각 토큰은 변수의 타입, 변수 이름,
할당 연산자, 값, 문장 종결자 등을 나타내는 역할을 한다. - 텍스트 처리
데이터를 분석하거나 처리할 때 특정 기호나 문자를 기준으로 데이터를 분리하는데 토큰이 사용된다.
문장을 단어로 분리하거나, CSV파일에서 각 데이터 값을 쉼표로 구분할 때 각 부분을 토큰으로 간주할 수 있다. - 보안 인증
토큰은 사용자 인증과 같은 보안 분야에서도 사용된다. 웹 서버와 클라이언트 간의 세션을 유지하기 위해
세션 토큰을 사용하거나, 사용자 인증 후 발급되는 접근 토큰을 통해 서버 리소스에 접근할 수 있게 된다.
💡 Token의 특징
- 독립성
각 토큰은 독립적인 의미를 갖는다.
프로그래밍 언어에서는 각 키워드, 연산자, 식별자 등이 독립적인 토큰으로 처리된다. - 재사용성
같은 토큰은 여러 위치에서 재사용될 수 있다.
예를 들어 '=' 토큰은 프로그램 내 여러 위치에서 할당 연산자로 사용될 수 있다.
[Java] StringTokenizer와 Split() 메서드 언제 써야할까?
우선 StringTokenizer에 대해 알아보자. java.util.StringTokenizer 클래스란? 긴 문자열을 지정된 구분자(delimiter)를 기준으로 토큰(token)이라는 여러 개의 문자열로 잘라내는 데 사용된다. 예) “100,200,300,4
velog.io
- 출처 : effirin.log
JAVA 정리
J A V A 1. 문자 집합 토큰(Token) 프로그래밍 언어에서 말하는 토큰이란 언어가 사용...
blog.naver.com
- 출처 : 이성원 님 naver blog
6. DTO, VO
DTO(Data Transfer Object)와 VO(Value Object)는 모두 자바와 같은 객체 지향 프로그래밍에서 사용되는 디자인 패턴의 일종이다. 이 두 패턴은 데이터를 효율적으로 전송하거나 사용하기 위해 데이터를 캡슐화하는 방법을 제공하지만, 목적과 사용 방법에 있어서 차이가 있다.
💡 DTO (Data Transfer Object)
DTO는 계층 간 데이터 교환을 위해 사용되는 객체이다. 특히 네트워크를 통한 데이터 전송, 비즈니스 로직과 데이터베이스 사이의 데이터 교환 등에 사용된다. DTO는 로직을 가지지 않으며, 순수하게 데이터 전송을 목적으로 하기 때문에 다양한 속성들과 그 속성들의 Getter/Setter 메소드만을 포함한다.
💡 VO (Value Object)
VO는 값 자체를 표현하는 객체로 사용된다. 주로 변경 불가능한 객체로 설계되어 한 번 생성된 후에는 그 상태가 변하지 않는다. VO는 데이터베이스의 테이블을 객체 지향적으로 표현할 때 자주 사용되며, 각각의 인스턴스는 독립적인 하나의 값을 의미한다. (ex : 돈, 날짜, 범위, 좌표 등)
📍DTO와 VO의 차이점
특징 | DTO | VO |
목적 | 데이터 전송 | 값을 표현 |
변경 가능성 | 변경 가능 단, Setter 존재 시에만. 비 존재시 불변 |
대부분 변경 불가능(Immutable) |
메소드 | 주로 Getter와 Setter | 비즈니스 메소드 포함 가능 일반적으로 Getter만 포함 |
사용 예시 | 서비스 계층과 표현 계층 사이의 데이터 전달 | 돈, 날짜 범위 같은 단일 값 표현 |
데이터 캡슐화 | 로직을 포함하지 않고 순수하게 데이터 전달에 초점 | 데이터와 관련된 로직을 캡슐화 할 수 있음 |
[Spring] DAO와 DTO의 차이 그리고 VO
서론 DAO와 DTO의 키워드에 대해서 알아보던 중 DTO에 대해서는 알고 있지만 DAO는 아무리 봐도 Repository 같은데 같은 개념인지 궁금해서 정리해 보게 되었습니다. 결론을 먼저 말씀드리면 Repository
dkswnkk.tistory.com
- 출처 : dkswnkk tistory
[JAVA] DAO, DTO, VO 개념, 차이
1. DAO(Data Access Object) 데이터베이스의 data에 접근하기 위한 객체이며 데이터베이스 접근을 하...
blog.naver.com
- 출처 : cjhol2107 naver blog
'에이콘아카데미 회고 > 5회차) 자바기반 풀스택 개발자 양성과정' 카테고리의 다른 글
JAVA, SQL) 15번째 회고 (0) | 2024.04.19 |
---|---|
JAVA) 14번째 회고 (0) | 2024.04.19 |
JAVA) 12번째 회고 (0) | 2024.04.16 |
JAVA) 11번째 회고 (0) | 2024.04.15 |
JAVA) 10번째 회고 (0) | 2024.04.13 |