버그를 유발하는 enum의 괴상한 기본 동작

Поделиться
HTML-код
  • Опубликовано: 14 ноя 2024

Комментарии • 58

  • @ZeroDiscomfort
    @ZeroDiscomfort 2 месяца назад +13

    결론: 주니어 개발자가 언어 명세를 읽어보지 않고 코드짜다 생긴 버그다

    • @포프티비
      @포프티비  2 месяца назад +11

      Aㅏ.. 나는 주니어

    • @hobis0b
      @hobis0b 2 месяца назад +2

      반박불가 틀린말은 아니내 ㅋㅋ
      하지만 기능자체가 c++의 기본적인 메카니즘이 같기때문에 그럴겁니다. 이넘의 가장강력한 기능은 비트프래그 연산이라, 이것을 사용하기 위해서라도 중요한 부분이죠.
      따봉 누른다고 진짜 주니어 되시는건 아니겠죠? ㅋ

  • @only2sea
    @only2sea 2 месяца назад +4

    이게 좀 회색 영역이군요. Parse는 ToString에서 나올 수 있는 출력 이상의 것을 Parse 하는 건 당연한 동작이긴 한 거 같아요. ToString은 normalize 된 깔끔한 스트링을 내 놓지만 Parse는 그 이상의 입력값도 받으니까요. 빈칸이 앞 뒤에 들어가 있다던지 소숫점이나 부동소수점 scientific notation 같은 것도 있고 해서 애매하지 않게 처리만 가능하면 파싱해 버리는 게 기본 동작인 거 같네요. 버그가 아니라 원래 그런 녀석이라고 이해하는 게 더 맞을 듯.

  • @my_name_is_gonan
    @my_name_is_gonan 2 месяца назад +4

    Enum 모르면 당신은 주니어

  • @J0sh9
    @J0sh9 2 месяца назад +4

    Enum의 Parse라는 함수 자체가 string 형태의 데이터를 분석해서 해당하는 Enum으로 변환시켜 주는 함수라는 걸 생각하면 "0"과 "East" 둘 다 파싱 되는 게 올바르게 동작하고 있는 것 아닌가 하는 생각은 드네요
    제가 해당 함수를 만들었다고 생각해 봤을 때 고민은 하겠지만 그래도 보편적인 정의에 따라서 설계하고 나머지는 사용자에게 맡기는 게 더 좋은 방법이라 생각되어서 "0"도 파싱 되게 했을 것 같기도 하고요
    다만 현업에서 실제로 enum을 저렇게 숫자로 그것도 굳이 string 형태로 serialize 하는 경우가 거의 없으니 실제적인 실효성은 거의 없고 특정 상황에서 버그를 유발할 수 있다는 건 동의합니다
    결국 실제 사용 사례에 중점을 둘 건지, 아니면 논리/철학적인 정의에 중점을 둘 건지의 차이인 것 같아요
    여담으로 실제 "0"으로 사용하고 있는 곳이 얼마나 되는지도 궁금하네요
    워낙 기상천외한 코드들이 많으니

    • @bnmy6581i
      @bnmy6581i 2 месяца назад +1

      생각하게 만든 코드는 좋아보이지는 않군요 ㅎㅎ

    • @J0sh9
      @J0sh9 2 месяца назад

      ​ bnmy6581i 숫자 string이 파싱 된다고 해서 문제가 생기는 케이스가 크진 않을 것 같아서요
      애초에 서버 개발자가 enum을 숫자 string으로 내려주거나 클라 쪽에서 같은 방식으로 올려주는 케이스는 그 개발자가 더 큰 문제이지 않을까요?
      포프님이 말씀하신 데이터 변조의 경우에도 숫자를 파싱하지 않는다고 해도 유저가 다른 enum으로 변조가 가능하다면 숫자를 넣거나 다른 enum을 넣거나 어차피 같은 문제가 생기는 게 아닌가 하는 생각이 드는데 제가 놓치고 있는 부분이 있을까요?

  • @ZeulS2
    @ZeulS2 2 месяца назад +1

    소중한 경험을 공유해주셔서 감사합니다

  • @johnsim8102
    @johnsim8102 2 месяца назад +3

    아 뒷목... 잠을 덜 잔건가, 그만큼 enum parse에 충격을 먹은건가...

  • @MrSeungseung
    @MrSeungseung 2 месяца назад +1

    결론: Document를 잘 읽고 사용해야 한다.

  • @longtimenosee-k2p
    @longtimenosee-k2p 2 месяца назад +3

    재밌는 버그네요. 이전에 라이브에서도 질문한적 있긴한데 포프님의 c# 의 dynamic 키워드에 대한 생각도 들어보고 싶습니다. 저는 c#에서 json 받아서 사용할때 json이 타입이 명시되지 않아 dynamic 넣어서 처리하곤 했는데... dynamic에대한 생각이 궁금합니다 !

    • @nortina2211
      @nortina2211 2 месяца назад

      System.Text.Json 패키지에 있는 JsonSerializer 좋아요
      Deserialize 메소드에서 T를 원하는 클래스로 구현하고 쓰시면 됩니다
      클래스 만들기 귀찮으면 Visual Studio에서 편집 > 선택하여 붙여넣기 > JSON을 클래스로 붙여넣기 하시면 편합니다

    • @yoonkim3198
      @yoonkim3198 2 месяца назад

      ​@@nortina2211 오와 json to class가 있어요? 대박

    • @longtimenosee-k2p
      @longtimenosee-k2p 2 месяца назад

      @nortina 그 방법도 생각해봤는데 제가 쓰는 json 은 추가되는 키나 삭제되는 키의 빈도가 많아 매번 class까지 같이 업뎃해줬어야했습니다. 그 당시 만들었던 tool은 이런 json을 일괄 편집하는 툴이었어서 그방법을 쓰기엔 좀 번거로웠네요.

    • @포프티비
      @포프티비  2 месяца назад +1

      전 dynamic 안쓰고 json마다 클래스를 만들어 씁니다. (사실 json을 클래스에서 뽑아내기도 하고요)

  • @lavivida9328
    @lavivida9328 Месяц назад

    enum 멤버 이름이 숫자로 시작할수 없기때문에 허용하지 않았을까요 ㅎㅎ
    그와는 별개로 명확성을 위해서라면 확장메서드로 Enum.TryParseFromValue, Enum.TryParseFromMember 만들어서 쓸거같습니다 ㅋㅋ

    • @포프티비
      @포프티비  Месяц назад

      TryParseFromValue는 int parse한 뒤 형변환 하면 되는 거라 별도로 필요하진 않을 거 같아요

    • @lavivida9328
      @lavivida9328 Месяц назад

      @@포프티비 동작으로만 따지면 단순하기때문에 그렇게 판단할수도 있지만.. 저흰 자주 재사용되면 동작에 대한 의미를 부여해주는게 더 좋다고 생각합니다. 또한 메소드 파라미터에서 해당 enum에서 정의된 값 이외의 숫자형 string이 넘어온다면 예외로 처리할지 말지도 컨트롤 가능하잖아요?

  • @hobis0b
    @hobis0b 2 месяца назад

    이런 영상 너무 기다리고 있었어요 ㅋ
    자바도 언젠가 enum이 추가되었지만
    자바는 static 맴버에 west문자열을 담아서
    사용하는 방법도 있습니다.
    다만 이넘의 장점인 비트프래그연산이
    안되는 단점이 있죠.
    이런문제가 있는건 처음 알았내요

  • @trustarMello
    @trustarMello 2 месяца назад

    영상 enum 파싱문제 내용만 때다가 따로들으면 쌩 javascript 내용인줄알겠네요😂 놀랍...

  • @흑연-t6u
    @흑연-t6u 2 месяца назад

    통상적으로 DB저장할때는 보통 INT형으로 저장하니까 String형을 Parse하는 것보다 더 자주 쓰이니 그렇게 결정한것 같네요. 위험성을 예측하고 외부에 노출되는것은 의도적으로 막은걸로 보입니다

    • @포프티비
      @포프티비  2 месяца назад +1

      Db에서 온건 곧바로 이넘으로 캐스팅해서 대입할거 같은데요.(실제 ef core도 그렇게 도는 거 같고)
      오히려 이넘 parse를 써야할때는 도큐먼트(예: json)에서 디시리얼라이즈 할 때인거 같아요.

  • @Gogibangpae
    @Gogibangpae 2 месяца назад +1

    출근해서 C#쓰고 있었는데 바로 지식 하나 얻어갑니다..!

  • @Cso_ko
    @Cso_ko 2 месяца назад

    포프님이 사용하시는 함수 사용에 대한 규칙은 언급한적이 있는데, 클래스 사용에 대한 규칙도 존재한다면 알고싶습니다. 구조체와 함수만으로 사용하는경우와 클래스로 명시적으로 구조체와 함수를 결합시키는경우에 대한 규칙이 있으시다면 답변 부탁드려요!

    • @포프티비
      @포프티비  2 месяца назад +1

      언어따라 다른데...
      C++이란 가정하에 말씀드리면 제가 구조체를 쓰는 경우는 매우 한 정적입니다.
      1. 곧바로 대입으로 값이 복사되어야할 때
      2. 구조체의 메모리를 그대로 하드에 시리얼라이즈 디시리얼라이즈 할 때
      3. 멀티스레딩 잡 시스템의 데이서로 전달하기 위해 데이터를 만들때 (data driven design, data oriented design)
      개인적으로 필요에 따라 struct안에 함수 한 둘 넣는 건 크게 개의치 않아요.

  • @함종완-s1q
    @함종완-s1q 2 месяца назад

    저도 쓸때 주의해야겠습니다~:^

  • @구제용-d1s
    @구제용-d1s 2 месяца назад

    enum은 좋은넘이다..

  • @msfklfl123
    @msfklfl123 2 месяца назад

    영상 주제랑 동떨어지는데 9월에 스페이스마린2가 나오는데 김포프님 생각나더라구요.

    • @포프티비
      @포프티비  2 месяца назад

      제 자식 같은 놈이죠....

  • @gwisekor
    @gwisekor Месяц назад

    이놈........음..ㅋㅋ, enum 귀찮아서 그냥 string쓰고 있긴 한데

  • @오지환-s2v
    @오지환-s2v 2 месяца назад

    Newtonsoft Json을 사용하지 않고, C# 빌트인을 사용하시나 보군요 😮

    • @포프티비
      @포프티비  2 месяца назад

      현재는 둘다 쓰는데 c# 빌트인으로 마이그레이션 중이에요.

  • @doltoBlorin
    @doltoBlorin 2 месяца назад

    누가 말해주던데
    특정 언어에대한 불평과 욕이 많다면, 그 언어를 해야한다고 😂😂

    • @ZeulS2
      @ZeulS2 2 месяца назад

      그럼 Javascript 죠 ㅎㅎ

  • @ricepotato492
    @ricepotato492 2 месяца назад

    새로 구현하신 parse 는 그럼 잘못된 값, 숫자나 엉뚱한 문자열 값 이 들어오면 어떻게 반응하나요? null 이 되나요? 예외가 발생하나요?

    • @포프티비
      @포프티비  2 месяца назад +1

      Parse는 예외. TryParse는 false 반환. 이건 시샵에서 정형회된 패턴이죠. 널을 사용하지 않는.
      참고로 enum은 value type이라 null이 될수 없어요

  • @deathcaliburJr
    @deathcaliburJr 2 месяца назад

    그럼 pocu 아카데미에도 위 내용이 반영될 예정인가요?

    • @포프티비
      @포프티비  2 месяца назад

      아뇨. 이런 자잘한 건 굳이 가르치지 않습니다.

  • @wayhope
    @wayhope 2 месяца назад +2

    이런거 너무 좋아요

    • @포프티비
      @포프티비  2 месяца назад +2

      괴상한 거 좋죠...(응?)

  • @frogkim2933
    @frogkim2933 2 месяца назад

    숨겨진 BABO!

  • @chrisshim2488
    @chrisshim2488 2 месяца назад

    Discriminated Union 추가 기원 🙏

  • @lineY
    @lineY 2 месяца назад

    enum 잘못쓰면 enum함 ㅋㅋ

  • @주정열-n4p
    @주정열-n4p 2 месяца назад

    세상에 모르고 있었어요

    • @포프티비
      @포프티비  2 месяца назад +1

      저도 시샵 오래썼는데 최근에야 알았죠. 🫠

    • @주정열-n4p
      @주정열-n4p 2 месяца назад

      @@포프티비 하나 또 배워갑니다 감사합니다

  • @방재웅-g2f
    @방재웅-g2f 2 месяца назад

    앤더스 해즐버그

    • @포프티비
      @포프티비  2 месяца назад

      에.. 이름에도 버그가....

  • @포시타
    @포시타 2 месяца назад

    의도가 아니라 잘못 만든 거일까요?

    • @포프티비
      @포프티비  2 месяца назад +1

      시샵 첨 나왔을땐 그 방식이 말이 되었다고 생각해요

  • @삐뽀키키킥으헤헤
    @삐뽀키키킥으헤헤 2 месяца назад +1

    저도 가끔 공부하다가 괴상한 포즈를 취하곤 하는데, 그게 전부 포프님을향한 막연한 사랑 때문일까요...

  • @baek-v1s
    @baek-v1s 2 месяца назад +1

    c# 의 성별은 여성이었군요?

  • @hobis0b
    @hobis0b 2 месяца назад +1

    이넘이 대단한넘 이군요