(그냥 한 번 귀여운 짤 가지고 와봤슴다. 다들 보고 힐링하시길~ㅎㅎ)
![](https://blog.kakaocdn.net/dn/bF957K/btrKGSwvWGt/zOAlQqImJ9R1WFZ6dIiTt1/img.png)
오늘도 어김없이 과제를 늦게 제출했다. 다른 부분들은 다 구현해놓고 마무리가 안되는 구간이 있었는데, 마침 노아님과 홀맨님께서 와주셔서 길을 잃고 헤매고 있는 나에게 빛과 소금같은 힌트를 주고 가셨다. (감사합니다x100) 이게 아니었으면 오늘도 제출 못했을수도..(그리고 중간에 또 삽질하고 있으니 먼저 와서 도와주신 ㅈㅇ(익명성)님 감사합니닷ㅎ) 근데 생각해보면 당연한 해결방법이였는데 너무 복잡하게 생각하고 있었던 것 같다. 이상한 메서드나 잔뜩 찾고 있었으니 하핳.
아래 food 문자열 배열을 랜덤으로 값이 출력되게 셔플하면서, 각 음식의 가격인 foodPrice 도 같은 인덱스 번호값을 가지도록 따라가게 하려면 어떻게 해야 할까?
String[] food = {"1. 햄버거", "2. 피자", "3. 치킨", "4. 커피", "5. 케이크", "6. 족발"};
int[] foodPrice = {1, 5, 3, 1, 2, 4};
for (int i = 0; i < 20; i++) {
int x = random.nextInt(6);
int y = random.nextInt(6);
//String[] food 배열 셔플
String temp1 = food[x];
food[x] = food[y];
food[y] = temp1;
//int[] foodPrice 배열 셔플
int temp2 = foodPrice[x];
foodPrice[x] = foodPrice[y];
foodPrice[y] = temp2;
}
//배달 횟수에도 랜덤 번호를 줘서, 그 랜덤 번호만큼 반복문을 돌려주면
//이미 셔플된 문자열 배열에 있는 값들이 2개, 3개, 4개 등등 매번 랜덤으로 나오게 됨
int orderCount = random.nextInt(6) + 1;
for (int i = 0; i < orderCount; i += 1) {
System.out.println(food[i]);
income += foodPrice[i];
}
배열이니까 인덱스로 접근해서 인덱스 위치값만 서로 셔플해주면 된다. 가격도 같이 따라가야 하니 가격도 같은 인덱스 번호로 셔플. 이후에 배달 횟수에 랜덤 번호를 주면, 랜덤으로 셔플된 문자열 값들이 랜덤 번호에 의해 매번 나오는 순서와 횟수가 바뀌게 됨. 너무 당연해서 놀라셨죠? 저도 놀랐습니다~
![](https://blog.kakaocdn.net/dn/lV2t2/btrKGPzMqXM/QWSC2pJGeU6cN7ksPYZaJ1/img.png)
생각해보면 진짜 너무 간단하고 당연한건데 이걸 생각 못하고, 정수와 문자열이 같이 랜덤으로 섞이게 하려면 어떻게 해야 하는지, charAt() 메서드, 셔플 메서드, 문자열과 정수 랜덤 이런 거나 찾고 있었다. 과제할 때 보면 항상 너무 복잡하게 생각하는 경향이 있다. 너무 머릿속이 복잡하면 잠깐 환기를 위해 옥상이라도 다녀와야 겠다..
그리고 오늘은 대망의 코딩 인터뷰 날이였다. 저번주에 너무 준비를 안했어서 큰 갑분싸를 만들었던 기억 때문에 이번주는 코딩 시간 빼고 출퇴근 이동시간이나 집 가서 저녁에 밥 먹을 때 등등 짬 날때마다 개념노트를 암기했다. 근데 또 무대체질은 아니어서 혹시 인터뷰 때 머릿속이 새하얘질까봐 계속 걱정했었는데 다행히 현장에서 나뿐만 아니라 모두 무난하게 넘어갔던 것 같다. 그리고 아는만큼 보인다는 말이 확 와닿은 게, 분명 저번주에는 동기분들이 무슨 얘기를 하든 다 외계어처럼 들렸었는데 이번 주는 한 사람씩 차례대로 나와서 발표할 때도 다 쉽게 이해가 되는 것이,, 역시 뭐든 노력을 해야 보상이 있는 것 같다. 지금 암기하고 있는 개념들도 사실 인터뷰만을 위한, 면접만을 위한 개념들이 아니라 기본 상식 같은 느낌이라 이렇게 외울 기회가 있다는 것도 너무 다행이다!! 3주차부터는 외우는 양이나, 공부해야 하는 양이 더 많아지는 데 저번주처럼 벼락치기는 하지 않고 최대한 꾸준히 나의 머릿속 노트를 채워 나가야 겠다.
그리고 또, 이번에 GC (가비지 콜렉터) 관련 공부를 하면서 Heap 영역에 세분화되어 있는 메모리 영역중에 Permanent 영역 (Java 8 부터는 Metaspace 영역으로 변경됨) 이 사라진 이유는 공부하지 못했다. 근데 이번에 홀맨님께서 따로 링크를 올려주셔서 정리해보려고 한다. 개념노트에도 추가 정보로 보완해놔야겠다. 요약하자면 아래와 같다.
![](https://blog.kakaocdn.net/dn/cvVuo7/btrKGpOR7vv/jqA60KYyxIFykEaBElPxM0/img.png)
기존 Perm 영역은 보통 클래스의 메타 정보나 Static 변수와 상수 정보들이 저장되는 공간이었다. 이 영역은 Java 8 부터는 이제 더 이상 Heap 영역에 있지 않고 OS 레벨에서 관리하는 네이티브 영역에 있으며 이름도 Metaspace 영역으로 변경되었다. 기존에 Perm 영역에 저장되었던 클래스의 메타 정보가 이 영역에 저장된다. (다만, Perm 영역에 존재하던 Static Object 는 Heap 영역으로 옮겨져서 GC의 대상이 최대한 될 수 있도록 하였음.) 왜 바뀌었을까?
지금은 Static 클래스와 상수는 Heap에 저장되지만, JDK 8 이전에는 Perm 영역에 저장되었다. 동적으로 클래스들이 로드되고 Static 변수나 상수가 사이즈가 정해진 Perm영역에 쌓이게 되면 OutOfMemoryError 문제가 발생한다.
![](https://blog.kakaocdn.net/dn/8xx0A/btrKFBihZWk/4r8LcH4M0UklVxvE0mcuW0/img.png)
Perm 영역은 기본값으로 제한된 크기를 가지고 있고 JVM 에 의해 크기가 강제로 조정되는 영역이였다. 하지만 Metaspace 영역은 크기 제한이 없다. 그래서 필요한 만큼 계속 늘어나기 때문에 개발자는 메모리 상한선을 크게 의식할 필요 없이 개발을 할 수 있다. JVM 에서 관리하던 각종 메타 정보를 OS 가 관리하는 영역으로 옮겨 Perm 영역의 사이즈 제한을 없앤 것이다.
하지만 아무리 메모리 영역이 무제한으로 늘어난다고 해도 메모리 누수 문제가 아예 사라졌다고 할 수는 없다고 한다. 오히려 메모리 누수로 인해 네이티브 메모리가 소모될 수 있기 때문에 무작정 영역 크기의 제한없이 사용하기보다는 최적의 설정값을 찾아 메모리 낭비를 방지해야한다.
action plan : 오늘 정리한 Metaspace 내용 개념노트에 보완해놓기
'TIL' 카테고리의 다른 글
스노우볼 멈춰,, (22.08.28 TIL) (0) | 2022.08.28 |
---|---|
시간 분배 연습 (22.08.27 TIL) (0) | 2022.08.27 |
작은 부분에서 큰 부분으로 (22.08.25 TIL) (0) | 2022.08.25 |
습관성 코드 남발하지 않기 (22.08.24 TIL) (0) | 2022.08.24 |
언제나 조져지는 건 나였다 (22.08.23 TIL) (0) | 2022.08.23 |
댓글