본문 바로가기
국비지원/JAVA

[JAVA] 20. Wrapper class와 API - java.util pkg (java.util(API) Arrays와 sort, 객체 배열의 정렬 방법 까G)

by cosmog 2022. 10. 24.
반응형
Wrapper Class
  • java의 기본 자료형을 클래스화 하는 클래스
  • byte..int...(기본 자료형)들을 value type으로 사용하지만 실질적으로  java는 value type이라는게 존재하지 않는다. (문제가 발생하는 이유)
  • ex) Object type으로 만들면 뭐든 넣을 수 있지만 기본 자료형은 넣을 수 없음. (일반화 불가능)
    * 알고리즘은 일반화를 시켜줘야됨. Object-> Generic을 만들어야 한다.
  • object class를 상속받는 어떤것에 넣어서 일반화를 시켜줄 수 있도록.
Byte/Short/Charactor/Integer/Long/Float/Double/Boolean
따라서 위와 같이 Wrapper Class를 사용해주는 것이다.

 

Wrapper Class를 사용할때는 아래 두가지를 생각하며 해야한다.
1. 기본자료형을 어떻게 wrapper로 바꿀지.
2. wrapper를 어떻게 기본자료형으로 바꿀지

 

기본적으로 아래와 같이 해줄 수 있는데 번거로움(C++의 변환생성자와 같이)

int x = 10;
new Integer(x);

지금은 이렇게 안하고 아래와 같이 해도 생성됨.

Integer i = 10;

내부적으로는 Integer i = new Integer(10);이렇게 동작되는 것임.
(서로 간의 변환을 생성자와 method를 사용하지 않고 가능)

 

3. 문자열과 wrapper의 변화
문자열은 생성자를 이용. wrapper type으로 바꾸기.

new Integer(10);
Integer.parseInt()를 사용하여 변환한다

 

wrapper type은 연산이 가능하다.
따라서, 바꿔야 하는 이유를 아는 것이 중요하다

 

java는 어떤 자료형이든 String으로 사용 가능하다. toString으로
-> 컴퓨터는 숫자를 모른다. 무조건 문자로 보여주고 입력받는다.

💡
int x = 10; 보다는

Integer x = 10; 으로 사용 하는것이 좋다.
database같은 것들을 사용할 때 null의 개념이 값으로 들어올 수 있는데 int형은 null처리를 해주지 못한다.
또한 long을 사용하는 것을 연습하는 것이 좋다.(적극적으로 사용)

 

💡 server program같은거 사용한다면 scan.close를 무조건 해줘야된다. 프로그램이 중단되면 상관없지만
계속 연결되고 실행되는 것들이 대부분이기 때문에 메모리 릭이 발생할 수 있다(메모리 누수)
서버에서는 굉장히 중요한 포인트임.

 

java.util

Arrays

  • 배열 관련 작업을 쉽게 할 수 있도록 도와주는 클래스

<배열에서 중요한것>

  1. 배열의 순회(순서대로 접근) map
  2. 정렬
  3. 검색 ( 정렬을 하면 검색이 빨라진다 )
  4. 복제
    1. 서버는 클라이언트에게 복제본을 준다. (원본을 바로 주지 않음)
      복사본에 작업을 하면 저장을 눌러야 작업 완료가 되는 것이다.
    2. undo 때문에 복제가 중요하다.
      실제로 data를 불러오는 데 가장 오랜시간이 걸리기 떄문에(뭔가 잘못되었을때 다시 불러와야 됨.)
      복제해서 하게되면 원본이 계속 있기 때문에 다시 복제 뜨면 된다.
  5. 필터링 filtering
  6. 연산 reduce
  • 동일한 형의 자료들의 묶음(비교가 가능하다)

sort

  • 데이터를 순서대로 나열하는것.

<정렬을 구현하는 방법>

  1. 오름차순(ascending, 작은>큰거) 과 내림차순(descending, 큰거>작은)
  2. 알고리즘을 직접 사용(코딩 테스트에서 퀵 정렬은 필수, 설명까지 할 수 있어야 한다) 또는 API에서 제공하는 method 사용(각 요소가 크기 비교가 가능하도록 해줘야 한다)

