반복문 내에서의 변수 선언
요즘 들어 호기심만 늘고 있다. 초보자는 원래 다 이런 것 같다.
코드를 쓰다보면 의문이 드는 구간이 있다. 그게 뭐냐면 바로 '반복문에서는 변수를 어떻게 선언해줘야할까'에 대한 것이었다. 말로 설명하자면 복잡하니 바로 예문으로 들어가겠다.
while(true){
Object obj = new Object("반복문 안에서 선언했어요");
}
Object obj;
while(true){
obj = new Object("반복문 안에서 선언했어요");
}
이런 상황 한 번씩은 겪어봤을 것이다. 그러면 여기에서 우리는 어떻게 코드를 선언해주는게 좋을까?
나의 생각을 말하자면, 전자가 낫다고 생각한다. 내 생각엔.
후자의 코드로 적용을 하는 사람들의 경우, String str이 계속해서 선언되는 것을 경계하기 때문에 반복문 밖에 정의를 해놓은 것일 것이다.
하지만, 실질적인(유의미한 수준의) 메모리 할당은 인스턴스를 선언하는 구간에서 나타난다. 비어있는 변수를 선언하는데 드는 리소스는 무의미한 수준으로, 극히 미미하다. 메모리를 걱정할 것이었다면 반복문 안에 new 자체를 주지 말았어야 한다.
개인적인 생각으로 후자의 경우는, 밤톨만한 리소스를 아끼기 위해 가독성을 포기한 형태라고 생각한다. 오히려 반복문이 끝나고 그 쓸모를 잃은 해당 오브젝트가 메모리를 점유하고 있는 것이 더욱 아까운 상황이라고 본다.
참고로, 상단의 예는 극단적인 예시로, 반복문 안에서 객체를 계속 선언하는 안일한 행위는 GC를 당해 성능과 관련이 있는 결과를 불러올 수도 있으니 저런 식으로 짜는 것은 애초에 피할 수 있다면 최대한 피해야 한다고 생각한다.
물론, 아래의 상황에서는 외부에 선언해주는 것이 바람직할 것이다.
Object obj = new Object();
while(true){
String str = obj.toString();
}
// while문 안에 Object obj = new Object(); 해버리면 메모리 낭비가 극심하다.
... 라는 부분에 대한 생각을 하고 검색을 해보니, 이 부분에 대해 첨예한 대립을 하고 있는 개발자 커뮤니티가 있어서 그 부분의 글을 링크해본다.
'내가 배운 것들 > 기타' 카테고리의 다른 글
[SQL] SELECT 구문 작동 순서 (0) | 2022.01.10 |
---|---|
Youtube Data API v3의 검색 기능 매개변수들 (0) | 2021.12.17 |
DB에서 쓰는 관계(Relation)가 뭘까? (0) | 2021.12.03 |
REST API가 뭘까? (0) | 2021.11.29 |
WAS가 뭘까? (0) | 2021.11.29 |
댓글