Android Studio를 통해 Emulator로 Debug 하던 중에 반복되는 이 에러를 보았다.
[ Incorrect use of ParentDataWidget ]
이 에러는 Expanded Widget 은 Column, Row, Flew 와 같은 부모 위젯에서 사용해야 하지만,
그 이외에 위젯에서 사용될 경우 발생한다.
따라서 Expanded를 세 개의 부모 위젯에서 사용하거나 제거해주면 해결된다.
Android Studio를 통해 Emulator로 Debug 하던 중에 반복되는 이 에러를 보았다.
[ Incorrect use of ParentDataWidget ]
이 에러는 Expanded Widget 은 Column, Row, Flew 와 같은 부모 위젯에서 사용해야 하지만,
그 이외에 위젯에서 사용될 경우 발생한다.
따라서 Expanded를 세 개의 부모 위젯에서 사용하거나 제거해주면 해결된다.
에라토스테네스의 체 는 소수를 찾는 쉽고 빠르게 찾을 수 있는 방법이다.
( 고대 그리수 수학자 에라토스테네스가 발견 )
다음과 같은 알고리즘을 따른다.
0 ~ 50 까지의 수를 찾고자 할때, 0과 1을 제외
1. 2부터 시작하여 2를 제외한 2의 배수를 모두 지운다.
2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 |
41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 |
2. 지워지지 않은 다음 숫자부터 1번과 같이 반복한다. ( 3을 제외한 3의 배수 지우기 )
2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 |
41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 |
3. √50 = 7.071 이므로 구하는 수의 제곱근 이하의 소수, 즉, 7의 배수까지 제외하면 된다.
2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 |
41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 |
4. 제외 되지 않은 숫자가 소수
2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47
자바를 통해 다음과 같이 구현할 수 있다.
Boolean[] primeNumbers = new Boolean[number + 1]; // N이 0일 때, 0 ~ 100 까지 101개의 수
primeNumbers[0] = false; // 1
primeNumbers[1] = false; // 2
먼저 0 ~ 100까지의 101개의 배열을 생성해주고 0, 1은 제외 시킨다.
// 모두 true로 초기화
for (int i = 2; i <= number; i++) {
primeNumbers[i] = true;
}
2부터 모두 소수라 가정하고 true로 지정한다.
for (int i = 2; i <= Math.sqrt(number); i++) {
if (primeNumbers[i] == false)
continue;
for (int j = i + i; j <= number; j += i) {
primeNumbers[j] = false;
}
}
에라토스테네스의 체 공식으로
1. 이미 제외시킨 숫자라면 다음 숫자
2. 제외시킨 숫자가 아니라면 그 수를 제외하고 배수를 false로 변환한다.
다음과 같은 결과를 얻을 수 있다.
import java.util.Scanner;
public class eratos {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("2이상의 숫자를 입력해 주세요 : ");
int N = scanner.nextInt();
fintPrimeNumber(N);
}
private static void fintPrimeNumber(int number) {
Boolean[] primeNumbers = new Boolean[number + 1]; // N이 0일 때, 0 ~ 100 까지 101개의 수
primeNumbers[0] = false; // 1
primeNumbers[1] = false; // 2
// 모두 true로 초기화
for (int i = 2; i <= number; i++) {
primeNumbers[i] = true;
}
for (int i = 2; i <= Math.sqrt(number); i++) {
if (primeNumbers[i] == false)
continue;
for (int j = i + i; j <= number; j += i) {
primeNumbers[j] = false;
}
}
System.out.println();
System.out.println(number + "이하의 소수 입니다.");
for (int i = 0; i < primeNumbers.length; i++) {
if (primeNumbers[i]) {
System.out.print(i + " ");
}
}
}
}
플라비우스 요세푸스 순열 (2) | 2025.02.28 |
---|---|
[ 자료구조 ] 큐 ( Queue ) - JAVA (0) | 2025.02.26 |
스택 ( 자료구조 ) - JAVA (0) | 2025.02.04 |
[ 알고리즘 ] 선택 정렬 (2) | 2024.12.12 |
Flutter 개발시 API Key나 다른 것을 숨겨야 할 상황이 생긴다.
이 때 우리는 환경변수를 사용하여 보안성을 높일 수 있다.
이번에는 .env 파일을 통해 git과 같은 코드 업로드 시 보안을 높이고
또한
앱 배포시에도 리버스 엔지니어링으로 부터 더욱 안전할 수 있게 난독화까지 할 수 있도록 하겠다.
● API Key를 숨기지 않더라도 Naver, AWS 등 여러가지 API 서비스는 제한 횟수로 관리하는 방법이나 단기에 많은 요청시와 같은 비정상적인 호출이 실행되었을 때를 서비스를 제공하는 곳에서 관리해주기 때문에 어느정도 보장되지만, 그럼에도 악용하는 방법은 무궁무진 하므로 보안성을 최대한 높이는 것이 좋다.
● API Key 뿐만 아니라 숨겨야 하는 다른 데이터를 난독화를 통해 보안성을 높일 수 있다.
플러터 프로젝트 루트 디렉터리 (Flutter Project Root Directory)에 .env 파일을 생성하고 key를 적으면 된다.
NAVER_ID_KEY = '발급 받은 키값'
난독화와 환경변수 .env file에 적은 값들을 가져오기 위해 다음 패키지를 추가 해 주자.
envied | Dart package
Explicitly reads environment variables into a dart file from a .env file for more security and faster start up times.
pub.dev
pubspec.yaml
$ flutter pub add envied
$ flutter pub add --dev envied_generator
$ flutter pub add --dev build_runner
다음과 같이 .env에 사용했던 상수명을 그대로 작성해주고 obfuscate ( 난독화 )를 true -> 사용해주자
* path에 사용한 .env파일 명을 적어주면 된다.
env.dart
import 'package:envied/envied.dart';
part 'env.g.dart';
@Envied(path: '.env')abstract class Env {@EnviedField(varName: 'NAVER_ID_KEY', obfuscate: true)static final String NAVER_ID_KEY = _Env.NAVER_ID_KEY;
@EnviedField(varName: 'NAVER_SECRET_KEY', obfuscate: true)static final String NAVER_SECRET_KEY = _Env.NAVER_SECRET_KEY;
@EnviedField(varName: 'AWS_API_GATEWAY_URL', obfuscate: true)static final String AWS_API_GATEWAY_URL = _Env.AWS_API_GATEWAY_URL;}
Code 작성 후 터미널에 다음 코드를 작성하면 env.g.dart file이 생성된 것을 확인 할 수 있다.
$ dart run build_runner build
사용은 Dart의 클래스 사용법과 동일하다.
이와 같이 예민한 값들을 .env file과 envied package를 통해 보안성을 높일 수 있다.