새롭게 알게 된 방법 및 꿀팁이라고 생각되는 부분을 정리한 내용입니다🪄
이중 for문 탈출 시 boolean타입의 flag변수를 따로 만들지 않고 라벨을 붙여 사용하기
(1) flag변수를 사용한 코드
boolean findFake = false;
for (int i = 0; i < 9; i++) {
if (findFake) break;
int sum = totalSum - arr[i];
for (int j = i + 1; j < 9; j++) {
if (sum-arr[j] == 100) {
arr[i] = -1;
arr[j] = -1;
findFake = true;
break;
}
}
}
(2) 라벨을 사용한 코드
loop:
for (int i = 0; i < 9; i++) {
int sum = totalSum - arr[i];
for (int j = i + 1; j < 9; j++) {
if (sum-arr[j] == 100) {
arr[i] = -1;
arr[j] = -1;
break loop;
}
}
}
완전 꿀팁.. 처음 알았다🔥 몬가 첨 봤을 때 '헉 파이썬같당..!'이라고 생각했었다. 물론 파이썬은 잘 모르지만...
참조 연산자를 사용한 리스트 출력
(names는 리스트명이라고 가정)
(1) 람다식을 사용하지 않은 일반 반복문(for)
for(int i=0; i<names.size(); i++) {
System.out.println(names.get(i));
}
(2) 람다식을 사용한 반복문(forEach)
int i와 같이 반복변수를 선언할 필요가 없다는 장점이 있다.
names.forEach(d-> System.out.println(d));
(3) 메소드 참조(::)를 사용한 반복문(forEach)
자바에서는 클래스를 사용해서 직접 메소드를 참조시켜 메소드를 사용할 수 있는데, 이때 "::" 기호를 사용한다고 한다!
names.forEach(System.out::println);
getOrDefault (in HashMap) 메소드 사용하기
getOrDefault() : 찾는 키가 존재한다면 찾는 키의 값을 반환하고 없다면 기본 값을 반환하는 메서드
(1) getOrDefault()을 사용하지 않은 코드 - containsKey 사용
HashMap<String, ArrayList<Music>> hash = new HashMap<>();
for (int i = 0; i < genres.length; i++) {
ArrayList<Music> list;
if (hash.containsKey(genres[i])) { //장르가 이미 저장되어있는 경우
list = hash.get(genres[i]);
} else {
list = new ArrayList<>();
}
list.add(new Music(i, plays[i]));
hash.put(genres[i], list);
}
(2) getOrDefault()를 사용한 코드
HashMap<String, ArrayList<Music>> hash = new HashMap<>();
for (int i = 0; i < genres.length; i++) {
ArrayList<Music> list = hash.getOrDefault(genres[i], new ArrayList<>());
list.add(new Music(i, plays[i]));
hash.put(genres[i], list);
}
깔꼼! 자바에는 참 다양한 메소드가 많은 것 같다(물론 내가 못찾아쓰지만)..
순서가 보장되는 해쉬맵 LinkedHashMap
LinkedHashMap를 사용한다고 해서 인덱스로 접근할 수 있는 것은 아니지만 출력시에 입력했던 순서를 보장해서 출력된다. HashMap보다 성능도 미세..하게 좋다고 한다.
더 찾아보니 접근 빈도에 따라 순서가 변경이되는 accessOrder이라는 옵션이 있다고 한다!
accessOrder를 true 로 설정(기본값은 false)하면 put이나 compute 사용 시에도 순서를 변경한다.
아래의 블로그에서 더 자세히 확인할 수 있다.
클래스 객체 정렬을 구현하는 방법
예전에 코테 강의들었을 때는 정의한 클래스에 Comparable를 상속받아서 comparTo메서드를 구현하는 방식을 사용했는데 스터디 팀원들은 익명 함수를 사용하셨다. 내가 자주 사용하지 않는 방식이라 약간 생소해서 정리해보고자 한다.
(1) Comparable를 상속받아서 comparTo메서드를 구현
class Genres implements Comparable<Genres> {
String name;
int totalPlays;
...
@Override
public int compareTo(Genres g) {
if (this.totalPlays < g.totalPlays) return 1;
else return -1;
}
}
compareTo를 구현한 후 아래의 명령어를 호출하면 정렬된다.
Collections.sort(genresList);
(2) 익명함수를 이용하여 Comparator로 비교 기준 전달하기 (자바7까지)
Collections.sort(genresList, new Comparator<Genres>() {
@Override
public int compare(Genres s1, Genres s2) {
return s2.getTotalPlays()-s1.getTotalPlays();
}
});
근데 찾아보니까 자바8부터는 람다 스타일로 더 간단한 sort를 구현할 수 있다고 해서 마저 정리하였다.
(3) 람다 사용 (자바8부터)
함수형 인터페이스(Functional Interface)는 오직 하나의 추상 메소드를 가지는 인터페이스를 말하는데, 람다는 함수형 인터페이스에만 사용할 수 있다. 오직 하나만 가지기 때문에 람다는 자동으로 타입을 인식할 수 있으며 작성시에 별도로 타입을 명시할 필요가 없다.
위의 (1)와 (2)의 코드를 람다식으로 수정하면 다음과 같다.
genresList.sort((s1,s2)->s2.getTotalPlays()-s1.getTotalPlays());
현업에서는 람다식이 호불호가 갈린다고 해서 자주 사용하지 않았는데 sort는 워낙 효과적으로 표현할 수 있어서 연습해보려고 노력해야겠다!!🔥
'Language > JAVA' 카테고리의 다른 글
[JAVA] 입출력 스트림 / 파일스트림 (0) | 2021.02.15 |
---|---|
[JAVA] Generic 메소드 작성 (0) | 2021.02.14 |
댓글