Wrapper Class
- 박싱 : 기본 데이터를 Wrapper 클래스에 담는거
- Integer ten = Integer.valueOf(10);
- 언박싱 : 박싱 반대
package com.javaex.api.array;
public class WrapperEx {
public static void main(String [] args) {
Integer i = new Integer(10); // deprecated
Integer i2 = Integer.valueOf(10);
Integer i3 = Integer.valueOf("10");
// 자동 박싱
Integer i4 = 10; // Integer i4 = Integer.valueOf(10);
// 자동 언박싱
int value = i4; // int value = i4.intValue();
// 포장된 값 비교
System.out.println(i == i2); // false됨 : Wrapper Class도 객체다. 객체 주소 비교 (주의)
System.out.println(i.intValue() == i2.intValue()); // 첫번째 방법
System.out.println(i.equals(i2)); // 두번째 방법
}
}
결과
false
true
true
Generic
package com.javaex.api.generic;
public class BoxApp {
public static void main(String[] args) {
IntBox iBox = new IntBox();
iBox.setContent(10);
System.out.println("IntBox : "+ iBox.getContent());
StrBox sBox = new StrBox();
sBox.setContent("String");
System.out.println("StrBox : "+ sBox.getContent());
// 다 들어감 ->
// 1. 제한이 안 되어 있음
// 2. 캐스팅 해야함 (런타임오류 발생 가능)
ObjBox oBox = new ObjBox();
oBox.setContent(10);
oBox.setContent("String");
String value = (String)oBox.getContent();
System.out.println("content : " + value);
// int value1 = (Integer)oBox.getContent(); -> 런타임 오류 발생
// 제너릭 사용
GenericBox<Integer> intGBox = new GenericBox<Integer>();
// 1. 컴파일러에서 타입 체크 가능
intGBox.setContent(101);
// 2. 다운 캐스팅의 불편 해소
Integer iValue = intGBox.getContent();
System.out.println("Generic content " + iValue);
GenericBox<String> strGBox = new GenericBox<>();
}
}
GenericBox.java
package com.javaex.api.generic;
public class GenericBox<T>{
T Content;
public T getContent() {
return Content;
}
public void setContent(T content) {
Content = content;
}
}
Collection Framwork
인터페이스
배열
리스트
- 가변 크기
- 느린 접근
- 참조 자료 유형만 사용 가능
Vector
package com.javaex.api.list;
import java.util.Enumeration;
import java.util.Vector;
public class VectorEx {
public static void main(String[] args) {
// 백터 선언
Vector<Integer> v = new Vector<>();
System.out.println("[아무것도 안 한거] Size : "+ v.size() + ", Capacity : " + v.capacity());
for(int i = 1; i<=10; i++) {
v.addElement(i);
}
System.out.println("[10개 추가] Size : "+ v.size()+ ", Capacity : "+v.capacity());
v.addElement(11);
System.out.println("[addElement사용] Size : "+ v.size()+ ", Capacity : "+v.capacity());
// 삽입
v.insertElementAt(5, 7);
System.out.println("[insertElementAt] Size : "+ v.size()+ ", Capacity : "+v.capacity());
// 조회
System.out.println(v.elementAt(5));
// 검색
System.out.println("[indexOf(7)] : "+v.indexOf(7));
System.out.println("[indexOf(12)] : "+v.indexOf(12));
// 포함 여부 확인
System.out.println("[contains(10)] : "+v.contains(10));
// 삭제
v.removeElement(5); // 객체 5를 삭제
System.out.println("[5삭제 ] : "+ v);
// 순회 -> 이 방법 보단 반복자 사용을 권장
for(int i = 0; i < v.size(); i++) {
Integer item = v.elementAt(i);
System.out.print(item + " ");
}
System.out.println();
// 반복자 활용
Enumeration<Integer> e = v.elements();
while(e.hasMoreElements()) { // 값이 있니?
Integer item = e.nextElement();
System.out.print(item + " ");
}
System.out.println();
// 비우기
v.clear();
System.out.println("[clear] : "+ v);
}
}
Linked List
- List는 인터페이스이기 때문에 사용 방법이 같다.
- 필드 정의할 때, LinkedList 또는 ArrayList 둘 중 하나로 하면 됨.
package com.javaex.api.list;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class ListEx {
public static void main(String[] args) {
// List는 interface : 사용 방법이 다 같다.
// List<String> lst = new LinkedList<>();
List<String> lst = new ArrayList<>();
// 객체 추가
lst.add("Java"); // 맨 뒤에 새 노드 추가
lst.add("C");
lst.add("C++");
lst.add("Python");
// 객체 삽입
lst.add(2, "C#"); // 중간에 객체 삽입
System.out.println(lst);
// List는 중복삽입 허용
lst.add("Java");
System.out.println(lst);
// List 항목 수
System.out.println("Size : " + lst.size());
// 삭제
lst.remove(2);
lst.remove("Java"); // 처음것만 삭제 되나봐 (중복이있어도)
System.out.println(lst);
// List, Set의 경우 Iterator 사용
Iterator<String> it = lst.iterator();
while(it.hasNext()) { // 위치를 그 때 그 때 생성해줌
String item = it.next(); // 다음 요소를 가져온다.
System.out.print(item + " ");
}
// List 비우기
lst.clear();
System.out.println(lst);
}
}
Stack
스택이 비어 있는지 없는지 확인해주면서 pop해야함
package com.javaex.api.list;
import java.util.Stack;
// Stack : Last input First Output (LIFO : 후입선출)
public class StackEx {
public static void main(String[] args) {
// 스택 선언
Stack<Integer> stack = new Stack<>();
for(int i = 1; i<= 10; i++) {
// push
stack.push(i);
System.out.println("STACK : " + stack);
}
// 가장 위 데이터를 확인 : peek
System.out.println("PEEK : "+ stack.peek());
System.out.println("STACK : "+ stack);
// 인출 : pop
System.out.println("POP : "+stack.pop());
System.out.println("STACK : "+stack);
while(!stack.isEmpty()) { // 인출 전에 비어있는지 체크 해줘야 한다.
System.out.println("POP : "+ stack.pop());
System.out.println("STACK : "+ stack);
}
}
}
Queue
Hash Set
private static void hashSetCustom() {
HashSet<Student> hs = new HashSet<>();
Student s1 = new Student("홍길동", 1);
Student s2 = new Student("홍길동", 2);
Student s3 = new Student("홍길동", 1);
hs.add(s1); hs.add(s2); hs.add(s3);
System.out.println(hs);
//이름도 같고 아이디도 같은게 들어감
}
[Student [id=2, name=홍길동], Student [id=1, name=홍길동], Student [id=1, name=홍길동]]
이름도 같고 id가 같은데 들어간다.
이걸 해결하기 위해
HashCode를 사용함
HshCode
- HashCode비교
- equals확인
- 동등 판별
Student.java
package com.javaex.api.collection.hash;
public class Student {
int id;
String name;
public Student(String name, int id) {
this.name = name;
this.id = id;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + "]";
}
// hashCode 비교 -> equals 확인 -> 동등 판별
@Override
public int hashCode() {
// 객체 식별값 (정수)
return id;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Student) {
// 다운캐스팅
Student other = (Student)obj;
return name.equals(other.name) && id == other.id;
}
return super.equals(obj);
}
}
HashSetEx.java
package com.javaex.api.collection.hash;
import java.util.HashSet;
public class HashSetEx {
// Hash 알고리즘을 사용하는 컬렉션
// HashSet 순서가 없다. 중복을 허용하지 않음
//
public static void main(String[] args) {
hashSetEx();
hashSetCustom();
}
private static void hashSetCustom() {
HashSet<Student> hs = new HashSet<>();
Student s1 = new Student("홍길동", 1);
Student s2 = new Student("홍길동", 2);
Student s3 = new Student("홍길동", 1);
hs.add(s1); hs.add(s2); hs.add(s3);
System.out.println(hs);
//이름도 같고 아이디도 같은게 들어감
}
}
결과
[Student [id=1, name=홍길동], Student [id=2, name=홍길동]]
Hash Table
- 키 중복 X
- 키 순서 X
- 이미 값이 있는 키에 값을 넣으면 덮어쓰기 된다.
package com.javaex.api.collection.hash;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
public class HashtableEx {
public static void main(String[] args) {
Map<String, Integer> map = new Hashtable<>();
// 키 - 값의 쌍으로 저장
// 맵에 데이터 넣기
map.put("SOCCER", 11);
map.put("BASEBALL", 9);
map.put("VOLLEYALL", 6);
System.out.println(map);
// 키는 HashSet : 키는 중복 될 수 없고 순서가 없다.
map.put("VOLLEYALL", 12);
System.out.println(map);
// 키 포함 여부
System.out.println("SOCCER 키가 있는가 ? " + map.containsKey("SOCCER"));
// 값 포함 여부
System.out.println("값에 9가 있는가 ? "+ map.containsValue(9));
// Iterator
Iterator<String> it = map.keySet().iterator();
while(it.hasNext()) {
String key = it.next();
System.out.printf("[Key] %s => [value] %d%n",
key, map.get(key));
}
// 맵 비우기
map.clear();
System.out.println(map);
}
}
결과
{SOCCER=11, VOLLEYALL=6, BASEBALL=9}
{SOCCER=11, VOLLEYALL=12, BASEBALL=9}
SOCCER 키가 있는가 ? true
값에 9가 있는가 ? true
[Key] SOCCER => [value] 11
[Key] VOLLEYALL => [value] 12
[Key] BASEBALL => [value] 9
{}