소소한 일상과 잡다한 정보

개발 & 서버/Dart

Dart_2일차 : 제어문과 함수 심화 학습

pandada 2025. 2. 17. 17:45
반응형

1. 조건문 ( if-else, switch ) 심화

 ✔️ if-else 문 심화

 if-else를 활용하여 다양한 조건에 따른 결과 출력

void main() {
  int score = 80;
  if (score >= 90) {
    print("A 학점");
  } else if (score >= 80) {
    print("B 학점");
  } else if (score >= 70) {
    print("C 학점");
  } else {
    print("F 학점");
  }
}

 ✔️ switch 문 심화

 switch문은 여러 개의 if-else를 간결하게 표현할 때 유용하다.

void main() {
  String grade = "C";
  switch (grade) {
    case "A":
      print("훌륭!");
      break;
    case "B":
      print("좋은 성적!");
      break;
    case "C":
      print("노력 필요!!");
      break;
    default:
      print("공부 필요!");
  }
}

 

 

2. 반복문 ( for, while, do-while )

 ✔️ for 문 ( List 순회 )

 for 문을 활용해 리스트의 모든 요소 출력

void main() {
  List<String> fruits = ["사과", "바나나", "포도"];

  for (int i = 0; i < fruits.length; i++) {
    print("과일: ${fruits[i]}"); // []를 문자열로 인식하기 때문에 중괄호를 통해 활용
  }
}

 ✔️ for-in 문 ( 더 간단한 List 순회 )

for-in 문을 사용하면 더 간결하게 List 순회를 가능

void main() {
  List<String> animals = ["고양이", "강아지", "토끼"];

  for (var animal in animals) {
    print("동물: $animal");
  }
}

 ✔️ while 문

 while 문은 조건이 참인 동안 반복

void main() {
  int i = 1;
  while (i <= 5) {
    print("반복 횟수: $i");
    i++;
  }
}

 ✔️ do-while 문 ( 최소 1회 실행 보장 )

 do-while은 조건을 나중에 검사하기 때문에 최소 한 번은 실행됨. 선실행 후 조건비교

void main() {
  int i = 1;
  do {
    print("최소 한 번 실행: $i");
    i++;
  } while (i <= 3);
}

 

3.함수(Function) 심화

 ✔️ 기본 함수

 void는 반환 값이 없는 함수

void sayHello() {
  print("Hi!");
}

void main() {
  sayHello(); // 함수 호출
}

 ✔️ 매개변수 있는 함수

매개변수(parameter)를 받아 사용할 수 있음.

void greet(String name) {
  print("Hi, $name!");
}

void main() {
  greet("Mr. Kim");
}

 ✔️ 반환 값이 있는 함수

 return을 이용해 결과 값을 반환 가능

int add(int a, int b) {
  return a + b;
}

void main() {
  int result = add(3, 5);
  print("결과: $result");
}

 ✔️ 선택적 매개변수 ( Optional Parameter )

 []를 사용하면 선택적 매개변수를 만들 수 있고, 기본값도 설정 가능

void introduce(String name, [int age = 20]) {
  print("이름: $name, 나이: $age");
}

void main() {
  introduce("김철수"); // 나이 생략 가능 default 20 따라서 김철수, 20 출력
  introduce("이영희", 25); // default 값이 아닌 파라미터 넣은 부분으로 이영희, 25 출력
}

 ✔️ 화살표 함수 ( Arrow Function )

 짧은 함수( 한 줄짜리 함수)는 =>를 사용해 간단하게 작성 가능

int multiply(int a, int b) => a * b;

void main() {
  print(multiply(4, 5)); // 출력: 20
}

 

반응형

✔️ 테스트 예제 코드 1

 위에서 진행했던 내용을 토대로 충분한 실습을 진행한 후, 테스트 예제를 진행해보도록 하자.

 1. if-else와 switch 문을 활용해 요일에 따라 다른 메시지를 출력하는 프로그램 작성

 2. 콘솔 입출력을 위해 dart:io를 import하여 요일 입력받기

 3. 입력한 요일에 따라 맞는 메시지 출력

 4. 월~일 이 아닌 다른 단어가 입력된 경우 잘못된 입력 처리 추가

✅ if-else 버전

import 'dart:io';

void main() {
  stdout.write("요일을 입력하세요 (월, 화, 수, 목, 금, 토, 일): ");
  String? day = stdin.readLineSync();	//Dart_1일차에 진행했던 stdin 사용

  if (day == "월") {
    print("한 주의 시작입니다! 힘내세요!");
  } else if (day == "화") {
    print("화이팅! 월요일을 넘겼습니다.");
  } else if (day == "수") {
    print("벌써 주중의 반이 지났어요!");
  } else if (day == "목") {
    print("주말이 다가오고 있습니다!");
  } else if (day == "금") {
    print("불금입니다! 조금만 더 힘내세요!");
  } else if (day == "토") {
    print("주말입니다! 푹 쉬세요!");
  } else if (day == "일") {
    print("내일은 월요일! 준비하세요!");
  } else {
    print("잘못된 입력입니다. 요일을 정확히 입력하세요.");
  }
}

 

