Todo App만들기 기초과제 수행 중 파일을 분리하고 연결하는 과정에서 각 홈페이지에 분리된 위젯을 호출하려는데 아직 온전히 개념이 안 잡힌 것 같아서 간단한 예제를 ai 도움 없이 직접 코드를 쳐보며 이해하기로 해보았다.
다트기초 강의 1-10의 함수에 대한 내용을 복습했음에도 클래스를 객체로 만들어서 호출하는 부분을 파일을 분리했다는 이유로 아예 별개의 것이라고 생각이 들어서 진행하지 못했었다.
추론하는 능력을 키우고, 응용하는 실력을 올리고 싶다.
📚 연습 예제 1)
단순한 계산기보다 조금 더 발전된 형태입니다. 클래스와 리스트, 그리고 조건문을 조합해야 합니다.
[미션]
사용자가 음료를 주문하면 포인트가 적립되고, 특정 포인트가 모이면 "쿠폰 발급" 메시지를 띄우는 프로그램을 만드세요.
[기능 및 조건]
Member 클래스 만들기:
이름(name)과 현재 보유 포인트(points)를 변수로 가집니다.
포인트 적립 로직:
음료 한 잔당 10점이 적립됩니다.
addOrder(int count) 메서드를 만들어 주문 개수만큼 포인트를 더하세요.
쿠폰 체크:
포인트가 50점 이상이 되면 "축하합니다! 쿠폰이 발급되었습니다."라고 출력하고 포인트를 50점 차감하세요.
실행(main):
멤버 객체를 하나 생성합니다. (예: Member(name: '혜림', points: 0))
처음에 3잔을 주문하고 상태를 출력하세요.
그다음 4잔을 추가로 주문해서 쿠폰이 발생하는지 확인하세요.
계산기 예제를 떠올리며 코드를 작성해보자
우선 기능을 분리해야 하는데
변수들을 담아줄 Member클래스를 만들어주고,
main함수에서는 조건에 따른 입출력만 담당한다.
포인트 적립에 대한 로직을 만들어서 메인 함수로 불러와 사용한다.
point = point + (추가포인트) 혹은 point += ... 식을 활용하기member.addOrder(3);이런식으로 객체에게 일을 시키기print를 곳곳에서 사용해서 계속 확인하며 코딩하기!
에러가 나면 왜 그런지에 대해서 질문하기!
예외.
음료를 10잔 이상 시킨다면? 쿠폰 2장 발급 -> 쿠폰을 1장만 사용한다면?
리스트에서 꺼내기: memberService.members[0] (0번째 붕어빵 꺼내기)
함수로 던지기: order( ... ) 괄호 안에 쏙 넣기
함수에서 받기: void order(Member member)가 그 붕어빵을 member라는 이름으로 받음
일 시키기: member.addPoints(drink) (그 붕어빵한테 포인트 적립 시킴)
260212 목요일
조건:
1. 검색이나 다른 도움을 받지 않고 주어진 예시의 조건을 이해하고, 기능을 구현해서 출력을 하면 된다.
2. 주어진 시간 내에 최대한 구현을 하고, 결과를 가져가면 된다.
🎯 목표
🧩 구현 요구사항
1️⃣ 점수 입력
예시:
점수를 입력하세요 (종료: 0) : 80
점수를 입력하세요 (종료: 0) : 90
점수를 입력하세요 (종료: 0) : 70
점수를 입력하세요 (종료: 0) : 0
2️⃣ 입력한 점수들을 List에 저장한다.
3️⃣ 평균 계산
4️⃣ 평균에 따라 학점 계산
학점 기준:
90 이상 -> A
80 이상 -> B
70 이상 -> C
60 이상 -> D
그 미만 -> F
5️⃣ 결과 출력
출력 예시:
입력한 점수 목록:
80
90
70
평균: 80.0
학점: B
📌 조건
void main() {
List<int> scoreList = [];
inputScores(scoreList);
double averageScore = calculateAverage(scoreList);
String grade = calculateGrade(averageScore);
printResult(scoreList, averageScore, grade);
}
📌 점수 입력 함수
void inputScores(List<int> scoreList) {
// TODO: 구현
throw UnimplementedError();
}
📌 평균 계산 함수
double calculateAverage(List<int> scoreList) {
// TODO: 구현
throw UnimplementedError();
}
📌 학점 계산 함수
String calculateGrade(double averageScore) {
// TODO: 구현
throw UnimplementedError();
}
📌 결과 출력 함수
void printResult(List<int> scoreList, double averageScore, String grade) {
//
}
11:30 ~ 14:00
연습했던 예제들에 익숙한 방식을 따라가는 바람에 틀을 먼저 구성을 하고, 기능을 구현하려고 했지만
과제에서 요구하는 문제의 조건이 아니어서 다시 코드를 짜봐야겠다.
내맘대로 해석을 했는데 과제에서 요구하는 조건과 기능에 대해 다시 읽어보고 정확히 수행하도록 한다.
과제에서 요구하는 바는 스위치문을 사용해서 조건에 따라 목록을 출력하는 것이 아니다.
// 메인에서는 입출력값만 받음
import 'dart:io';
void main() {
// 설계도의 리스트를 객체로 만들어서 불러오기
final gradeList = GradeList();
while (true) {
print('=== 학생 성적 관리 프로그램 ===');
print('1. 학생들의 점수를 등록할 수 있습니다.');
print('2. 학생들의 점수 평균값을 확인하세요.');
print('3. 학생들의 학점 결과를 확인하세요.');
print('4. 프로그램 종료');
// 널값을 가질 수 있다. 왼쪽값을 출력하거나 없으면 빈 문자열
int? input = int.tryParse(stdin.readLineSync() ?? '');
switch (input) {
case 1:
//inputScores();
break;
case 2:
//averageScore();
break;
case 3:
//calculateGrade();
break;
case 4:
print('프로그램을 종료합니다.');
return;
default:
print('올바른 메뉴를 선택해주세요');
break;
}
}
}
// 설계도. 점수를 만들어줄 틀
class Inventory {
int score;
Inventory({required this.score});
}
// 설계도를 가져와서 객체를 저장. 학생점수 리스트를 담아주는 클래스
class GradeList {
// 리스트를 담아줄 빈 박스를 생성. 새로운 정보는 여기에 추가가 됨
final List<Inventory> _scoreList = [];
// 리스트의 내용을 읽을 수 있어야 함
List<Inventory> get scores => _scoreList;
// 리스트에 정보가 추가되도록 하는 메서드 함수
void addListScore(int age) {
_scoreList.add(Inventory(score: 0));
}
}
// 기능구현
// 1. 점수 추가 함수
void inputScores(GradeList grades) {
stdout.write('학생의 점수를 등록해주세요.');
int? studentScore = int.tryParse(stdin.readLineSync() ?? '');
print('$studentScore점수가 등록되었습니다.');
// 계속 등록할 것인지 여부. 0을 입력할 경우 종료됨
if (studentScore == 0) {}
}
// 2. 평균 계산 함수
void averageScore(GradeList grades) {}
// 3. 학점 계산 함수
void calculateGrade(GradeList grades) {}
14:30 ~ 16:00
다소 느리지만 일부 구현 완료. 이정도의 과제는 바로 머리속에서 떠올라야 하는데..
import 'dart:io';
// 메인 안에서는 출력만 하도록 한다.
void main() {
List<int> scoreList = [];
print('=== 학생 성적 관리 프로그램 ===');
inputScores(scoreList);
double averageScore = calculateAverage(scoreList);
String grade = calculateGrade(averageScore);
printResult(scoreList, averageScore, grade);
}
// 점수입력 함수
void inputScores(List<int> scoreList) {
// 사용자로부터 점수를 여러개 입력 받는다. 반복문 사용
// 입력한 점수들을 List<int>에 저장한다.
while (true) {
stdout.write('1. 점수를 입력하세요 (종료: 0) : ');
int? score = int.tryParse(stdin.readLineSync() ?? '');
// 입력한 값은 정수만 허용한다. 일단 소수점은 입력이 안됨
// 숫자가 아닌 값이 오면 다시 처음으로 돌아간다.
if (score == null) {
print('숫자를 입력해 주세요.');
// 와일문을 다시 처음부터 반복함. 기존 입력한 숫자들은 그대로 저장되어 있다!
continue;
} else if (score > 100) {
print('100점이 최대 점수입니다. 올바른 점수를 입력해주세요.');
continue;
}
// 0을 입력할 경우 종료한다.
if (score == 0) {
print('점수 입력을 종료합니다.');
break;
}
// 리스트에 추가해주기. 리스트 안의 점수가 각 출력이 되어야 함
// 그냥 추가하려면 score값이 널러블한 int라고 에러가 뜨는데 null을 받지 않도록 조건문으로 해결함
scoreList.add(score);
print('현재 등록되어 있는 점수 : $scoreList');
}
}
// 평균계산 함수
double calculateAverage(List<int> scoreList) {
print('평균 학점을 계산합니다.');
// 더블타입이 null값을 반환할 수 없다고 에러. 리턴하는게 없어서 발생하는 에러
int sum = 0;
// for문을 사용해서 리스트 안의 점수들을 꺼내서 합친 다음
for (var i = 0; i < scoreList.length; i++) {
sum = sum + scoreList[i];
print(sum);
}
// 리스트의 개수로 나누면 평균이 나옴
}
// 학점계산 함수
String calculateGrade(double averageScore) {
// TODO: 구현
throw UnimplementedError();
}
// 결과출력 함수
void printResult(List<int> scoreList, double averageScore, String grade) {
//
}
중간에 특강이 마저 진행되어서 수업을 듣고,
17:00 ~ 18:00
기능구현은 완료하였다.
아쉬운 점: 출력해야 될 결과예제와 똑같이 구현하지 못한 부분,
좀 더 간단하게 코드를 작성할 수 있는 방법에 대해서 더 알아보고 싶다.import 'dart:io';
// 메인 안에서는 출력만 하도록 한다.
void main() {
List scoreList = [];
print('=== 학생 성적 관리 프로그램 ===');
inputScores(scoreList);
double averageScore = calculateAverage(scoreList);
String grade = calculateGrade(averageScore);
printResult(scoreList, averageScore, grade);
}
// 점수입력 함수
void inputScores(List scoreList) {
// 사용자로부터 점수를 여러개 입력 받는다. 반복문 사용
// 입력한 점수들을 List에 저장한다.
while (true) {
stdout.write('1. 점수를 입력하세요 (종료: 0) : ');
int? score = int.tryParse(stdin.readLineSync() ?? '');
// 입력한 값은 정수만 허용한다. 일단 소수점은 입력이 안됨
// 숫자가 아닌 값이 오면 다시 처음으로 돌아간다.
if (score == null) {
print('숫자를 입력해 주세요.');
// 와일문을 다시 처음부터 반복함. 기존 입력한 숫자들은 그대로 저장되어 있다!
continue;
} else if (score > 100) {
print('100점이 최대 점수입니다. 올바른 점수를 입력해주세요.');
continue;
}
// 0을 입력할 경우 종료한다.
if (score == 0) {
print('점수 입력을 종료합니다.');
break;
}
// 리스트에 추가해주기. 리스트 안의 점수가 각 출력이 되어야 함
// 그냥 추가하려면 score값이 널러블한 int라고 에러가 뜨는데 null을 받지 않도록 조건문으로 해결함
scoreList.add(score);
}
}
// 평균계산 함수
double calculateAverage(List scoreList) {
print('평균 학점을 계산합니다.');
// 점수가 없을 경우! 0을 반환한다.
if (scoreList.isEmpty) {
print('등록된 점수가 없습니다.');
return 0;
}
int sum = 0;
// for문을 사용해서 리스트 안의 점수들을 꺼내서 합친 다음
// 추가로 알면 좋을 부분: 좀 더 간단하게 표현할 수 있는 방법들을 알아보자
for (var i = 0; i < scoreList.length; i++) {
sum = sum + scoreList[i];
}
// 리스트의 개수로 나누면 평균이 나옴. 점수가 없을 경우에는 0을 반환
double averageScore = sum / scoreList.length;
//print('평균: $averageScore');
// 계산된 결과값을 외부 main으로 돌려줌
return averageScore;
}
// 학점계산 함수
String calculateGrade(double averageScore) {
print('평균학점에 따른 등급입니다.');
// 평균점수를 기준으로 학점을 반환함. 학점의 기준에 따라 등급이 매겨짐
if (averageScore >= 90) {
return 'A';
} else if (averageScore >= 80) {
return 'B';
} else if (averageScore >= 70) {
return 'C';
} else if (averageScore >= 60) {
return 'D';
} else {
return 'F';
}
}
// 결과출력 함수
void printResult(List scoreList, double averageScore, String grade) {
// 수정할 부분: 예시대로 입력한 점수목록을 수직으로 출력하면 좋다.
print('입력한 점수 목록:\n$scoreList');
// 수정할 부분: 소수점 한자리까지 출력해야 된다!
print('평균: ${averageScore.toInt()}');
print('학점: $grade');
}