Dart 튜토리얼 14편: 수학·유틸(dart:math) 빠르게 쓰기
요약
핵심 요지
- 문제 정의: 앱 개발 중 “각도 계산”, “최댓값/최솟값”, “난수”는 자주 나오지만, 어디서 어떤 함수를 가져와야 하는지 헷갈리기 쉽다.
- 핵심 주장: Dart는
dart:math1에 자주 쓰는 수학 함수/상수/난수 생성 기능을 모아두었고, 대부분은 “최상위 함수” 형태로 바로 쓸 수 있다. - 주요 근거:
sin()2/cos()3는 라디안(radians4) 기준,max()5/min()6,pi7/e8/sqrt29,Random10 예시가 제시된다. - 실무 기준: 삼각함수는 “라디안 변환”을 먼저 고정하고, 난수는 목적에 따라 일반
Random()과Random.secure()11를 구분한다.
문서가 설명하는 범위
dart:math의 삼각함수(라디안 기반)와 값 계산 예시max()/min()과 대표 상수(pi,e,sqrt2)Random기반 난수 생성과Random.secure()주의점
읽는 시간: 12분 | 난이도: 초급
참고 자료
- dart - 수학 함수/상수/난수
문제 상황
수학 함수는 “필요할 때 바로 쓰는 도구”에 가깝습니다.
그런데 매번 검색해서 쓰기 시작하면, 코드가 끊기고 실수(단위/범위/목적)가 늘어납니다.
그래서 dart:math의 핵심을 “자주 쓰는 묶음”으로 정리해 두는 것이 유리합니다.
해결 방법
단계 1: 삼각함수는 “라디안” 기준으로 먼저 고정하기
Why
NOTE삼각함수는 UI 애니메이션, 좌표 계산, 회전 등에서 자주 쓰입니다.
그런데 입력 단위를 도(degrees12)로 착각하면 결과가 틀어질 수 있습니다.
What
NOTE
sin()과cos()같은 삼각함수는 라디안(radians)을 입력으로 받습니다.
How
TIP도 단위를 라디안으로 바꾸는 변환을 코드로 고정합니다.
import 'dart:math';// 코사인assert(cos(pi) == -1.0);// 사인var degrees = 30;var radians = degrees * (pi / 180);// radians는 이제 0.52359가 된다.var sinOf30degrees = sin(radians);// sin 30°는 0.5다.assert((sinOf30degrees - 0.5).abs() < 0.01);
Watch out
WARNING삼각함수 입력은 “도”가 아니라 “라디안”입니다.
즉, 도 단위를 그대로 넣지 않도록 변환 공식을 먼저 적용해야 합니다.
결론: 삼각함수는 라디안 기준이므로 “도→라디안 변환”을 먼저 습관화합니다.
단계 2: 최댓값/최솟값은 max()/min()으로 단순하게 처리하기
Why
NOTE값을 비교해 한쪽을 선택하는 로직은 조건문으로도 만들 수 있지만,
max()/min()이 더 짧고 의도가 명확합니다.
What
NOTE
max()는 큰 값을,min()은 작은 값을 반환하는 함수입니다.
How
TIP비교 로직을 한 줄로 정리합니다.
import 'dart:math';assert(max(1, 1000) == 1000);assert(min(1, -1000) == -1000);
Watch out
WARNING여러 값의 최댓값/최솟값이 필요하면, “두 값씩” 적용하거나 컬렉션을 줄이는 방식으로 구조를 먼저 정해야 합니다.
결론: 값 비교는 max()/min()으로 의도를 분명하게 드러냅니다.
단계 3: 상수(pi/e/sqrt2)는 dart:math에서 바로 꺼내 쓰기
Why
NOTE수학 상수를 직접 적으면(오타/정밀도) 실수가 생길 수 있습니다.
그래서 이미 정의된 상수를 가져다 쓰는 편이 안전합니다.
What
NOTE
dart:math는pi,e,sqrt2같은 상수를 제공합니다.
How
TIP필요한 상수를 바로 사용합니다.
import 'dart:math';// 추가 상수는 dart:math 라이브러리에서 확인할 수 있다.print(e); // 2.718281828459045print(pi); // 3.141592653589793print(sqrt2); // 1.4142135623730951
Watch out
WARNING상수 출력 값은 “표시(문자열)”일 뿐이며, 실제 연산은 부동소수점(
double13) 특성의 영향을 받을 수 있습니다.
결론: 상수는 직접 적지 말고 dart:math에서 제공하는 값을 사용합니다.
단계 4: 난수는 Random으로 만들되, 목적에 따라 Random.secure()를 구분하기
Why
NOTE게임/샘플 데이터/테스트에서는 난수가 필요합니다.
하지만 “보안 목적”의 난수는 요구 수준이 다릅니다.
What
NOTE
Random은 난수를 생성하는 클래스입니다.
기본 생성자는 의사 난수이며, 보안 목적이라면Random.secure()가 언급됩니다.
How
TIP기본 난수는 다음처럼 씁니다.
import 'dart:math';var random = Random();random.nextDouble(); // 0.0 이상 1.0 미만: [0, 1)random.nextInt(10); // 0 이상 9 이하불리언도 만들 수 있습니다.
var random = Random();random.nextBool(); // true 또는 false
Watch out
WARNING기본
Random은 암호학적 목적에는 적합하지 않은 의사 난수입니다.
보안 목적의 난수 생성이 필요하면Random.secure()를 사용합니다.
결론: 난수는 목적(일반/보안)에 따라 Random()과 Random.secure()를 구분합니다.
Footnotes
-
dart(dart): 삼각함수/최댓값·최솟값/상수/난수 등 수학 기능을 제공하는 라이브러리다. ↩
-
sin()(사인): 라디안을 입력으로 받아 사인 값을 구하는 함수다. ↩
-
cos()(코사인): 라디안을 입력으로 받아 코사인 값을 구하는 함수다. ↩
-
radians(라디안): 각도를 라디안 단위로 표현한 값이다. ↩
-
max()(맥스): 두 값 중 더 큰 값을 반환하는 함수다. ↩
-
min()(민): 두 값 중 더 작은 값을 반환하는 함수다. ↩
-
pi(파이): 원주율 상수다. ↩
-
e(자연상수 e): 자연로그의 밑 상수다. ↩
-
sqrt2(루트2): 2의 제곱근 상수다. ↩
-
Random(랜덤): 난수(의사 난수 포함)를 생성하는 클래스다. ↩
-
Random.secure()(보안 난수): 암호학적으로 더 안전한 난수 생성이 필요한 경우 사용하는 생성자다. ↩
-
degrees(도): 각도를 도 단위로 표현한 값이다. ↩
-
double(더블): 부동소수점 수를 표현하는 타입이다. ↩
공유
이 글이 도움이 되었다면 다른 사람과 공유해주세요!