Java - 14

하승·2022년 7월 11일
0

웹 개발반 - Java

목록 보기
14/19
post-thumbnail

Wrapper Class

기본형 타입의 값들을 객체로 사용 가능하게 도와주는 클래스
기본형 타입의 클래스 타입

int --> Integer
char --> Character

Wrapper클래스명 객체명 = new Wrapper생성자(값);	//박싱
Wrapper클래스명 객체명 = (Wrapper클래스명)값;

기본자료형 변수명 = Wrapper객체.~~~Value();		//언박싱

오토박싱
	객체명 = 값;
	
오토 언박싱
	변수명 = 객체;
package wrapper;

public class WrapperTest {
	public static void main(String[] args) {
		//박싱  
		Integer obj = new Integer(10);
		Integer obj2 = (Integer)10;
		Double obj3 = (Double)10.24;
		
		
		//언박싱
		int data = obj.intValue();
		Double data1 = obj3.doubleValue();
		
		//오토박싱
		obj = 20;
		
		//오토 언박싱
		data = obj;
	}
}

Wrapper 클래스를 사용하는 이유

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

public class WrapperTest2 {
	public static void main(String[] args) {
		Test t = new Test();
		t.f(30);
		//int 자료형으로 호출한 f()
		t.f((Integer)10);
		//Integer 클래스로 호출한 f()
	}
}
class Test{
	void f(int data) {
		System.out.println("int 자료형으로 호출한 f() : "+ data);
	}
    
	void f(Integer data) {
		System.out.println("Integer 클래스로 호출한 f() : "+data);
	}
	
	//어떤 것이든 넘겨라 ! / 객체를 넘겨라 !
	void f(Object obj) {
		System.out.println("Object 클래스로 호출한 f() : "+ obj);
	}
}

Generic(제네릭)

자료형을 선언할 때 정하지 않고, 객체를 생성할 때 정하는 기법
	class 클래스명<키워드>{
			내부에서 키워드를 타입으로 사용 가능 
		}
<키워드>
//개발자들이 자주 쓰는 키워드
E : Element
N : Number
T : Type
K : Key
V : Value

1. 제네릭 클래스

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

// 키워드에는 아무거나 들어갈 수 있지만 키워드를 타입으로 사용기에 아래와 같이 사용 
public class GClassTest<T> {
//	어떤 타입이 들어올지 모르지만 데이터가 들어오면 변수를 할당
	T data;
//	같은 타입의 data를 사용함
	T getData() {
		return data;
	}
}

메인 클래스를 하나 만들어서 사용해본다.

package generic;

public class GenericMain {
	public static void main(String[] args) {
	//  제네릭 클래스, int 타입이 아닌 클래스형의 기본타입이 들어간다.
		GClassTest<String> obj = new GClassTest<String>();
		obj.data = "제네릭 클래스";
		System.out.println(obj.getData());
	}	
}

2. 제네릭 메소드

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

	<키워드>리턴타입 메소드명(){
		내부에서 키워드를 타입으로 사용 가능
	}
package generic;

public class GMethodTest {
	<T>T f(T data){
		System.out.println(data);
		return data;
	}
}

메소드 또한 메인 클래스에서 사용해본다.

GMethodTest obj2 = new GMethodTest();
		obj2.<String>f("Hello");
//		제네릭 메소드는 보통 키워드를 유추할 수 있기 때문에 따로 명시적으로 작성해주지 않아도 된다.
		obj2.f(10);

3. 제네릭 인터페이스

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

	interface 인터페이스명<키워드>{
		내부에서 키워드를 타입으로 사용 가능
	}
package generic;

public interface GInterTest<N1, N2> {
		  N1 add(N1 num1, N1 num2);
//		  제네릭은 타입이 다르다고 확신할 수 없기 때문에 오버로딩 불가능
//		  N2 add(N2 num1, N2 num2);
		  N2 div(N2 num1, N1 num2);
}

이것 또한 메인 클래스에서 사용해본다

GInterTest<Integer, Double> obj3 = new GInterTest<Integer, Double>() {
			@Override
			public Double div(Double num1, Integer num2) {
				return num1 / num2;
			}
			
			@Override
			public Integer add(Integer num1, Integer num2) {
				return num1 + num2;
			}
		};
		System.out.println(obj3.div(10.0, 3));
		System.out.println(obj3.add(2, 3));
profile
화이팅!

0개의 댓글