C# - class & structure

2024. 2. 10. 14:20개발/C#

사내에서 지금까지 개발한 데이터 수집 엔진( 프로그램 )이

총 3가지 있다.

 

요약하자면 A->B->C 순으로 업그레이드 됐는데,

 

여전히 A, B 엔진이 적용된 곳이 있어서

 

그 중에서 B 엔진을 C 엔진에 맞게 업그레이드? 병합? 하는 작업을 진행했다.

 

병합 작업을 진행하면서, 나의 부족한 C# 개발 지식으로 다양한 오류를 접하게 됐다.
참조한 reference가 null 오류

컬렉션 수정 오류 등

너무 오류가 많아서 골치아팠다.

 

오류의 원인을 찾아보았다.


1. 비효율적인 class 사용

코드를 작성할 때

최소한의 class 단위로 구분해서 작성하라는

입사 초반 지시에 맞게 개발을 진행해왔다.

 

그러다보니 아무이유없이

무조건 class만 사용해서 개발해왔다.

 

변수 선언이나 구조를 잡을때도 무조건 class만 사용해왔다.

그러다보니 자연스레 문제점이 발생했다.

 

  • B엔진에서 외부 데이터를 MQTT로 수신
  • 외부 데이터를 병합할 C 엔진 구조에 맞게 파싱

엔진을 병합하는 기준을 위처럼 크게 2가지로 나눌 수 있는데

외부 데이터를 MQTT로 수신 후,

값만 저장해서 Parsing 및 저장하는 로직을 개발중이었다.

 

즉, 외부 데이터를 MQTT로 수신할때마다

데이터를 갖고있는 class 객체를 매번 생성해주면서

새로운 객체를 계속 갖고있게끔 개발을 했다.

 

객체 생성이야 문제는 없지만

그 생성된 객체가, 값 저장 외에는 별다른 역할이 없기 때문에

 

아주 비효율적이라고 생각이들었다.

 

하지만 해결책이라고 떠오른 아이디어도
틀에박혀서 class 사용을 벗어나지 못했다.


해결책 1

-객체를 1개만 생성, 외부 데이터 수신마다 값만 update

 

객체를 매번 new 하지 않고, 객체를 최초 1회 생성 후,

객체가 필요한 class들이 생성될때마다 

최초 생성된 인스턴스를 전달해주는 방식으로

해결책을 적용해보았다.

하지만

 

인스턴스가 필요한 DevicePacketClass가 매번 new 되기 때문에

인스턴스를 1개만 갖고있는다고 해도

 

결국 여러개의 DevicePacketClass 들이

동일한 인스턴스 1개를 공유하는 셈이다.

 

물론 class라서 힙 메모리에 저장되니까

reference가 참조되어

원본값을 그대로 갖고있는게 또 문제긴 하다.

실패


해결책 2

-struct 사용

 

몇시간 고민한 끝에,

몇시간 틀에박힌 생각을 거듭한 끝에서야

 

class를 벗어날 수 있었다.

 

현재 내가 처한 오류의 근본적인 원인을 찾지 못했기 때문에

문제가 뭘까? 라는 생각을 버리고

내가 필요한 경우가 뭘까? 로 생각을 바꿔봤다.

 

내가 필요한건,

1.외부 데이터 MQTT 수신

2.수신한 데이터 값 저장 및 Parsing

 

난 "값"만 필요한 것이기 때문에

굳이 class로 선언해서, 

그 class 안에 list를 만들고

 

그 list를 참조할 수 있게,

class 인스턴스를 new 하고, 등의 과정이 필요없는것이다.

 

그냥 structure로 파싱할 데이터 구조만 static으로 잡고,

그 structure에 값만 저장하고, 참조하면 되지 않을까? 로 결론이 났다.


해결책2 적용, 성공

structure 데이터를 List에 저장, static 선언
선언한 List를 가져오는 메소드 호출

 

다른 class에서 참조할 List를

static으로 선언, 

 

List안의 값들이 가진 structure를 선언해서

굳이 class의 인스턴스를 만들 필요없게끔 수정했다.


많이 반성할 수 있었던 시간이었다.

물론 알 수 없는 원인을 찾는게 힘들었지만

 

어쨋든 개발하면서 코드상으로 가장 중요한건

한 줄 한 줄 마다

 

내가 '왜' 이 코드를 사용했는지

이유를 명확히 알고있는게 굉장히 중요하다는걸 다시 느낄 수 있었다.

 

원래 알고 있었지만,

chatGPT를 사용하면서 

AI가 제공해주는 코드를 한 줄 한 줄

다시 구글링해보며 사용해왔지만

 

이번일처럼 나도 모르게
'그냥' '지금껏 그랬으니까' 식의 개발습관이 들어서는 절대 안되겠다고 다짐했다.

'개발 > C#' 카테고리의 다른 글

Modbus TCP 제어 ( 패킷 과수신 대비 )  (3) 2024.03.06
Encoding  (1) 2024.02.14
소프트웨어 설계 수정  (0) 2024.01.08
모니터링 자동화 - API Parsing  (1) 2024.01.01
C# 반복문 변수 선언과 메모리에 관한 고찰  (0) 2023.12.28