✅ switch 버전

import 'dart:io';

void main() {
  stdout.write("요일을 입력하세요 (월, 화, 수, 목, 금, 토, 일): ");
  String? day = stdin.readLineSync();

  switch (day) {
    case "월":
      print("한 주의 시작입니다! 힘내세요!");
      break;	//break문을 활용해 조건별 실행.
    case "화":
      print("화이팅! 월요일을 넘겼습니다.");
      break;
    case "수":
      print("벌써 주중의 반이 지났어요!");
      break;
    case "목":
      print("주말이 다가오고 있습니다!");
      break;
    case "금":
      print("불금입니다! 조금만 더 힘내세요!");
      break;
    case "토":
      print("주말입니다! 푹 쉬세요!");
      break;
    case "일":
      print("내일은 월요일! 준비하세요!");
      break;
    default:
      print("잘못된 입력입니다. 요일을 정확히 입력하세요.");
  }
}

 

✔️ 테스트 예제 코드 2

 1. 1 ~ 10까지 숫자를 출력하는 프로그램 작성 ( for문 & while문 사용 )

void main() {
  //for
  for (int i = 1; i <= 10; i++) {
    print(i);
  }
  
  //while
  int j = 1;
  while (j <= 10) {
    print(j);
    j++;
  }
  
  //do-while
  int z = 1;
  do {
    print(z);
    z++;
  } while (z <= 10);
}

 

✔️ 테스트 예제 코드 3

 1. 두 개의 숫자를 받아 덧셈, 뺄셈, 곱셈, 나눗셈을 수행하는 프로그램

 2. 공백일 경우 예외처리 진행 ( 올바른 숫자가 입력될 때까지 반복 )

 3. 문자일 경우 예외처리 진행 ( 올바른 숫자가 입력될 때까지 반복 )

 4. 덧셈, 뺄셈, 곱셈, 나눗셈을 진행하는 calculate 함수 생성, 매개변수는 2개 받음

 5. 나눗셈에서 0으로 나누어 지는 경우 예외처리 진행

import 'dart:io';

void calculate(int a, int b) {
  print("덧셈: $a + $b = ${a + b}");
  print("뺄셈: $a - $b = ${a - b}");
  print("곱셈: $a * $b = ${a * b}");
  if (b != 0) {
    print("나눗셈: $a / $b = ${a / b}");
  } else {
    print("❌ 나눗셈: 0으로 나눌 수 없습니다.");
  }
}

int getNumberInput(String prompt) { //올바른 입력 함수 생성
  while (true) {
    stdout.write(prompt);
    String? input = stdin.readLineSync();

    // 공백 또는 null 체크 ( 1일차 진행 내용 )
    if (input == null || input.trim().isEmpty) {
      print("⚠️ 입력이 비어 있습니다. 숫자를 입력하세요.");
      continue;
    }

    // 숫자인지 확인 ( 1일차 진행 내용 )
    try {
      return int.parse(input);
    } catch (e) {
      print("⚠️ 유효한 숫자를 입력하세요.");
    }
  }
}

void main() {
  int num1 = getNumberInput("첫 번째 숫자를 입력하세요: ");
  int num2 = getNumberInput("두 번째 숫자를 입력하세요: ");

  calculate(num1, num2);
}

 

✔️ 테스트 예제 코드 4

 0. 심화과정이므로 테스트 예제 코드 3만 진행해도 충분할것이라 생각하지만 기존에 java를 할줄 아는 사람들이라면 만들어보면 좋을 것 같다.

 1. 숫자 입력이 아닌 4+2 또는 3*5와 같은 입력 처리

 2. 연산자를 자동으로 감지하여 연산 수행

 3. 공백 제거 및 수자로 변환 사용

 4. 올바른 수식 입력하도록 예외처리

 5. 지원하지 않는 연산자 예외처리

 6. 0으로 나누기 방지

import 'dart:io';

