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

인터페이스

  • list
    • 순서 O
    • 중복 허용
  • Set
    • 순서 X
    • 중복 X
  • Map
    • 키와 값의 쌍
    • 순서 유지 X
    • 중복 
      • 키는 중복 X
      • 값은 중복 O

 

배열

  • 빠른 접근
  • 고정된 크기
  • 비효율적 메모리 점유

리스트

  • 가변 크기
  • 느린 접근
  • 참조 자료 유형만 사용 가능

 

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

  • offer(넣는 것) : 넣기
  • peek( ) : 첫번째 데이터 확인
  • poll( ) : 뽑아 내기
    package com.javaex.api.list;
    
    import java.util.LinkedList;
    import java.util.Queue;
    
    public class QueueEx {
    	public static void main(String[] args) {
    		Queue<Integer> queue = new LinkedList<>();
    		
    		//	First Input First Output(FIFO : 선입선출)
    		for(int i = 0; i <= 10; i++) {
    			queue.offer(i);	//	enqueue
    			System.out.println("QUEUE : " + queue);
    		}
    		
    		//	queue의 첫번째 데이터 확인
    		System.out.println("PEEK : "+ queue.peek());
    		System.out.println("QUEUE : " + queue);
    		
    		//	
    		System.out.println("POLL : " + queue.poll());
    		System.out.println("QUEUE : " + queue);
    		
    		
    		while(!queue.isEmpty()) {
    			System.out.println("POLL : " + queue.poll());
    			System.out.println("QUEUE : " + queue);
    		}
    		
    		
    	}
    }​

 

Hash Set

  • 순서 X
  • 중복허용 X
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

  1. HashCode비교
  2. equals확인
  3. 동등 판별

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
    {}​

 

'study > JAVA 전문가' 카테고리의 다른 글

자료구조 2 - 복습  (0) 2021.12.10
자료구조 1  (0) 2021.12.09
arrays 클래스  (0) 2021.12.08
얕은 복제, 깊은 복제  (0) 2021.12.07
인터페이스  (0) 2021.12.07

+ Recent posts