- Wrapper Class

기본 자료형인 변수를 객체로 사용 가능하게 도와주는 클래스

따라서 기본형 타입의 클래스 타입으로 보면 된다.

위 사진에서 Shoft가 아니라 Short이다.

 

 

- Wrapper Class 선언 및 사용

Wrapper 클래스명 객체명 = new Wrapper생성자(값);  // 박싱
기본자료형 변수명 = Wrapper객체.intValue();      // 언박싱
Wrapper클래스명 객체명 = 일반자료형 값;    // 오토박싱
일반자료형 변수명 = Wrapper객체;          // 오토 언박싱

 

 

- Wrapper 클래스를 사용하는 이유

  1. 기본형 타입을 객체로 다루어야 할 때
  2. 기본형 타입이 아닌 객체로 값을 저장해야 할 때
  3. 매개변수로 객체를 넘길 때 (특히 Object)
  4. 객체 간의 비교가 필요할 때

 

 


Wrapper 클래스 사용해보기!

 

package wrapper;

public class WrapperTest {
	public static void main(String[] args) {
//		int data = 10;
		// 박싱
//		Integer obj = new Integer(data);
		Integer obj = (Integer) 10;

		// 언박싱
		System.out.println(obj.intValue());
		// 10출력

		// 오토 박싱, 언박싱
		Integer obj2 = 10;
		int data2 = obj2;
		WrapperTest w = new WrapperTest();
//		w.f(data2);
//		w.f(obj2);
		w.f((Integer)20); 
		w.f(obj2.intValue());
        // 기본자료형 값을 넘기면서 아래의 f()메소드를 호출하고 싶을 때는?
        // 박싱 해서 넘기면 박싱해서 맞는 타입의 메소드를 찾아서 매개변수를 넘겨줌
		// 반대의 경우에는 언박싱으로 타입을 맞춰줘서 해준다.
		
		w.f(30); // 첫번쨰 f()는 그냥 넘기고, 두번째 f()는 오토박싱 , 
        //세번째는 오토박싱, 업캐스팅까지 해줘야함. 
	}
	// 오버로딩가능하기 때문에 같은이름으로 만들어도 상관없다.
	void f(int data) {
		System.out.println("기본 자료형으로 호출 : " + data);
	}
	
	void f(Integer data) {
//		오토박싱
//		data = 30;
		System.out.println("클래스 타입으로 호출 : " + data);
	}
	
	void f(Object obj) {
		System.out.println("오브젝트 타입으로 호출 : "+obj);
	}
}

 

위 코드의 결과

 

 

 


- Generic (제네릭)

클래스를 선언할 때 내부에서 자료형을 정하지 않는 기법

사용할 때 (객체를 생성할 때) 객체의 그 자료형을 지정한다.

 

키워드 의미
E Element
N Number
T Type
K Key
V Value

 

 

 1. 제네릭 클래스

 클래스 내부에서 사용될 자료형을 지정한다.

class 클래스명 <키워드> {
   내부에서 키워드를 자료형으로 사용가능
}

제네릭 클래스명 < 사용할 자료형> 객체명 = new 제네릭클래스명<>();

객체 내부의 키워드로 작성한 변수들이 전부 사용할 자료형으로 선언된다.

 

 

 


제네릭 클래스 사용해보기!

 

package generic;

// 제네릭 클래스
public class GClassTest<Aespa>{
	Aespa data;
	
	void init() {
		System.out.println("가지고 있는 데이터 : " +data);
	}
	
	
}
package generic;

