Java API, 제네릭(Generic) - 0825

안씅👩🏻‍💻·2022년 8월 25일
0
post-thumbnail

Arrays class

  • 배열의 사용 목적은 대량의 원소를 보관하는 용도임.
  • 배열의 문제점은 특정 원소를 삭제, 추가, 검색(검색은 빠름), 복사를 하는데 연산시간이 오래걸림.
    • 요즘은 대량의 데이터는 array로 처리 하지 않음.

Arrays.sort(sorting할 array)

  • sorting : 정렬

    sorting할 때, array의 데이터 타입

  • int[] char[] long[] double[] 등의 primitive array는 그대로 사용 가능함.

  • class로 지정된 array(위 예제의 String[] Member[] 같은 array)는 Comparable interface를 implement 해야함.

// main
int[] scores = { 99, 94, 44, 97, 98 };

printScoresInfo(scores);

System.out.println("----------------------");
		
Arrays.sort(scores);

printScoresInfo(scores);

System.out.println("----------------------");

String[] names = { "홍길동", "박동수", "김민수" };
Arrays.sort(names);

printNamesInfo(names);
public static void printScoresInfo(int[] scores) {
	for (int i = 0; i < scores.length; i++) {
		System.out.print(scores[i] + " ");
	}
	System.out.println();
}

public static void printNamesInfo(String[] names) {
	for (int i = 0; i < names.length; i++) {
		System.out.print(names[i] + " ");
	}
	System.out.println();
}


Arrays.sort와 A.compareTo(B)로 오름•내림차순 정렬

int compareValue = name.compareTo(o.name);		//오름차순
int compareValue = -name.compareTo(o.name);		//내림차순
int compareValue = o.name.compareTo(this.name);	//내림차순

-> A.compareTo(B)의 연산 결과가 양수이면 A B 순서를 바꿈.

  • A.compareTo(B)일 때, return 값이 양의 정수, 0, 음의 정수 3가지임

    • Arrays.sort 오름차순으로 정렬시키기

    • A < B 이면, 음수를 return함, Arrays.sort가 A B의 순서를 그대로 유지함.

    • A = B 이면, 0를 return함, Arrays.sort가 A B의 순서를 그대로 유지함.

    • A > B 이면, 양수를 return함, Arrays.sort가 A B의 순서를 B A로 바꿈.

    • 앞뒤에 있는 원소를 비교해 앞에 원소값이 클 때, 둘의 순서를 바꿈.

    • Arrays.sort 내림차순으로 정렬시키기

    • A < B 이면, 양수를 return함, Arrays.sort가 A B의 순서를 B A로 바꿈.

    • A = B 이면, 0를 return함, Arrays.sort가 A B의 순서를 그대로 유지함.

    • A > B 이면, 음수를 return함, Arrays.sort가 A B의 순서를 그대로 유지함.

    • 앞뒤에 있는 원소를 비교해 뒤에 원소값이 클 때, 둘의 순서를 바꿈.

public int compareTo(Member o) {
	int compareValue = name.compareTo(o.name);		//오름차순
	int compareValue = -name.compareTo(o.name);		//내림차순
	int compareValue = o.name.compareTo(this.name);	//내림차순2
	return compareValue;
};
// main
Member[] members = { new Member("홍길동"), new Member("박동수"), new Member("김민수") };
Arrays.sort(members);
printMembersInfo(members);

public static void printMembersInfo(Member[] members) {
	for (int i = 0; i < members.length; i++) {
		System.out.print(members[i].name + " ");
	}
	System.out.println();
}

오름차순 출력
내림차순 출력내림차순2 출력


포장(Wrapper) 클래스

  • 포장(Wrapper) 클래스에는 박싱(Boxing)과 언박싱(Unboxing)이 있음.
  • Boxing은 기본 타입의 값을 객체로 만드는 과정임.
  • Unboxing은 포장 객체에서 기본 타입의 값을 얻어내는 과정임.

박싱(Boxing)과 언박싱(Unboxing)

언박싱(Unboxing)이란?
: 포장(wrapping)된 객체에서 기본 타입의 값을 얻어내는 과정

  • 각 포장된 클래스마다 가지고 있는 클래스를 호출함.
  • .기본 타입명 + Value(); 형식
    ex) 기본타입이 byte일 때, num = obj.byteValue();

박싱(Boxing)이란?
: 기본 타입의 값을 객체로 만드는 과정

  • 생성자를 이용하는 방법과 valueOf() 메소드를 이용하는 방법이 있음.

생성자를 이용하는 방법
ex)
기본타입으로 값을 주는 경우Byte obj = new Byte(10);
문자열(String)로 값을 주는 경우Byte obj = new Byte("10");

