본문 바로가기
Language/JAVA

[JAVA] 코테 스터디 코드 리뷰 중 배운 최적화 기법1

by 태옹 2022. 12. 5.

새롭게 알게 된 방법 및 꿀팁이라고 생각되는 부분을 정리한 내용입니다🪄


이중 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;
        }
    }
}
 

[Java] 다중 반복문에서 라벨(label)을 사용해보자

알고리즘 문제를 풀다보면 2차 이상 배열의 탐색을 위해 다중 반복문을 쓰는 경우가 많습니다. 예를들어 아래와 같은 경우입니다. 1234567int[][] arr = new int[n][n]; for(int i=0;i

whereisusb.tistory.com

완전 꿀팁.. 처음 알았다🔥 몬가 첨 봤을 때 '헉 파이썬같당..!'이라고 생각했었다. 물론 파이썬은 잘 모르지만...


 

참조 연산자를 사용한 리스트 출력 

(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);

 

 

JAVA - 클래스의 메소드 참조, "::", List 출력, "System.out::println"

자바에서는 클래스를 사용해서 직접 메소드를 참조시켜 메소드를 사용할 수 있는데, 이때 "::" 기호를 사용합니다. 주로 List데이터를 출력할때 System.out.println을 통해 확인하는데 참조 연산자를

myhappyman.tistory.com

 

 


 

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);
}

깔꼼! 자바에는 참 다양한 메소드가 많은 것 같다(물론 내가 못찾아쓰지만)..

 

[JAVA] Map - getOrDefault 이란? 사용법 및 예제

getOrDefault - 찾는 키가 존재한다면 찾는 키의 값을 반환하고 없다면 기본 값을 반환하는 메서드 사용 방법 getOrDefault(Object key, V DefaultValue) 매개 변수 : 이 메서드는 두 개의 매개 변수를 허용합니

junghn.tistory.com

 


 

순서가 보장되는 해쉬맵 LinkedHashMap

LinkedHashMap를 사용한다고 해서 인덱스로 접근할 수 있는 것은 아니지만 출력시에 입력했던 순서를 보장해서 출력된다. HashMap보다 성능도 미세..하게 좋다고 한다.

 

JAVA HashMap VS LinkedHashMap (차이점, 성능차이, 사용방법)

JAVA언어에서 어쩌면 가장 많이 활용하며 사용하는 Map입니다. Map은 기본적으로 Key와 Value를 묶어 한쌍 으로 저장 합니다. 그리고 많은 양의 데이터를 빠르게 검색 할 수있는 성능의 장점이 있습니

web-inf.tistory.com

 

더 찾아보니 접근 빈도에 따라 순서가 변경이되는 accessOrder이라는 옵션이 있다고 한다!

accessOrder를 true 로 설정(기본값은 false)하면 put이나 compute 사용 시에도 순서를 변경한다.

아래의 블로그에서 더 자세히 확인할 수 있다.

 

 

[Java] Map, HashMap, LinkedHashMap

MapKey, Value 형태로 데이터를 저장하는 자료구조 HashMap선언일반적으로 변수 부분은 인터페이스로 선언하는게 확장에 유리하다. Map map = new HashMap(); 데이터 삽입V put(K key, V value) 로 값을 넣을 수 있

bcp0109.tistory.com

 


 

클래스 객체 정렬을 구현하는 방법

예전에 코테 강의들었을 때는 정의한 클래스에 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는 워낙 효과적으로 표현할 수 있어서 연습해보려고 노력해야겠다!!🔥

 

 

Java에서 정렬과 lambda

자바에서 정렬하는 여러가지 방법을 정리합니다.더불어 람다에 대해서도 알아봅니다.

velog.io


 

힘이난당♨

'Language > JAVA' 카테고리의 다른 글

[JAVA] 입출력 스트림 / 파일스트림  (0) 2021.02.15
[JAVA] Generic 메소드 작성  (0) 2021.02.14

댓글