void calculate(String expression) {
  try {
    // 입력된 수식에서 연산자 탐색
    if (expression.contains("+")) {
      var parts = expression.split("+");
      int a = int.parse(parts[0].trim());
      int b = int.parse(parts[1].trim());
      print("덧셈: $a + $b = ${a + b}");
    } else if (expression.contains("-")) {
      var parts = expression.split("-");
      int a = int.parse(parts[0].trim());
      int b = int.parse(parts[1].trim());
      print("뺄셈: $a - $b = ${a - b}");
    } else if (expression.contains("*")) {
      var parts = expression.split("*");
      int a = int.parse(parts[0].trim());
      int b = int.parse(parts[1].trim());
      print("곱셈: $a * $b = ${a * b}");
    } else if (expression.contains("/")) {
      var parts = expression.split("/");
      int a = int.parse(parts[0].trim());
      int b = int.parse(parts[1].trim());

      if (b == 0) {
        print("❌ 나눗셈: 0으로 나눌 수 없습니다.");
      } else {
        print("나눗셈: $a / $b = ${a / b}");
      }
    } else {
      print("⚠️ 지원하지 않는 연산자입니다. (+, -, *, / 만 사용 가능)");
    }
  } catch (e) {
    print("⚠️ 올바른 수식을 입력하세요. 예: 4+2, 3*5, 10/2");
  }
}

String getExpressionInput() {
  while (true) {
    stdout.write("계산할 수식을 입력하세요 (예: 4+2, 3*5, 10/2): ");
    String? input = stdin.readLineSync();

    // 입력이 비어 있는 경우 예외 처리
    if (input == null || input.trim().isEmpty) {
      print("⚠️ 입력이 비어 있습니다. 올바른 수식을 입력하세요.");
      continue;
    }

    return input.trim(); // 입력된 값 반환
  }
}

void main() {
  String expression = getExpressionInput();
  calculate(expression);
}

✔️ 테스트 예제 코드 5

 0. 해당 부분 또한 예제 코드 4에서의 심화 과정으로 개발을 조금이라도 해봤던 사람들이 해보면 더 좋을 것 같다.

 1. 테스트 예제 코드4는 "4+2+3" 이렇게 2개의 연산자가 있을 경우에는 진행이 불가능함. 해당 부분 수정

 2. 연산자와 피연산자를 구분하여 계산하도록 수행.

 3. Map과 List를 활용하여 진행.

import 'dart:io';

double evaluateExpression(String expression) {
  try {
    // 연산자와 피연산자를 분석하여 계산 수행
    List<String> tokens = expression.split(RegExp(r'(\+|\-|\*|\/)')).map((e) => e.trim()).toList();
    List<String> operators = RegExp(r'(\+|\-|\*|\/)').allMatches(expression).map((m) => m.group(0)!).toList();

    if (tokens.length != operators.length + 1) {
      throw Exception("잘못된 수식 형식입니다.");
    }

    // 숫자로 변환
    List<double> numbers = tokens.map((e) => double.parse(e)).toList();

    // 곱셈(*) 및 나눗셈(/) 먼저 처리
    for (int i = 0; i < operators.length; i++) {
      if (operators[i] == "*" || operators[i] == "/") {
        double result;
        if (operators[i] == "*") {
          result = numbers[i] * numbers[i + 1];
        } else {
          if (numbers[i + 1] == 0) throw Exception("❌ 0으로 나눌 수 없습니다.");
          result = numbers[i] / numbers[i + 1];
        }

        // 계산한 값 반영하고 리스트 수정
        numbers[i] = result;
        numbers.removeAt(i + 1);
        operators.removeAt(i);
        i--; // 리스트 변경에 맞춰 인덱스 조정
      }
    }

    // 덧셈(+) 및 뺄셈(-) 처리
    double total = numbers[0];
    for (int i = 0; i < operators.length; i++) {
      if (operators[i] == "+") {
        total += numbers[i + 1];
      } else if (operators[i] == "-") {
        total -= numbers[i + 1];
      }
    }

    return total;
  } catch (e) {
    throw Exception("⚠️ 올바른 수식을 입력하세요. 예: 4+2, 3*5-2, 10/2+3");
  }
}

String getExpressionInput() {
  while (true) {
    stdout.write("계산할 수식을 입력하세요 (예: 4+2, 3*5-2, 10/2+3): ");
    String? input = stdin.readLineSync();

    if (input == null || input.trim().isEmpty) {
      print("⚠️ 입력이 비어 있습니다. 올바른 수식을 입력하세요.");
      continue;
    }

    return input.trim();
  }
}

void main() {
  try {
    String expression = getExpressionInput();
    double result = evaluateExpression(expression);
    print("결과: $expression = $result");
  } catch (e) {
    print(e);
  }
}

 위의 코드는 1+2*(3+4) 이렇게 괄호가 포함되어 있는 수식은 불가능하다. 해당 부분은 스택을 통하여 진행을 하면 더 좋은 방향으로 만들 수 있게 때문에 추후에 스택을 진행할 때에 진행해보도록 할 예정이다.


 이렇게 제어문과 함수 심화 과정에 대해서 알아보았다. 추가 적인 내용이 필요한 경우에는 댓글을 요청드리고, 틀린 부분이 있다면 이것 또한 댓글로 알려주시면 수정하도록 하겠습니다!


 

반응형