본문 바로가기
Programming/Java

[JAVA] List to Array & Array to List ( 리스트와 배열 convert하기) + String 과 char 배열 변환

by 읽고 쓰는 개발자 2020. 12. 7.

 

알고리즘 / 자료구조 문제를 풀다보면 array 와 list 를 convert하는 상황이 종종 생긴다.

사실 반복문 사용하여 컨버팅하는 방법이 가장 간단하고 확실하지만.. 

라이브러리와 모던자바를 이용해 풀면 코드 길이도 간결해지고 문법 공부도 되기 때문에 정리해보았다. 

 

1. Array to List ( 배열을 리스트로 변경 )

   - Arrays.asList (List<T> asList(T... a)) 메소드 사용하기

      asList의 parameter는 배열의 단일 객체들이다. 

    Primitive 자료형의 경우 array 전체를 인자로 받을 수 없고( Wrapper class만 가능 - 따라서 String은 가능 int 등 기본자료형 불가능.), 

     불변객체로 리턴되기 때문에 list의 요소들을 새로 넣거나 삭제하는 등 변경할 수 없다.

     불변객체 해결하여 사용하고 싶다면 불변 리스트 생성 후 다시 새로운 (변경 가능한) 리스트를 생성하는 방법을 이용하면 된다. (인자로 List 객체 받을 수 있다.)

        int[] arr = new int[]{1, 2, 3};
        
        // int 자료형의 경우 각 요소를 int 형태로 받을 수 없다.
        Arrays.asList(arr);       
        
        // 단일 객체를 넣어주면 원하는 integer 형태의 List 생성 가능
        List<Integer> list2 = Arrays.asList(1,2,3);    
        list2.add(1);       // 불가
        
         // Integer class의 경우 Arrays.asList로 list 생성 가능
        Integer[] arr2 = new Integer[]{1, 2, 3};  
        
        // 불변객체를 새로운 list 객체 생성자 인자로 넘겨줌
        ArrayList<Integer> list3 = new ArrayList<>(Arrays.asList(arr2));    
        
        list3.add(1);       // add 가능      

 

 

2. List to Array ( 리스트를 배열로 변경 ) + Integer형 리스트를 int형 배열로 변환

- ArrayList class의 toArray 메소드 사용하기

  toArray 메소드는 Object array를 반환한다. 

    public Object[] toArray() {
        return Arrays.copyOf(elementData, size);
    }

  따라서, Object[] 형으로 받거나, casting을 통해 원하는 자료형(wrapper class)으로 받을 수 있다.

        Object[] array1 = list3.toArray();
        Integer[] array2 = (Integer[]) list3.toArray();         // type casting

- IntStream 이용하여 Integer List를 Int Array로 반환하기 

int[] array = list3.stream().mapToInt(Integer::intValue).toArray();

 

stream의 mapToInt 메소드로 IntStream을 반환받으면 int형으로 이루어진 stream 생성된다. (Integer class의 int value 반환하는 메소드를 인자로 던진다)

생성된 int형 stream을 array로 변경(toArray)한다. 

 

 

 

3. String to char[] / char[] to String ( character 배열과 String 오브젝트 변환 )

- String to char[] 

String object의 기본 method인 toCharArray() 사용하면 손쉽게 char[] 배열로 이루어진 리턴값을 얻을 수 있다. 

        String s = "dlsfkj";
        char[] chars = s.toCharArray();  

 

- char[] to String

char 배열을 String object로 변환할 때 헷갈릴 수 있다.

String의 method toString을 사용하거나 Arrays class의 toString method는 적절한 리턴값을 주지 않는다.

String class의 toString은 Object class의 toString을 override없이 상속받았기 때문에 클래스 이름 정보로 이루어진 값이 리턴된다.

    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

새로운 String 객체를 생성하고 생성자 parameter로 char 배열을 넘겨주면 제대로된 String 객체가 리턴된다.

어차피 String의 value는 character array이기 때문에 간단하게 생성자로 객체 생성 가능 

(여기서 Arrays.copyOf 메소드가 사용된다.)

    public String(char value[]) {
        this.value = Arrays.copyOf(value, value.length);
    }

 

string <-> char[] converting 예제 코드 

	String s = "Hello";
	char[] chars = s.toCharArray();     // String to char array
	String s1 = chars.toString();  // 원하는 값 안나옴   getClass().getName() + "@" + Integer.toHexString(hashCode())
	String s2 = Arrays.toString(chars);  // 원하는 값 안나옴   각 요소의 toString 값을 append하여 생성한 string object 
	String s3 = new String(chars);          //원하는 값 나옴