ITEM 15 :: EFFECTIVE C#
안녕하세요, 15번째 시간입니다. 그렇다구요.
이번 챕터는 불필요한 객체를 만들지 말자, 에 대한 내용인데, 그 이유를 몇 가지 풀어서 설명하려 합니다. 표면적으로만 봐도 불필요 객체를 많이 만들게 되면 메모리 효율이 나빠지는 것은 당연하니까요.
설명
-
책에서는 자주 객체를 생성해 사용할 경우 해당 객체를 멤버변수로 변경하는 방법을 추천하고 있다.
-
그 이유는 객체를 매번 필요할때마다 생성하고 다시 메모리 반환하는 것은 효율이 너무 안 좋기 때문이다.
-
또한 자주 사용되는 참조타입의 인스턴스를 정적 멤버 변수로 선언하는 것을 권하고 있다.
-
그 이유는 이 클래스에서도 참조되고 저 클래스에서도 참조되고, 다른 화면에서도 참조되고, 이 화면에서도 참조된다고 생각해보자.
-
그렇게 되면 아무리 멤버변수로 선언을 한다고 해도, 해당 객체를 클래스마다, 혹은 화면마다 만들어줘야 한다. 그 또한 객체가 잡고있는 메모리가 늘어나는 것이기 때문에 효율이 좋지 않다.
-
따라서, 해당하는 인스턴스를 정적 멤버변수로 선언하여 한곳에서만 선언하고 여러곳에서 공유하여 쓰는 방법을 권하는 것이다.
-
마지막으로 String에 대한 말이 나오는데, 이 부분에 대해서는 매우 당연하다고 생각한다. String 객체를 생성하여 특정 문자열을 넣어놓고, New()를 사용하여 내용을 추가한다거나 하면, 겉으로 보이기에는 기존 객체에 문자열이 더해진 것으로 보이겠지만, 내부적으로는 하나의 새로운 객체가 생성되어 더해진 값을 가지게 되고 이전의 객체는 가비지가 된다는 것이다. 따라서, 문자열을 더하거나 변경하고, 초기화를 하는 경우에는 StringBuilder 나 문자열보간, String.Format을 사용하는 것이 좋다!
-
추가적으로 객체를 많이 만들게되면 가비지가 발생했을 때 GC의 작동이 더욱 잦아지고 그것은 곧 성능 저하로 이어진다!
정리
- 위에는 장황하게 설명되어있으나 결국 말하는 바는 ‘자주 사용하는 객체’는 멤버 변수로 선언하여 객체의 생성 빈도를 줄이고, 좀 더 넓은 범위에서 사용되는 인스턴스의 경우에는 정적으로 선언하여 이 역시 객체의 생성 빈도를 줄이라는 것이다. 객체의 생성은 곧 소멸을 가지고 있는 것이고, 그 말은 GC를 호출하게 되는 것이니까!