HashMap, static (항해일지 9일차)

김형준·2022년 5월 17일
0

TIL&WIL

목록 보기
9/45

1) 학습 일지


✔✔클릭! Java알고리즘 ~38번 까지 풀이


HashMap

  • 오늘 풀이에는 HashMap()을 많이 사용했다.
  • Java의 Map은 파이썬의 Dictionary와 같다.
  • Key, Value로 구성되며, 한 세트를 Entry라고 한다.
  • 아래 코드는 오늘 풀었던 알고리즘 코드의 일부이다.
public String[] solution(String[] strings, int n) {
        HashMap<String, Character> map = new HashMap<>();
        for (String s : strings){
        	// map에 key, value를 넣을 때는 put()
            map.put(s, s.charAt(n));
        }
        // Map의 Entry ArrayList를 생성하여 entrySet을 넣어줌
        List<Map.Entry<String, Character>> entryList = new ArrayList<>(map.entrySet());

        // Map.Entry의 comparingBy~ 메서드 사용하여 정렬
        entryList.sort(Map.Entry.comparingByKey());
        entryList.sort(Map.Entry.comparingByValue());

        String[] answer = new String[entryList.size()];
        for (int i=0; i<entryList.size(); i++){
            answer[i] = entryList.get(i).getKey();
        }
        return answer;
    }

정렬

// 1. Collection.sort()
// ArrayList 준비
ArrayList<String> list = new ArrayList<>(Arrays.asList("C", "A", "B", "a"));
System.out.println("원본 : " + list); // [C, A, B, a]
// 오름차순으로 정렬
Collections.sort(list);
System.out.println("오름차순 : " + list); // [A, B, C, a]
// 내림차순으로 정렬
Collections.sort(list, Collections.reverseOrder());
System.out.println("내림차순 : " + list); // [a, C, B, A]
// 대소문자 구분없이 오름차순
Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
System.out.println("대소문자 구분없이 오름차순 : " + list); // [a, A, B, C]
// 대소문자 구분없이 내림차순
Collections.sort(list, Collections.reverseOrder(String.CASE_INSENSITIVE_ORDER));
System.out.println("대소문자 구분없이 내림차순 : " + list); // [C, B, a, A]

// 2. List.sort() 사용 방식은 위와 비슷하다.

// 3. 사용자 정의
class Fruit implements Comparable<Fruit> {
private String name;
private int price;
public Fruit(String name, int price) {
this.name = name;
this.price = price;
}
@Override
public int compareTo(Fruit fruit) {
if (fruit.price < price) {
return 1;
} else if (fruit.price > price) {
return -1;
}
return 0;
}
  • 출처: https://hianna.tistory.com/569 [어제 오늘 내일]

  • Collections.sort() 메소드는 객체를 정렬할 때, 해당 객체의 Comparable을 구현한 compareTo() 메소드를 참조하여, 정렬 순서를 결정

  • 따라서, 정렬할 객체가 Comparable interface를 구현하고, compareTo() 메소드 안에 정렬 기준이 정의된다면, Collections.sort() 가 정의한 기준으로 정렬 기능을 수행한다. (사용자 정의 정렬)

  • 위의 코드에서 Fruit class는 Comparable을 implements하고, compareTo 메서드를 override하여 정의했다.

  • 따라서 Collection.sort()에 Fruit Collection을 넣는다면 Fruit class에서 override한 compareTo에 의해 정렬된다!


String.replace(All)

  • String.replaceAll(x,y) 는 스트링에 포함된 x를 모두 y로 바꾼다!

Static

  • 출처
  • static은 정적이라는 뜻을 지닌다.
  • 위의 그림과 같이 static 영역은 new 연산에 의해 생겨난 객체들이 저장되는 Heap영역과 달리! Garbage Collector가 관리하지 않는 영역이다
  • 다시 말해, static 영역에 넣은 데이터는 프로그램이 끝날 때 까지 메모리가 할당된 채로 존재하여 성능에 악영향을 끼칠 수 있다.

static 변수와 static 메서드

  • 그렇다면 static 변수와 메서드는 왜 사용하는 것인가?
  • 일단, static 변수와 메서드는 Heap영역이 아닌 static 영역에 저장되기에 해당 클래스를 생성하지 않고도 다른 클래스에서 사용할 수 있다.
  • 즉, new 연산에 의해 생겨나는 것이 아니기 때문에, 모든 클래스에서 static 변수는 같은 메모리를 가리킨다.
  • 따라서 같은 값을 굳이 new 연산할 때마다 생성하지 않아 메모리 할당량을 줄이는 목적 외에도, 정보를 공유한다는 기능도 지닌다.
  • 나아가 final이 붙는다면 해당 static 변수는 변하지 않는 정적 변수가 된다.
  • static 메소드 역시 모든 클래스에서 클래스 생성 없이 사용 가능하다.
  • 다만 주의할 점은, static 메소드는 static 영역이기에, static 변수가 아닌 변수(heap 영역)는 사용할 수 없다.
  • 일반 변수는 new 연산에 의해 생성될 때 heap 메모리 공간에 값이 저장되기 때문이다.
  • static의 개념은 나중에 제대로 학습할 싱글톤 패턴에서 사용된다.

정적 변수와 전역 변수?

  • static이 모든 클래스에서 사용 가능하기에, 당연히 static 변수가 전역변수구나~ 라고 생각했다.
  • 아니었다..
  • 전역 변수는 하나의 클래스 내부 전역에서 사용 가능한 변수를 말하고, 지역 변수와 구분되는 개념이었다.
  • 오늘의 소소한 이슈행~

알고리즘 모의고사

  • 알고리즘 주차답게 알고리즘 모의고사를 봤다.
  • 물론 그동안 풀었던 알고리즘보다 쉽게 나온 문제였다.
  • reple.it 코드
  • 간단한 해설을 덧붙이자면, 파라미터로 받아온 두 배열을 반복문을 통해 돌며 값의 차이를 저장하고 stream을 통해 이를 합해준 값을 리턴한 코드.
  • 굳이 굳이 stream을 활용하고 싶어서 답을 배열에 담았으나 성능면에서는 더 안좋을 듯 하다! 😅 (그냥 int answer; 에 넣어버려도..)

파이썬 링크드리스트 add, remove 메서드 구현


1일1로그 100일 완성 IT 지식

  • SSD는 플래시 메모리를 사용하여 비휘발성을 띤다. (전원이 꺼져 있어도 개별 소자에 전하를 유지하는 회로에 정보가 전하 형태로 저장된다.)

2) 코멘트

오늘까지 자바 알고리즘 풀이에 꽤 집중했다.
내일 마저 두문제를 풀고, 나머지 시간에는 알고리즘 개념에 조금 더 투자해야겠다.

profile
BackEnd Developer

0개의 댓글