// 메인 메소드가 존재하는 클래스
public class GenericMain {
	public static void main(String[] args) {
		GClassTest<String> obj = new GClassTest<>();
		obj.data = "에스파는 나야 둘이 될 수 없어";
		obj.init();
		
		GClassTest<Integer> obj2 = new GClassTest<>();
		obj2.data = 100; // 오토박싱
		obj2.init();

위 코드의 결과

 


 2. 제네릭 메소드

 메소드 내부에서 사용될 자료형을 지정한다.

<키워드> 리턴타입 메소드명 (자료형 매개변수,...) {
		내부에서 키워드를 자료형으로 사용가능
    }

 

 


제네릭 메소드 사용해보기!

package generic;

// 제네릭 메소드 
public class GMethodTest {

	<T> T f(T data) {
		if (data instanceof Integer) {
			System.out.println("정수로 호출");
		} else if (data instanceof Double || data instanceof Float) {
			System.out.println("실수로 호출");
		} else if (data instanceof String) {
			System.out.println("문자열로 호출");
		} else if (data instanceof Character) {
			System.out.println("문자로 호출");
		}
		return data;
	}
}
package generic;

public class GenericMain {
	public static void main(String[] args) {
    	GMethodTest obj = new GMethodTest();
		obj.<String>f("Hello");
		// 제너릭 메소드들은 보통 내부에서 사용될 자료형을 유추로 알 수 있게 설계되어있다.
		// 따라서 호출 시 명시적으로 자료형을 적어주지 않아도 된다.
		obj.f(10);
		obj.f(10.524);
		// 넘기는 매개변수로 구분이 가능하기 때문에 굳이 정해주지 않아도 괜찮음.
	}

위 코드의 결과

 

 

 3. 제네릭 인터페이스

 인터페이스 내부에서 사용될 자료형을 지정한다.

interface 인터페이스명<키워드> {
		내부에서 키워드를 자료형으로 사용가능
 }

 

 


- 컬렉션 프레임워크 (Collection Framework)

많은 데이터들을 쉽고 효과적으로 관리할 수 있는 표준화된 방법을 제공하는 클래스 및 인터페이스들의 집합

 

 

- 종류

List extends Collection 인터페이스

구현 클래스

 ArrayList

 LinkedList

 Vector

 

Set extends Collection 인터페이스

구현 클래스

 HashSet

 TreeSet

 

 

- ArrayList

여러 데이터들을 배열을 이용해서 나열해 놓은 구조

컬렉션 클래스들 중 가장 많이 사용되는 클래스이다.

배열을 이용해서 값을 저장한다.

 

인덱스를 이용해서 배열 요소에 빠르게 접근 가능하지만 크기를 늘리거나 줄이기 위해서 

새로운 배열을 생성하고 기존의 값들을 다 옮겨야 하므로 느리다.

 

배열은 처음에 몇 칸으로 할당할지 고정해야 하지만, ArrayList는 값을 넣는 만큼 자동으로 늘어난다.

 

 


ArrayList 사용해보기!

package collection;

import java.util.ArrayList;

public class ArrayTest {
	public static void main(String[] args) {
		// arrylist로 ardata 선언
		ArrayList<Integer> arData = new ArrayList<>();

		// ArrayList에 추가된 요소의 개수
		System.out.println("arData 크기 : " + arData.size());
		// 추가된 값이 없으므로 0 출력

		// ArrayList에 요소 추가하기
		arData.add(10);
		arData.add(20);
		arData.add(30);
		arData.add(40);
		arData.add(50);

		// ArratList의 구조 간단하게 확인하기
		System.out.println("arData 추가한 값 확인  : " + arData);

		for (int i = 0; i < arData.size(); i++) {
			// ArrayList에서 요소 가져오기
			System.out.println("arData 각 값 확인 : " + arData.get(i));
		}
		// ArrayList의 요소 수정하기
		arData.set(2, 300);
		System.out.println("arData 수정한 값 확인  : " + arData);

		// ArrayList의 요소 삭제하기
		// 매개변수에 정수값을 넘긴다.
		// remove(int index)가 호출 : 넘긴 정수를 인덱스로 활용해서 삭제
		
		// 매개변수에 Integer 객체를 넘긴다.
		// remove(Object o)가 호출 : 넘긴 객체와 같은 객체를 찾아서 삭제
		arData.remove((Integer) 300);
		System.out.println("arData 삭제한 값 확인  : " + arData);

	}

}

위 코드의 결과

 

 

복사했습니다!