//boxing
Double obj1 = new Double(100.3);
Double obj2 = new Double("200.45");
Double obj3 = Double.valueOf("300.12");

//unboxing
double d1 = obj1.doubleValue();
double d2 = obj2.doubleValue();
double d3 = obj3.doubleValue();
		
System.out.println(d1);	// 100.3 출력
System.out.println(d2);	// 200.45 출력
System.out.println(d3);	// 300.12 출력

valueOf() 메소드를 이용하는 방법
ex)
기본타입으로 값을 주는 경우Integer obj = Integer.valueOf(10);
문자열(String)로 값을 주는 경우Integer obj = Integer.valueOf("10");

//boxing
Integer obj1 = new Integer(100);
Integer obj2 = new Integer("200");
Integer obj3 = Integer.valueOf("300");

//unboxing
int i1 = obj1.intValue();
int i2 = obj2.intValue();
int i3 = obj3.intValue();
	
System.out.println(i1);	// 100 출력
System.out.println(i2);	// 200 출력
System.out.println(i3);	// 300 출력

자동 박싱(Auto Boxing)과 자동 언박싱(Auto UnBoxing)

자동 박싱(Auto Boxing)

  • 포장 클래스 타입에 기본값이 대입될 경우 발생함.
  • 자동 박싱(Auto Boxing)하면 자동으로 힙메모리에 인스턴스가 새로 생성됨.

자동 언박싱(Auto UnBoxing)

  • 기본 타입에 포장 객체가 대입될 경우 발생함.
// 포장 클래스 타입(Integer)인 obj에 기본값인 100이 대입됨--> auto boxing
Integer obj = 100; 
System.out.println(obj.intValue());		//100 출력
System.out.println(obj);				//100 출력

// 기본타입(int)인 i에  포장 객체(obj)가 대입됨--> auto unboxing
int i = obj;
System.out.println(i);					//100 출력
		
int result = obj + 100; // auto unboxing
System.out.println(result);				//200 출력
Double obj2 = 100.23; // auto boxing
System.out.println(obj2.doubleValue());	//100.23 출력
System.out.println(obj2);				//100.23 출력
		
double d = obj2; // auto unboxing
System.out.println(d);					//100.23 출력
		
double dResult = obj2 + 12.3; // auto unboxing
System.out.println(dResult);			//112.53 출력

Wrapper class의 인스턴스 값 비교

  • primitive 값이 동일하더라도 Wrapper class로 변환하면 힙메모리에 인스턴스로 별도 생성됨.

Wrapper class의 인스턴스의 값을 비교하는 방법
1. primitive 타입으로 변환 후 비교하기.

  • unboxing하면 인스턴스 값(primitive 타입) 추출 가능함.
  1. Wrapper class의 A.equals(B) 메소드 사용하기.
Integer obj1 = 300;	// auto boxing
Integer obj2 = 300;
// obj1과 obj2는 각각 다른 힙메모리에 인스턴스를 갖음

System.out.println("obj1 == obj2 : " + (obj1 == obj2));	// false

System.out.println("unboxing 후 (obj1 == obj2) : " + (obj1.intValue() == obj2.intValue())); // true
// unboxing하면 object의 값 추출

System.out.println("obj.equals(obj2) : " + (obj1.equals(obj2))); // true
// A.equals(B)을 이용해 A와 B의 인스턴스 값 비교





random.nextInt()

  • Math.random()은 난수를 발생시키는 메소드임.

    • 0 ~ 0.99999 사이의 값을 리턴함
  • Random class로 Random 객체를 생성해 난수 값을 받을 수 있음.

    • nextInt(45) 의미 : (int)(Math.random()*45) , 0 ~ 44사이 난수 정수값

int[] selectNum = new int[6];
Random random = new Random();
//		Random random = new Random(2); 
// Random(seed) Random생성자에 seed값을 정해주면 같은 난수가 나옴
		
System.out.println("선택번호 : ");
for (int i = 0; i < 6; i++) {
	selectNum[i] = random.nextInt(45) +1; // 1 ~ 44사이 난수 정수값
	System.out.print(selectNum[i]+ " ");
}
System.out.println();
		
int[] winNum  = new int[6];
random = new Random();
//		random = new Random(2);
		
System.out.println("당첨번호 : ");
for (int i = 0; i < 6; i++) {
	winNum[i] = random.nextInt(45) +1;
	System.out.print(winNum[i]+ " ");
}
System.out.println();

  • 난수 출력

  • Random(seed) Random생성자에 seed값을 정해주면 같은 난수가 나옴

