C# 함수안에 다른 함수 선언 후 전체 함수 종료

안녕하세요
c# netframework 4.8에서 작업중인데 질문이 하나 있습니다.

class A : IFCTest
{

    public void Start()
    {
         //
        List<string>  xml = StudentList();
    }

    public List<string> StudentList()
    {
         foreach(string xml in StudentList)
         {
            Datacheck(xml);
         }
    }

   public void DataCheck(string)
   {
         if(string =="foo")
                return null; //여기서 상위 함수도 종료하고싶습니다
    }

}

이런식으로 class A에 IFCTest라는 인터페이스를 상속받아서 작업중인데
Start함수를 실행 → public List StudentList() → DataCheck 함수에서 특정 조건(if(string ==“foo”))에 걸리면
Start함수 자체를 종료하고 싶은데 방법을 잘 모르겠습니다…

1 Like

DataCheck 함수를 리턴받아서 그 값에 따라서 StudentList 안에 있는 foreach 문에서 return하고…또 바깥 Start에서 리턴하고 그러면 되는거 아닌가요?

다른 창의적인 방법을 원하시는 건가요?

2 Likes

앗 저는 혹시 듣기로는 자바같은 경우는

throw new Exception()

로 return 작업을 여러번 안해줘도 되는거 같더라고요…(아직 제대로 확인은 못했습니다)
혹시 c#에서도 비슷한 기능이 있는지 궁금했습니다! ㅎㅎ

답변 감사합니다 일단 그렇게 진행해보겠습니다 ㅎㅎ

3 Likes

오잉…자바든 아니든 바깥으로 빠져나가기 위해 예외를 던지다뇨…?? 그런 처리 방식은 듣도보도 못했네요…물론 결과만 보면 그렇게 해도 되긴하는데 상당히 비정상 적인 방법으로 보여집니다.

굳이 원하시면…C#도 그렇게 하시면 예외를 걸어서 바깥으로 나갈 수는 있습니다.

5 Likes

"중첩된 반복문 안에서 특정 레벨의 루프문 까지만 탈출하고 싶다"와 비슷한 고민일 것 같은데요, 이 정도라면 보통은 로직을 리팩토링하는 것이 좋아 보이며, 흔히 말하는 '코드 스멜’에 해당되는 것 같습니다.

만들고자 하시는 코드가 어떤 목적을 달성해야 하는지 알 수 없어 부정확한 답변이 될 수 있는 점 먼저 양해 구하겠습니다. 저라면, 다음과 같이 StudentList에 들어올 데이터를 미리 거르는 작업을 하지 않을까 예상해봅니다.

var xml = new List<string>();
//xml.Add("foo");

// 케이스 1: filteredList에는 foo 라는 문자열이 들어있지 않은 요소만 남습니다.
var filteredList = xml.Where(x => string.Equals(x, "foo", StringComparison.Ordinal)).ToList();
Console.WriteLine(filteredList.Count);

// 케이스 2: filteredList에 foo라는 문자열이 있을 경우 함수를 종료합니다.
var hasFoo = xml.Any(x => string.Equals(x, "foo", StringComparison.Ordinal));
if (hasFoo)
{
	Console.WriteLine("filteredList has foo.");
	return;
}

참고: 코드 스멜 - 위키백과, 우리 모두의 백과사전 (wikipedia.org)

8 Likes

답변 감사합니다! 또 하나 배운거같습니다 ㅎㅎ 감사합니다! :grinning:

3 Likes

편의를 위해 이런 생각을 해 볼 수는 있겠으나
SRP 를 생각해본다면 그다지 좋은 선택은 아니지요. -ㅁ-;;;

이 얘기가 그 얘기 입니닷…-ㅅ-;;;

메서드는 그 내부에서 자기 자신의 범위에 한 해서만 책임지도록 작성해야
의존성 밥 비벼 먹어서 보물찾기 하는 사태를 막을 수 있슴다…

아니면 직접 경험해 보는 것도 좋… 쿨럭… ;ㅂ;

7 Likes

로직 탈출을 오류 던지기로 탈출하는건
제 선입견일까요? 되게 안 좋을 것 같다는 생각이 드는데…
약간 흑마법(?) 같다는 느낌이 들어서요.

2 Likes

질문 다시보니깐 아찔하군요…답변 감사합니다

4 Likes

꼭 그렇지만은 않다고 전 생각해요. 그런 고민을 하는 것부터 좋은 코딩의 시작인 것 같아요. 화이팅~!

4 Likes

다른분은 어떨런지 모르겠는데
전 항상 과거에 쓴 제 코드가 맘에 안 들더군요 히히;
부끄럽고 쪽팔리고…

4 Likes

저도 그래요 ^^;

4 Likes

@StarDolarge 저도 매 순간이 아찔합니다… ㅋ

3 Likes