코딩테스트를 위한 자바 메소드 정리(2) - 변환

Jae·2023년 6월 28일
0

String -> Int

  • Integer.parseInt : java.lang.Integer 클래스의 static 메소드인 parseInt() 메소드는 파라미터로 숫자로 변환할 문자열을 입력받고,입력받은 문자열을 integer로 변환한 int 값을 리턴한다.
public class StringToInt {
    public static void main(String[] args) {
        String str1 = "100";
        String str2 = "-100";
 
        int intValue1 = Integer.parseInt(str1);
        int intValue2 = Integer.parseInt(str2);
 
        System.out.println(intValue1); // 100
        System.out.println(intValue2); // -100
    }
}
  • Integer.valueOf : parseInt() 메소드와 마찬가지로 valueOf() 메소드는 java.lang.Integer 클래스의 static 메소드이고,파라미터로 숫자로 변환할 문자열을 입력받는다. parseInt() 와 가장 큰 차이점은, valueOf() 메소드는 문자열을 변환하여 Integer Object를 리턴한다는 것이다.(parseInt() 메소드는 primitive type인 int를 리턴한다.)
public class StringToInt {
    public static void main(String[] args) {
        String str1 = "100";
        String str2 = "-100";
 
        int intValue1 = Integer.valueOf(str1).intValue();
        int intValue2 = Integer.valueOf(str2).intValue();
        //자동으로 object -> int로 형변환이 일어나지만 메소드가 Integer object를 리턴한다는 걸 강조하기 위해 intValue() 호출 
 
        System.out.println(intValue1); // 100
        System.out.println(intValue2); // -100
    }
}

Int -> String

  • Integer.toString()
public class IntToString {
    public static void main(String[] args) {
        int intValue1 = 100;
        int intValue2 = -100;
 
        String str1 = Integer.toString(intValue1);
        String str2 = Integer.toString(intValue2);
 
        System.out.println(str1); //100
        System.out.println(str2); //-100
    }
}
  • String.valueOf()
public class IntToString {
    public static void main(String[] args) {
        int intValue1 = 100;
        int intValue2 = -100;
 
        String str1 = String.valueOf(intValue1);
        String str2 = String.valueOf(intValue2);
 
        System.out.println(str1); //100
        System.out.println(str2); //-100
    }
}
  • int + ""
public class IntToString {
    public static void main(String[] args) {
        int intValue1 = 100;
        int intValue2 = -100;
 
        String str1 = intValue1 + "";
        String str2 = intValue2 + "";
 
        System.out.println(str1);  //100
        System.out.println(str2);  //-100
    }
}

Array -> List

  • Arrays.asList()
import java.util.Arrays;
import java.util.List;
 
public class ArrayToList {
    public static void main(String[] args) {
        String[] arr = { "A", "B", "C" };
 
        // 배열 -> List로 변환
        List<String> list = Arrays.asList(arr);
 
        System.out.println(list.get(0)); // "A"
        System.out.println(list.get(1)); // "B"
        System.out.println(list.get(2)); // "C"
    }
}

🚨🚨 위 방법의 주의할 점
Arrays.asList() 메소드는 고정길이(fixed-size)의 원배열(specified array)의 list view를 리턴 --> 즉, 고정길이의 원래 배열의 list view를 리턴하기 때문에
Arrays.asList()를 사용해서 배열을 List로 변환한 후, 정해진 길이를 초과해 List에 값을 추가하는 것이 불가능하고,원래 배열의 값을 변경하면 List의 값도 같이 변경 된다. 마찬가지로 List의 값을 변경하면 원래 배열의 값도 변경 된다.

* new ArrayList<>(Arrays.asList()) : 원본 배열의 값과 변환 된 List의 값이 동기화 되는 것을 막기 위해서 변환한 List로 새로운 ArrayList 객체를 생성

import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
 
public class ArrayToList {
 
    public static void main(String[] args) {
        String[] arr = { "A", "B", "C" };
 
        // 배열 -> List로 변환
        List<String> list = new ArrayList<>(Arrays.asList(arr));
 
        // arr 배열 값 변경
        arr[0] = "0";
 
        // list에 값 추가
        list.add("D");
 
        System.out.println(list.get(0));  // A : 배열과 list 동기화 x
        System.out.println(list.get(1));  // B
        System.out.println(list.get(2));  // C
        System.out.println(list.get(3));  // D : list 길이 변경 O
    }
}
  • Collectors.toList()
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
 
public class ArrayToList {
    public static void main(String[] args) {
        String[] arr = { "A", "B", "C" };
 
        // 배열 -> List로 변환
        List<String> list = Stream.of(arr).collect(Collectors.toList());
 
        System.out.println(list.get(0)); // A
        System.out.println(list.get(1)); // B
        System.out.println(list.get(2)); // C
    }
}

List -> Array

  • toArray()
import java.util.ArrayList;
import java.util.Arrays;
 
public class ListToArray {
    public static void main(String[] args) {
 
        // ArrayList 준비
        ArrayList<String> arrList = new ArrayList<String>();
        arrList.add("A");
        arrList.add("B");
        arrList.add("C");
 
        // ArrayList를 배열로 변환
        int arrListSize = arrList.size();
        String arr[] = arrList.toArray(new String[arrListSize]); // 정확한 배열의 길이를 지정했지만 그냥 0으로 둬도 된다. 
 
        
    }
List<String> stringList = new ArrayList<String>();
stringList.add("A");
stringList.add("B");
stringList.add("C");
        
String[] stringArray = stringList.toArray(new String[0]);

위의 예제에서는 String 배열 인스턴스가 파라메터로 넘어갔는데, size를 '0'으로 명시했다. 이는 다음을 뜻한다.
1. List를 toArray 메서드에 파라메터로 넘어가는 배열 객체의 size만큼의 배열로 전환
2. 단, 해당 List size가 인자로 넘어가는 배열 객체의 size보다 클때, 해당 List의 size로 배열이 만들어짐
3. 반대로 해당 List size가 인자로 넘어가는 배열객체의 size보다 작을때는, 인자로 넘어가는 배열객체의 size로 배열이 만들어짐

🚨🚨 위 방법의 주의할 점
int 배열과 같은 Primitive 타입의 배열의 경우,위와 같은 방법으로는 List로 변환할 수 없다.

  • 방법 1 : 반복문 사용
import java.util.ArrayList;
import java.util.List;
 
public class IntArrayToList {
    public static void main(String[] args) {
        
        
        // int 배열
        int[] arr = { 1, 2, 3 }; 
 
        // int -> List
        List<Integer> intList = new ArrayList<>();
        for (int element : arr) {
            intList.add(element);
        }
        
        // List 출력
        System.out.println(intList.size()); // 3
        System.out.println(intList); // [1, 2, 3]
 
    }
}
 
       

* 방법 2 : Stream 사용


import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
 
public class IntArrayToList {
    public static void main(String[] args) {
        
        // int 배열
        int[] arr = { 1, 2, 3 };
 
        // int -> List
        List<Integer> intList  = Arrays.stream(arr).boxed() .collect(Collectors.toList());
        
        // List 출력
        System.out.println(intList); // [1, 2, 3]
 
    }
}
profile
Back-end Developer

0개의 댓글