자바에서 사용되는 유용한 클래스
String 클래스
문자열 조작을 위한 편리한 기능을 제공하는 클래스이다.
- String은 불변의 속성을 갖는다.
- 문자열 비교시에는 == 이 아닌 반드시 .equals를 사용한다.
- 문자열의 변경이 빈번한 경우 String 사용지 메모리 누수가 발생할 수 있어 주의해야 한다.
public class CharMain {
public static void main(String[] args) {
String str1 = "Java Programming";
String str2 = new String("Java Programming");
char[] charArr = {'J','A','V','A'};
String str3 = new String(charArr);
String str4 = "Java Programming";
System.out.println(str1.length()); // 16
System.out.println(str1.toUpperCase()); // JAVA PROGRAMMING
System.out.println(str1); // Java Programming
System.out.println(str1 == str2); // false
System.out.println(str1 == str4); // true
System.out.println(str1.equals(str2)); // true
String str6 = "Java";
String str7 = str6.concat(" Programming");
System.out.println(str6); // Java
System.out.println(str7); // Java Programming
}
}
* String클래스의 .concat()메서드와 StringBuilder클래스의 .append()메서드는 동일한 기능을 한다. 또한 java 9부터는 StringConcatFactroy클래스가 이용된다.
StringBuilder와 StringBuffer 클래스
- 두 클래스는 가변의 특징을 가진다.
- StringBuilder와 StringBuffer의 차이는 동기화 처리 여부이다. StringBuffer 클래스의 경우 대부분의 메서드에서 동기화 처리를 해주고 있다.
- 싱글스레드인 프로그램인 경우 StringBuilder 클래스를 사용하고, 멀티스레드 환경의 프로그램인 경우 StringBuffer 클래스를 사용하는 것이 유리하다.
public class CharMain {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("Java");
System.out.println(sb.capacity()); // 20
sb.append(" Programming Study");
System.out.println(sb.capacity()); // 42
System.out.println(sb); // Java Programming Study
}
}
Wrapper 클래스
int, double 등과 같은 기본타입(premitive data type)을 객체로 관리할 수 있도록 도와주는 클래스이다.
package staticEx;
public class Student {
private static int serialNum = 10000;
int studentID;
String studentName;
public Student() {
serialNum++;
studentID = serialNum;
}
}
예외 클래스
* 예외처리
- 예외클래스에는 최상위 클래스인 Throwable 클래스와 Throwable 클래스의 하위클래스인 Exception과 Error 클래스가 존재한다.
- Error 클래스는 매우 심각한 오류상황일때, Exception 클래스는 IOException와 RuntimeException으로 나뉜다. IOException을 Checked Exception이라 하며, RuntimeException을 Unchecked Exception이라 한다.
import java.io.InputStream;
public class ExceptionAssist {
public static void main(String[] args) {
// UnChecked Exception (RunTimeException)
// 예외처리가 없어도 상관없는 Exception
String str = null;
System.out.println(str.toString());
// NullPointException은 Unchecked Exception이다.
// Unchecked Exception은 예외처리를 하지 않아도 컴파일시에 문제가 없는 예외이다.
// Checked Exception (IOException)
// 반드시 예외처리가 필요한 Exception
InputStream in = System.in;
in.read();
// unreported exception은 Checked Exception이다.
// Checked Exception은 반드시 예외처리를 해주어야 하는 Exception이다.
}
}
~ unreported exception을 해결해주려면 아래와 같이 수정해주어야 한다.
public class ExceptionAssist {
public static void main(String[] args) {
InputStream in = System.in;
try {
in.read();
}catch (IOException e){
e.printStackTrace();
}
}
}
- 자바는 기본적으로 try { } catch( ) { } 문을 이용하여 예외 처리를 한다. 여러 종류의 예외가 존재하는 경우 여러개의 catch( ){ } 를 사용할 수 도 있고 |로 or 처리할 수 도 있다. 예외 발생여부 상관없이 무조건 실행되어야 하는 코드의 경우 finally{ } 에 작성하여 준다.
* 예외 예시
- ArrayIndexOutOfBoundsException
: 배열 접근 시 잘못된 인덱스 값으로 접근한 경우
- ClassCastException
: 허용할 수 없는 형변환 연산을 시도한 경우
- NullPointerException
: 참조변수가 null로 초기화 된 상황에서 메서드를 호출하는 경우
사용자 정의 예외 클래스
방법
1. Exception 클래스를 상속
2. 예외 클래스의 생성자 함수 작성해준다. 안에는 super(message);
- throws는 예외 처리가 된 해당 메서드를 호출하는 곳에서 try catch 예외를 처리하도록 해주는 것이다.
- throw 키워드는 예외 발생시 jvm에 알리기 위해 사용된다.
- catch 의 소괄호()안에는 Exception을 상속받은 것만 가능하다.
public class MyError extends Exception{
public MyError() {
super("error 입니다.");
}
}
import java.util.Scanner;
public class ErrorEx {
public static void main(String[] args) {
System.out.println("당신의 나이는?");
try {
int age = readAge();
System.out.println("당신의 나이는"+age +"입니다.");
}catch (MyError e) {
System.out.println(e.getMessage());
}
}
private static int readAge() throws MyError {
Scanner scanner = new Scanner(System.in);
int age = scanner.nextInt();
if(age<0) {
throw new MyError();
}
return 0;
}
}
ex)
public class BankException extends Exception {
public BankException(String msg) {
super(msg);
}
}
public class Account {
private int balance;
public Account(int balance) {
this.balance = balance;
}
public int withdraw(int amount) throws BankException{
if (balance < amount) {
System.out.println("잔액이 부족합니다.");
throw new BankException("잔액이 부족합니다.");
}
balance -= amount;
return balance;
}
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
}
public class BankExceptionEx {
public static void main(String[] args) {
Account myAccount = new Account(10000);
// withdraw() 메서드에서 throws를 통해 해당 메서드를 호출한 곳에서 예외처리를 하게끔 하였으므로, 아래와 같이 try catch 문으로 수정하여 준다.
// System.out.println(myAccount.withdraw(3000));
// System.out.println(myAccount.withdraw(8000));
try {
System.out.println(myAccount.withdraw(3000));
}catch(BankException e) {
e.printStackTrace();
}
try {
System.out.println(myAccount.withdraw(8000));
}catch(BankException e) {
e.printStackTrace();
}
}
}
Java Collection Framework 클래스 ( JCF )
자바 객체를 편리하게 관리할 수 있도록 도와주는 클래스이다. 컬렉션 프레임워크에는 기본타입(premitive)인 자료형은 저장할 수 없기 때문에 Wrapper 클래스를 통해 객체형태로 사용할 수 있도록 하여주어야 한다.
* 자료구조
- Collection interface
순서없는 객체들의 집합이다.
- List interface
순차적으로 나열되는 객체들의 집합이다.
- Set interface
중복이 허용되지 않는 객체들의 집합이다.
- Queue interface
FIFO(first in first out) 형태로, 즉 처음 들어간 객체가 처음으로 나오는 형태의 객체 집합이다.
- Map interface
키와 해당 키에 해당하는 값으로 이루어진 객체들의 집합이다.
* Java Generic
데이터를 저장하는 시점에 저장하는 데이터의 타입을 지정할 수 있도록 해준다.
https://st-lab.tistory.com/153
- Generic을 사용하지 않은 경우
public class Box {
private Object item;
public Box(Object item) {
this.item = item;
}
public Object getItem () {
return item;
}
}
- Generic을 사용한 경우
public class BoxG<T> {
private T item;
public BoxG(T item) {
this.item = item;
}
public T getItem () {
return item;
}
}
- 사용시
public class BoxEx {
public static void main(String[] args) {
Box box = new Box(new Apple(10));
// Generic을 사용하지 않은 경우 다운캐스팅으로 형변환하여 사용해야 한다.
Apple apple = (Apple)box.getItem();
System.out.println(apple.getSugarContent());
BoxG<Apple> boxG = new BoxG(new Apple(10));
Apple appleG = boxG.getItem();
System.out.println(appleG.getSugarContent());
}
}
java.util.Collection 인터페이스
컬렉션 프레임워크의 최상위 인터페이스이다.
주요 메서드
- add( Object )
새로운 요소를 삽입하여 준다. 성공적으로 삽입되면 true, 중복된 요소로 삽입에 실패하면 false를 반환한다.
- clear()
모든 요소를 제거하여 준다.
- contains(Object)
파라미터로 전달된 객체가 존재하는지 여부에 따라 boolean 값을 반환한다..
- isEmpty()
해당 컬렉션이 포함하고 있는 요소가 0인지 아닌지를 boolean 값으로 반환한다.
- remove(Object)
파라미터로 전달된 객체를 제거하여 준다. 해당 파라미터로 전달된 객체가 존재하는 않는 경우 false를 반환한다.
- size()
현재 저장중인 요소의 개수를 반환하여 준다.
- iterator()
해당 컬렉션을 순회하기 위한 것이다.
- addAll()
파라미터로 전달된 컬렉션의 모든 요소를 추가하여 준다.
- containsAll()
파라미터로 전달되는 컬렉션의 모든 요소를 포함하고 있는지의 여부에 따라 boolean 값을 반환한다.
- removeAll()
파라미터로 전달된 컬렉션의 모든 요소를 제거하여 준다.
- retainAll()
파라미터로 전달된 컬렉션의 요소들과 일치하지 않는 모든 요소들을 제거하여 준다.
List 인터페이스
요소를 순차적으로 저장하여 준다. 중복된 값과 null값 모두 요소로 가질 수 있으며, 인덱스를 통해 접근한다.
ArrayList 클래스, LinkedList 클래스, Vector 클래스가 대표적이다.
주요 메서드
- add(Object)
해당 객체를 추가하여 준다.
- get(int)
인덱스에 해당하는 객체를 반환하여 준다.
- set (int, Object)
해당 인덱스에 객체를 삽입하여 준다.
- listIterator()
- remove(int)
해당 인덱스에 해당하는 객체를 지워준다.
- subList(int, int)
* ArrayList 클래스
ArrayList는 고정 길이 저장 공간으로 요소들을 관리하며, 요소를 담을 수 있는 용량을 .capacity()로 확인할 수 있다. 용량을 초과한 경우 ArrayList가 자체적으로 용량을 추가하여 준다. 내부요소에 대한 접근은 인덱스를 통해 이루어진다.
ArrayList의 경우 추가 삭제 등의 작업이 빈번한 데이터를 관리하는 경우에는 적절치 않다.
* LinkedList 클래스
각 요소들을 노드로 표현하며, 각 노드들이 서로 연결되어 리스트를 구성한다. 각 노드들은 다음 노드에 대한 참조정보를 가지고 있고, 해당 참조 정보를 통해 접근할 수 있다. LinkedList의 경우 사전에 정의된 용량(capacity)의 개념이 존재하지 않는다. 접근시에는 ArrayList와 같이 인덱스를 통해 접근한다. 데이터의 삭제시 요소를 제거하고 남아있는 요소를 이동시키는 ArrayList와 달리 LinkedList는 기존에 참조하던 정보를 끊고, 제거된 노드의 다음 노드를 참조한다.
LinkedList의 경우 ArrayList보다 더욱 많은 메모리를 사용하지만, 요소의 추가 삭제에 대한 작업은 ArrayList보다 더욱 효율적으로 작업이 가능하다.
Set 인터페이스
Set 을 통해 저장된 객체들의 경우 중복된 값이 허용되지 않으며, .equals()를 통해 요소의 중복을 확인할 수 있다. Set인터페이스의 경우 get()메서드가 존재 하지 않는다.
HashSet, LinkedHashSet, TreeSet 등이 대표적이다.
주요 메서드
- size ()
- isEmpty()
- contains(Object)
- iterator()
- add(Object)
- remove(Object)
Set 예시)
import java.util.Objects;
public class Customer {
private String email;
private String nickName;
public Customer(String email, String nickName) {
this.email = email;
this.nickName = nickName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString(){
return "Email: "+this.email+ ", nickName: "+this.nickName+"\n";
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Customer)) {
return false;
}
Customer customer = (Customer) o;
return Objects.equals(email, customer.email) && Objects.equals(nickName, customer.nickName);
}
@Override
public int hashCode() {
return Objects.hash(email, nickName);
}
}
import java.util.HashSet;
import java.util.Set;
public class SetAssist {
public static void main(String[] args) {
Set<Customer> set = new HashSet<>();
Customer customer = new Customer("mihee@nver.com", "mihee");
set.add(customer);
set.add(customer); // 이경우에는 중복된 값이라 들어가지 않는다.
System.out.println(set.add(customer)); // false
set.add(new Customer("kim@naver.com","kim"));
set.add(new Customer("oh@namve.om", "oh"));
set.add(new Customer("kim2@naver.com","kim2"));
set.add(new Customer("oh2@namve.om", "oh2"));
System.out.println(set.size());
}
}
Map 인터페이스
Map 인터페이스의 경우 key와 그에 따른 value를 저장한다. key는 요소를 구별할 수 있는 유일한 key여야 한다. map 인터페이스 내부에서 Entry 인터페이스를 가지고 있으며, Entry는 키와 값을 가진 객체의 순서 쌍이다.
HashMap, LinkedHashMap, TreeMap 등이 대표적이다.
Map 주요 메서드
- get(Object)
- put(Object, Object)
- remove(Object)
- size()
Entry 주요 메서드
- getKey()
- getValue()
- setValue(Object)
HashMap에 저장된 요소의 경우 요소의 순서가 보장되지 않는다.
LinkedHashMap의 경우에는 요소를 추가한 순서가 보장된다.
import java.util.HashMap;
import java.util.Map;
public class SetAssist {
public static void main(String[] args) {
Map<String, Customer> map = new HashMap<>();
Customer kim = new Customer("kimemail","kim");
Customer oh = new Customer("ohemail","oh");
Customer seo = new Customer("seoemail","seo");
map.put(kim.getEmail(), kim);
map.put(oh.getEmail(), oh);
map.put(seo.getEmail(),seo);
System.out.println(map);
// {kimemail=Email: kimemail, nickName: kim
// , seoemail=Email: seoemail, nickName: seo
// , ohemail=Email: ohemail, nickName: oh
// }
}
}
TreeMap의 경우 순서를 보장하되, 키 순서의 기준을 정의한 Comparable 인터페이스를 구현해야한다.
Iterator 인터페이스
각 요소들을 순회할 수 있다.
주요메서드
- hasNext()
- next()
- remove()
https://www.youtube.com/watch?v=nWeWIH7TFXA&list=PLOSNUO27qFbtjCw-YHcmtfZAkE79HZSOO&index=50
11:52
출처
https://www.youtube.com/playlist?list=PLOSNUO27qFbtjCw-YHcmtfZAkE79HZSOO
'JAVA' 카테고리의 다른 글
[ Spring ] - IoC컨테이너와 DI (0) | 2022.12.09 |
---|---|
[ Java ] - stream API 활용 (0) | 2022.10.09 |
[ Java ] - Object 클래스 (0) | 2022.09.28 |
[ Java ] - jsp 기본 문법 / jsp 라이프사이클 (0) | 2022.09.15 |
[ Java ] -JSP 활용 기본 (0) | 2022.09.14 |