C# 반복문 변수 선언과 메모리에 관한 고찰

2023. 12. 28. 21:26개발/C#

오늘 회사에서 코드리뷰를 진행했다.

현재 내가 진행중인 프로젝트를

주 2회 코드리뷰를 진행중이다.

 

코드리뷰를 진행하면서

한 가지 피드백이 있었다.

private void WriteGumiIssue(Excel.Worksheet secondSheet)
{
    for(int i = 0;i<companyMgr.GumiCompanyList.Count;i++)
    {
        string issueChannelInfo = "";   // 반복문 내 변수선언

        CompanyInfo company = companyMgr.GumiCompanyList[i];  // 반복문 내 class 선언

        if (company.Channels.Count == 0)
        {
            continue;
        }

        for(int j = 0; j < company.Channels.Count; j++)
        {
            CompanyChannelInfo channel = company.Channels[j]; // 반복문 내 class 선언
            issueChannelInfo += channel.ChannelIp + " " + channel.ConnectionStatus + " 수신율 : " + channel.ReceiveRatio + "\r\n";
        }
        
        .
        .
        .
        .
        
    }
}

 

반복문 내 선언에 대한 피드백을 받았다.

팀 내 부장님께서는

 

위 코드처럼 작성하면

메모리나 성능에 문제가 된다.

for문의 크기인 companyMgr.GumiCompanyList.Count 의 크기만큼

변수 및 class가 선언될때마다 메모리 영역이 할당된다

 

피드백을 들었을 당시

아 그렇구나 수정해야겠다

생각하고, 대답했지만

 

퇴근할때 쯤 되니 궁금해졌다.

왜 문제가 되는지 더 자세히 알고싶어져서

퇴근 후 집가서 알아봐야지~ 하고

이제서야 알아본 내용이다.


결론

결론은

상관없다 or 오히려 계산이 더 빠르다

 

프로그램이 운영체제로부터 할당받는

메모리 공간은 크게 4가지가 있다.

 

코드, 데이터, 스택, 힙

 

오늘 중점적으로 다룰건 스택 & 힙 2가지다.

 

1.스택

- 일시적으로 사용 & 사용 후 삭제되는 영역

- 해당 객체가 사용된 스코프를 벗어날 시, 삭제됨

- ex) 지역변수, 매개변수는 함수 종료 시 삭제

 

2.힙

- GC ( Garbage Collector ) 에 의해 메모리 자동 관리됨

- malloc() & new 를 통해 메모리 할당, free() & delete 를 통해 메모리 해제

- 선입선출 ( FIFO ) 방식


private void WriteGumiIssue(Excel.Worksheet secondSheet)
{
    for(int i = 0;i<companyMgr.GumiCompanyList.Count;i++)
    {
        string issueChannelInfo = "";   // 반복문 내 변수선언

        CompanyInfo company = companyMgr.GumiCompanyList[i];  // 반복문 내 class 선언

        if (company.Channels.Count == 0)
        {
            continue;
        }

        for(int j = 0; j < company.Channels.Count; j++)
        {
            CompanyChannelInfo channel = company.Channels[j]; // 반복문 내 class 선언
            issueChannelInfo += channel.ChannelIp + " " + channel.ConnectionStatus + " 수신율 : " + channel.ReceiveRatio + "\r\n";
        }
        
        .
        .
        .
        .
        
    }
}

 

즉, 나의 경우

지역변수를 for문 내에 선언했기 때문에

 

어차피 스택으로 관리되는 메모리라

함수 종료 시 삭제된다.

-> 성능에 큰 영향 미치지 않음

 

오히려 스코프 기준으로 봤을 때

외부에서 사용할 변수가 아니므로

for 내부에 위치하는게

더 효율적이라 할 수 있을 것 같다.