컴퓨터에서 무언가를 기억하거나 또는 다른 프로그램에게 약속된 신호를 남기기 위한 용도로 프로그램에 사용되는 미리 정의된 비트.
즉, 특정 동작을 수행할지 말지 결정하는 변수를 플래그 라고 부른다. (보통 1비트)
깃발을 올린다 와 내린다 두가지 상태로만 신호를 줄 수 있는 것을 떠올려 보자.
게임에서 사망 플래그 떴다 라는 표현을 사용할 때의 플래그.
boolean flag = false; 로 초기값을 두고 사용 한다.
boolean 타입은 초기값이 false 로 알고 있다. (아니면 수정 하겠음,,)
그런데 선언만 해주니까 값이 없다고 오류가 뜨는듯 하다.
초기화를 false로 해줘야 할듯 하다.
(23.05.20 추가)
사용 하는 이유 :
~~가 있는지 없는지,
~~가 되었는지 안되었는지,
~~가 T인지 F인지 판단하는 상황일 때,
무언가 오랜시간 진행이 되고 판단해야 할 때,
=> flag 알고리즘을 활용 한다.
예시)
정수를 1개 입력 했는데,
내가 입력한 정수와 내가 가진 모든 번호를 비교해보려 한다.
그러면, 모든 번호를 다 확인하면서 (오랜시간 진행하며) 번호가 동일한지 아닌지를
판단해야 하니,
이럴때 flag 알고리즘을 활용 한다.
만약에, 모든 번호를 다 확인했는데, 번호가 동일해 ? 그러면 true로 켜주고,
그렇지 않을경우는 기존의 초기값 false를 유지한다.
-------------------------------------------------------------------------------------------------------------------------------------------
아래의 예제문을 통해 정리 하겠다.
위와 같이, 랜덤으로 받을 배열의 값들이 중복이 되지 않아야 한다.
만약 중복이 되면, 어 중복이 됬네? 하고 값을 저장하지 않고 위의 과정을 반복하는 그런 그림을 그려야 한다.
위의 코드를 자세히 살펴보자.
while문을 돌리기 위해 int i = 0;
while문 안에 for문을 돌리기 위해 int j = 0;
이다.
for문을 풀이하면
1)
data[0] 에 랜덤 값을 하나 저장.
flag는 false 상태이고,
j가 0부터 시작해서, 0 < 0 이면 조건식이 참이 아니므로 1번째 for문은 끝나버린다.
if(flag == true) { continue; } 는
만약 플래그가 T이면 if문 밑으로 가지 말고 루프를 돌기 위해 올라간다.
지금은 for문이 작동 자체를 하지 않았고, 따라서 flag가 F 이기 때문에
else 부분의 명령어가 실행 된다.
i++;
2)
data[1] 에 랜덤 값을 하나 저장.
flag는 false 상태이고,
i가 1이 증가 했으므로, j = 0; 이고 0 < 1 이므로 조건식이 참이라 2번째 바퀴 for문이 실행 된다.
만약 data[0] 이랑 data[1] 이랑 같아?
만약에 같다면 플래그가 T가 되어 i = 1 상태로 다시 반복을 하게 된다.
즉, data[1]에 랜덤값을 또 저장 하게 되고,
또 비교 한다.
만약 data[0] 이랑 data[1] 이랑 같아?
만약에 다르다면, 플래그가 T가 되지 않아, 아래의 if문이 실행되지 않고
i++;
3)
data[2] 에 랜덤 값을 하나 저장.
flag는 false 상태이고,
j = 0; 0 < 2 조건이 만족되어 3번째 바퀴 for문이 실행 된다.
만약 data[0]이랑 data[2] 이랑 같아?
만약에 같으면, flag가 true 가 되어 버린다.
여기서 true가 되었다는 말은 data 배열 0번째의 값이 data 배열 2번째 값과 같다는 의미인데
굳이 data 배열 1번째의 값을 비교할 필요도 없이 다시 반복해야 하지만,
for문의 조건이 0 < 2 인 상황이므로,
data 배열 1번째의 값과 data 배열 2번째의 값도 비교를 하게 된다.
추가 ++
for(int j = 0; j < i; j++) { // arr[0]의 값은 랜덤 저장되고 비교할 필요가 없으므로 for문을 패스.
if(arr[j] == arr[i]) {
flag = true;
break;
break; 를 쓰면서 for문을 부셔버릴 수 있다.
어찌됬던지간에 for문이 끝나려면,
data[0]과 data[1] 모두가 data[2]와 값이 달라야 flag가 false 상태를 유지하면서
else 문의 명령어가 실행 된다.
i++;
4)
이제는 i가 3이 되었다. while문의 조건에 따라 끝나거나,
5)
6)
도 가능하게 될텐데,
앞에 코드 분석과 동일한 패턴이므로 생략.
'Java (국비) > Java 이론' 카테고리의 다른 글
Java (0) | 2023.05.11 |
---|---|
객체지향언어 (Object Oriented Language) 특징 (2) | 2023.05.10 |
함수 간단 정리 (0) | 2023.05.09 |
최대값, 최소값 알고리즘 (0) | 2023.05.06 |
두 변수의 값 바꾸기 (0) | 2023.05.06 |