요즘 루틴은 다음과 같다.
오전
CS + 취업 정보 + 자소서 작성
오후
Java 알고리즘 + Java 언어 공부
오늘은 프로그래머스의 "가장 많이 받은 선물"을 풀면서 String 객체의 split()메소드와 map 구조에 대해 공부할거다.
/*
코드 최상단에 import java.util.ArrayList; 필수
*/
public static void main(String[] args) {
ArrayList pitches = new ArrayList();
pitches.add("138");
pitches.add("129");
pitches.add("142");
pitches.add(4, "133"); //오류 발생
System.out.println(pitches.get(0));
}
ArrayList는 인덱스를 지정해서 add메소드를 사용할 수 있지만, size를 벗어나는 인덱스를 입력하면 IndexOutOfBoundsException 오류가 발생한다.

index 3부분에 자동으로 값을 넣어주나 싶었는데 그런건 안되나보다.
여기부터 작성하는 코드에는 println과 같은 출력 부분 제외함
pitches.get(0); // index:0에 위치한 138 출력
pitches.get(); // 오류
과 같이 arguments를 입력하지 않으면, 전체가 출력되나 테스트해봤는데 이것도 안된다.

결국 for문과 같이 반복문을 돌려야지만 가능한가봄.
pitches.size();
를 통해서 ArrayList의 범위를 파악한 후 사용하는 습관이 들어야겠다.
pitches.containes("142"); // true
Java는 신기하게도 search와 관련된 메소드가 기본적으로 잘 되어있다.
요즘 대부분의 언어가 그렇긴해도 가장 머릿 속에 많이 남아있는 C나 C++ 같은 경우는 선형 탐색, 이진 탐색, 해쉬 탐색 등 탐색 알고리즘을 구현했던 것 같은데... 심지어 얘네도 어떤 클래스를 include하면 사용했던 것 같기도 하다..
pitches.remove("129"); // 객체명을 이용해 탐색 후 삭제 return true;
pitches.remove(0); // 인덱스를 통해 탐색 후 삭제 return "138";
인덱스를 넣으면 값이 리턴된다고 하는데, 이것은 Object 형태인가 String 형태인가 Int 형태인가 ????? 기존에 가지고 있던 데이터의 형태를 따라가는듯 하다..

컬렉션 원소의 타입을 의미하는 대문자 E의 형태로 return해주나봄
공부하다보면 이게 문제야. 궁금한게 생겨서 진도를 못나감
캐스팅 오류를 막기 위해 제네릭 타입을 사용한다고 한다. (J2SE 5.0 버전 이후 도입)
주로 선호되는 형태는
ArrayList<String> pitches = new ArrayList<>();
라고 하는데, 뒷 부분의 자료형은 명확하기 때문에 굳이 적지 않는다고 함.
자바 공식문서 Generics 부분
제네릭을 사용하는 이유는, 자료형을 좀 더 명확하게 체크 --> 자료형의 불일치로 인해 발생하는 오류를 방지하기 위해.
//제네릭 사용하지 않는 경우 --> 형변환(casting) 필요
ArrayList pitches = new ArrayList();
pitches.add("138");
pitches.add("129");
String one = (String) pitches.get(0);
String two = (String) pitches.get(1);
//제네릭 사용한 경우 -->
ArrayList<String> pitches = new ArrayList<>();
pitches.add("138");
pitches.add("129");
String one = pitches.get(0); // 형 변환이 필요없다.
String two = pitches.get(1); // 형 변환이 필요없다.
이미 문자열 배열이 있는 경우, ArrayList형태로 쉽게 변경 가능하다.
슬슬 String에서 StringBuffer/StringBuilder 넘어가는 것과 헷갈리기 시작한다
import java.util.ArrayList;
import java.util.Arrays;
public class Sample {
public static void main(String[] args) {
String[] data = {"138", "129", "142"}; //배열 존재
ArrayList<String> pitches = new ArrayList<>(Arrays.asList(data)); // asList 메서드를 활용
System.out.println(pitches); // [138, 129, 142] 출력
}
}
ArrayList<String> pitches = new ArrayList<>(Arrays.asList("138", "129", "142"));
위와 같이, String 배열을 사용하지 않고, String 자료형을 여러개 입력해도 동일하다.
for문을 통해 아래와 같이 구현해도 되겠지만 귀찮다.
String result = "";
for (int i = 0; i < pitches.size(); i++) {
result += pitches.get(i);
result += ","; // 콤마를 추가한다.
}
result = result.substring(0, result.length() - 1); // 마지막 콤마는 제거한다.
이때 사용하는 메소드가 String.join("구분자", 리스트 객체)
ArrayList<String> pitches = new ArrayList<>(Arrays.asList("138", "129", "142"));
String result = String.join(",", pitches); //138,129,142 리턴
정렬도 된다고? 멋져 java..
import java.util.Comparator; //sort할 때 쓰는 arguments
pitches.sort(Comparator.naturalOrder()); // 오름차순 정렬
pitches.sort(Comparator.reverseOrder()); // 내림차순 정렬
아마 ArrayList를 import 해야지만 사용 가능한 sort 메소드이지 않을까?
return값이 별도로 존재하는 지는 모르겠고, 내부 값 자체를 바꿔준다.
이러면 내부 클래스에서만 사용해야겠다.
comparable과 comparator의 차이
comparable이란 것도 있나보다...
둘 다 인터페이스이므로 이들을 사용하려면 각 인터페이스 내에 있는 메소드를 반드시 구현해야만 한다.
자세한 내용은 나중에 이해하고 우선은
comparator이라는 interface를 활용해서 arraylist 속의 객체들을 비교가 가능하게 설정한 후, 이들을 오름차순/내림차순으로 순위를 결정 --> 이 기준을 가지고 sort하는 방식이지 않을까?
대부분의 블로그에서는 새로운 클래스, 객체를 만들고 이들을 비교할 때 오버라이딩하여 사용하는 방법을 다룬다.. 내가 원하는건 저게 아닌데
왜 그런지가 궁금한데 대부분의 블로그에서는 그냥 이런 작동을 한다~~에서 끝나버리네
찾아서 게시글 수정해야겠다.
- 끝 -