선택정렬은 성능이 떨어지기 때문에 실무에서는 사용안한다. 선택 정렬은 for문 연습과 정렬을 설명하기 위해 해보는 것이다.

어떤것이든 String,int는 정렬이 되지만 내가 만든 객체는 어떤것을 기준으로 정렬을 해줘야 할지를 정해줘야 한다.

package cover;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main {
	
	public static void main(String[] args) {
		
		PersonVO[] persons = {
				new PersonVO(1, "수지", 29),
				new PersonVO(2, "아이유", 30),
				new PersonVO(3, "카리나", 23),
				new PersonVO(4, "아담", 46)
		};
		Arrays.sort(persons);
		System.out.println(Arrays.toString(persons));
	}

}

위와 같이 객체 배열을 sort시도하였을 때 에러가 난다.

💡 이유 : 객체 배열을 어떤 것을 기준으로 sorting해줘야 할지를 정해줘야 하기 때문이다. sort method는 자동으로 compareTo()를 호출하도록 구현되어있는데 Person객체 안에 compareTo()를 구현하여 어떤 정보를 기준으로 sorting할지 method를 만들어준다면 해결된다.

 

해결방법 1 : Person객체에 compareTo method override해주기

    //매번 다르게 정렬은 불가능... 한가지로 지정한 정렬만 가능하다(이름/나이..등 중 한가지로만 정렬)
	public int compareTo(PersonVO o) {
		//크기 비교 방법 설정 1. 나이순
		return o.age - this.age; //내림차순		
		return this.age - o.age; 오름차순
		
		//크기 비교 방법 설정 2. 이름순
		return this.name.compareTo(o.name); // 오름차순
		return o.name.compareTo(this.name); //내림차순
	}

 

또는 아래와 같이 main에서 지정하여 사용해 줄 수도 있다.

해결방법 2 : main method에서 sort 사용시 compare method를 넣어주기

	Arrays.sort(persons, new Comparator<PersonVO>() {
			@Override
			public int compare(PersonVO o1, PersonVO o2) {
				return o1.getNum() - o2.getNum();
			}
	});

 

동적으로 정렬하기 (input을 받아 선택한 방법으로 정렬해보았다)

package cover;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main {
	
	public static void main(String[] args) {
		
		PersonVO[] persons = {
				new PersonVO(1, "수지", 29),
				new PersonVO(2, "아이유", 30),
				new PersonVO(3, "카리나", 23),
				new PersonVO(4, "아담", 46)
		};
        
		/*
		 * 동적으로 정렬하기
		 * 1. 이름의 오름 2. 이름의 내림 3.나이의 오름 4. 나이의 내림
		 */
		Scanner scan = new Scanner(System.in);
		System.out.println("<어떤 방식으로 정렬을 원하시나요?>");
		System.out.println("1. 이름의 오름차순 2. 이름의 내림차순 3.나이의 오름차순 4. 나이의 내림차순");
		
		System.out.print("input number > ");
		String menu = scan.nextLine();
		switch(menu.trim()) {
			case "1":
				Arrays.sort(persons, new Comparator<PersonVO>() {
					public int compare(PersonVO o1, PersonVO o2) {
						return o1.getName().compareTo(o2.getName());
					}
				});
				break;
			case "2":
				Arrays.sort(persons, new Comparator<PersonVO>() {
					public int compare(PersonVO o1, PersonVO o2) {
						return o2.getName().compareTo(o1.getName());
					}
				});
				break;
			case "3":
				Arrays.sort(persons, new Comparator<PersonVO>() {
					public int compare(PersonVO o1, PersonVO o2) {
						return o1.getAge() - o2.getAge();
					}
				});
				break;
			case "4":
				Arrays.sort(persons, new Comparator<PersonVO>() {
					public int compare(PersonVO o1, PersonVO o2) {
						return o2.getAge() - o1.getAge();
					}
				});
				break;
			default:
				System.out.println("메뉴는 1-4번만 선택하세요");
				break;
		}
		scan.close();
		System.out.println(Arrays.toString(persons));
	}

}

 

반응형