배열(Array) -> ArrayList 변환

String[] arr = new String[5];

arr[0] = "one";
arr[1] = "two";
arr[2] = "three";
arr[3] = "four";
arr[4] = "five";

ArrayList<String> arrList = new ArrayList<>();

for(String k : arr) {
	arrList.add(k);
}

+ ) Arrays 메서드 사용

String[] arr = new String[5];

arr[0] = "one";
arr[1] = "two";
arr[2] = "three";
arr[3] = "four";
arr[4] = "five";

ArrayList<String> arrList = new ArrayList<>(Arrays.asList(arr));

 

ArrayList -> 배열(Array)

ArrayList<String> arrList = new ArrayList<>();

arrList.add("one");
arrList.add("two");
arrList.add("three");
arrList.add("four");
arrList.add("five");

String[] arr = new String[arrList.size()];
int size = 0;
for(String k : arrList) {
	arr[size++] = k;
}

+ ) List 메서드 사용

ArrayList<String> arrList = new ArrayList<>();

arrList.add("one");
arrList.add("two");
arrList.add("three");
arrList.add("four");
arrList.add("five");

String[] arr = arrList.toArray(new String[arrList.size()]);

배열(Array) 과 ArrayList

  배열(Array) ArrayList
크기 초기화시 고정
int[] arr = new int[5];
초기화시 크기를 표시하지 않고 유동적
ArrayList arr = new ArrayList();
속도 초기화시 메모리에 할당되어 속도가 빠르다. 추가시 메모리를 재할당하여 속도가 느리다.
변경 크기 변경 불가 추가, 삭제 가능
add(), remove() 로 가능
다차원 int[][] arr = new int[5][5]; 불가능
public class Test {
	public static void main(String[] args) {
    	
		int[] arr = new int[5];
		arr[0] = 1;
		arr[1] = 2;
		arr[2] = 3;
		arr[3] = 4;
		arr[4] = 5;
        
		ArrayList<Integer> arrList = new ArrayList<Integer>();
		// 데이터 추가
		arrList.add(1);
		arrList.add(2);
		arrList.add(3);
		arrList.add(4);
		arrList.add(5);
        
		// 0번째 인덱스 삭제
		arrList.remove(0);
        
		// 1번째 인덱스 값 가져오기
		arrList.get(1);
	}
}

알고리즘을 풀면서 입출력 때문에 시간의 차이가 나는 경우가 꽤 있었기에, BufferedReaderd와 BufferedWriter에 대해 간단히 설명하겠습니다.

 

Scanner

Scanner scanner = new Scanner(System.in);
int x = scanner.nextInt();

Scanner로 입력받는 데에 한계를 느낄 때 BufferedReader를 사용하면 됩니다.

 

BufferedReader

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

String s = bufferedReader.readLine();
int x = Integer.parseInt(bufferedReader.readLine());

readLine() 함수를 이용해서 읽어올 경우 String의 리턴 값을 가집니다. 그렇기 때문에 parseInt() 함수를 이용하여 String 값을 int형으로 파싱 해 주었습니다. 또한 예외처리를 꼭 해주어야 하는데 대개 throws IOException을 통하여 작업합니다.

 

Scanner의 경우 nextInt()를 입력하면 공백 다음 숫자를 받기 때문에 어려움이 있지만, BufferedReader를 사용하면 

StringTokenizer를 이용하여 String을 특정 구분자(delimeter) 값을 통해 공백을 기준으로 문자열을 나눕니다.

 

StringTokenizer

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());

int a = Integer.parseInt(stringTokenizer.nextToken());
int b = Integer.parseInt(stringTokenizer.nextToken());

StringTokenizer에 nextToken() 함수를 쓰면 bufferedReader.readLine()을 통해 입력받은 값을 공백 기준으로 구분하여

순서대로 호출합니다.

 

BufferedWriter

BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.in));

bufferedWriter.write("Hello\n");
bufferedWriter.flush();
bufferedWriter.close();

일반적으로 System.out.println을 이용하면 자동 줄 바꿈을 해주지만, bufferedWriter.write()는 자동 줄 바꿈이 없기 때문에 \n을 작성해주어야 한다. 마지막에 flush() / close()함수를 작성해주지 않을 경우 제대로 출력이 되지 않을 수도 있습니다.

Scanner 클래스

Scanner 객체를 생성하려면 다음과 같이 생성자에 System.in 매개값을 주면 된다.

Scanner scanner = new Scanner(System.in);

 

Scanner 클래스에서 next(), nextLine() 메서드는 String 타입으로 리턴해준다.

다음 예제를 통해 이 둘 메소드의 차이를 알아보자

 

next()와 nextLine() 메소드의 차이

public class Example {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
        
		System.out.println("nextLine: ");
		string str1 = scanner.nextLine();
		System.out.println(str1);
        
		System.out.println("next: ");
		string str2 = scanner.next();
		System.out.println(str2);
	}
}
nextLine :
안녕하세요 반갑습니다
안녕하세요 반갑습니다
next : 
안녕하세요 반갑습니다
안녕하세요

nextLine()과 next()메소드의 차이는 nextLine()메소드는 Enter를 치기 전까지 쓴 문자열을 모두 리턴한다는 것이고 next() 메소드는 Space 즉 공백 전까지 입력받은 문자열을 리턴한다는 것이다.

공백이 있는 한줄을 리턴받고 싶으면 nextLine() 메소드를 사용하고, 한 단어만 리턴받고 싶으면 next() 메소드를 사용하면 된다.

+ Recent posts