int[] selectNum = new int[6];
Random random = new Random(2); 
// Random(seed) : seed값을 정해주면 같은 난수가 나옴
		
System.out.println("선택번호 : ");
for (int i = 0; i < 6; i++) {
	selectNum[i] = random.nextInt(45) +1; // 1 ~ 44사이 난수 정수값
	System.out.print(selectNum[i]+ " ");
}
System.out.println();
		
int[] winNum  = new int[6];
random = new Random(2);
// Random(seed) : seed값을 정해주면 같은 난수가 나옴
		
System.out.println("당첨번호 : ");
for (int i = 0; i < 6; i++) {
	winNum[i] = random.nextInt(45) +1;
	System.out.print(winNum[i]+ " ");
}
System.out.println();



java.time 패키지

Calendar 클래스 사용하기

  • Calendar 클래스는 static field들을 갖고 있음.

    • 이 필드들을 get으로 받아와 날짜와 시간 값을 받을 수 있음.
  • 빼기 : minus + 변수(long) 형태로 작성

  • 더하기 : plus + 변수(long) 형태로 작성
    ex)
    minusYears(10) -> '현재연도'에서 10년 빼기
    plusYears(10) -> '현재연도'에서 10년 더하기

  • Calendar 클래스로 현재 날짜와 요일 출력하기.
//캘린더를 `getInstance()`로 받아옴.
Calendar now = Calendar.getInstance();

//++현재 날짜값 받아오기.++
int year = now.get(Calendar.YEAR);

int month = now.get(Calendar.MONTH) + 1;	
// get(Calendar.MONTH)는 0 ~ 11

int day = now.get(Calendar.DAY_OF_MONTH);

int week = now.get(Calendar.DAY_OF_WEEK);
//++요일 값 switch로 받기++
String strWeek = null;

switch (week) {
case Calendar.MONDAY:
	strWeek = "월";
	break;	
case Calendar.TUESDAY:
	strWeek = "화";
	break;
case Calendar.WEDNESDAY:
	strWeek = "수";
	break;
case Calendar.THURSDAY:
	strWeek = "목";
	break;
case Calendar.FRIDAY:
	strWeek = "금";
	break;
case Calendar.SATURDAY:
	strWeek = "토";
	break;
case Calendar.SUNDAY:
	strWeek = "일";
	break;
}
System.out.println(year + "년 " + month + "월 " + day + "일 " + strWeek + "요일");
  • Calendar 클래스로 현재 시간 출력하기.
int hour = now.get(Calendar.HOUR);

int minute = now.get(Calendar.MINUTE);

int second = now.get(Calendar.SECOND);

System.out.println(hour + "시 " + minute + "분 " + second + "초");


Date class, SimpleDateFormat class

SimpleDateFormat class 사용하기

  • "yyyy년 MM월 dd일 hh시 mm분 ss초" 형식 사용
    • yyyy : year 4자리 ,
    • MM : month 2자리,
    • dd : day 2자리 ...
Date date = new Date();
		
String strNow = date.toString();
System.out.println(strNow);
System.out.println(date);
		
		
SimpleDateFormat sdf = new SimpleDateFormat("YYYY년 MM월 DD일 hh시 mm분 ss초");
// MM은 month , mm은 minute
		
String strNow2 = sdf.format(date);
System.out.println(strNow2);





# 제네릭(Generic)

제네릭(Generic)이란?
Class ArrayList<E>에서 <E> 이부분이 제네릭(generic)

  • 타입을 변환할 때 유용하게 사용됨
public class Box<T> {
	private T t;
    public T get() { return t}
    p
}

제네릭(Generic) 선언

<T> : (T;template)

  • class명 바로 다음에 사용함.
  • T는 class Box에서 사용하는 데이터 타입임-> 가상의 데이터 타입(아직 결정되지 않음 데이터 타입)
  • T 대신 다른 글자를 사용해도 됨.-> 꼭 T를 사용해야하는 것은 아님.
    • 통상 한 글자의 영물 대문자를 사용함.
  • Box<T> 전체가 데이터 타입이면서 클래스명으로 간주함.

generic multi type

Product<T, M> 형식
: Generic 타입으로 TM을 사용하겠다는 의미(generic multi type)

  • generic type뿐만 아니라, primitive 타입, 다른 클래스도 사용 가능함.
  • 대부분의 class들은 최대 3개까지 generic 타입 사용함.

제네릭 타입 사용 여부에 따른 비교

  • Object타입을 사용한 경우
  • 제네릭 타입을 사용한 경우
profile
그냥 은근슬쩍 살다 가긴 싫어

0개의 댓글