블로그 5?일차

HAEIL·2024년 1월 24일

JAVA

목록 보기
1/8

요즘 루틴은 다음과 같다.

오전
CS + 취업 정보 + 자소서 작성
오후
Java 알고리즘 + Java 언어 공부

오늘은 프로그래머스의 "가장 많이 받은 선물"을 풀면서 String 객체의 split()메소드와 map 구조에 대해 공부할거다.

  • Java 리스트 부분 공부

ArrayList

/*
코드 최상단에 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과 같은 출력 부분 제외함

get(index)메소드

pitches.get(0); // index:0에 위치한 138 출력
pitches.get(); // 오류

과 같이 arguments를 입력하지 않으면, 전체가 출력되나 테스트해봤는데 이것도 안된다.

결국 for문과 같이 반복문을 돌려야지만 가능한가봄.

size() 메소드

pitches.size();

를 통해서 ArrayList의 범위를 파악한 후 사용하는 습관이 들어야겠다.

containes(Object) 메소드 (검색 기능?)

pitches.containes("142"); // true

Java는 신기하게도 search와 관련된 메소드가 기본적으로 잘 되어있다.
요즘 대부분의 언어가 그렇긴해도 가장 머릿 속에 많이 남아있는 C나 C++ 같은 경우는 선형 탐색, 이진 탐색, 해쉬 탐색 등 탐색 알고리즘을 구현했던 것 같은데... 심지어 얘네도 어떤 클래스를 include하면 사용했던 것 같기도 하다..

remove 메소드

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);  // 형 변환이 필요없다.
  1. Object 자료형(모든 객체가 상속하는 가장 기본적인 자료형)으로 인식되기 때문에, 값을 넣을 때는 문제 없으나 가져올 때 문제가 생겨 캐스팅 필요함
  2. 자료형을 설정해주지 않았기 때문에 String이 아닌 다른 형태의 객체가 들어갈 수 있음

이미 문자열 배열이 있는 경우, 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 자료형을 여러개 입력해도 동일하다.

join()메소드 (ArrayList를 하나의 문자열로 만드는 방법) - Java8 이상

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 리턴

리스트 정렬 - Java8 이상

정렬도 된다고? 멋져 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하는 방식이지 않을까?

대부분의 블로그에서는 새로운 클래스, 객체를 만들고 이들을 비교할 때 오버라이딩하여 사용하는 방법을 다룬다.. 내가 원하는건 저게 아닌데
왜 그런지가 궁금한데 대부분의 블로그에서는 그냥 이런 작동을 한다~~에서 끝나버리네
찾아서 게시글 수정해야겠다.

- 끝 -

profile
컴퓨터공학과를 졸업할 동안 개발을 소홀히 하다가 이제는 진짜 해야겠다 싶어서 시작한 블로그. 사족을 담아 최대한 이해하기 쉽게 작성하다보니 실제 전문가가 보기엔 틀린 점이 있을 수 있다...

0개의 댓글