우리는 매일 조건에 대한 행동의 분기나 반복을 하고 있다.
예를 들어,
"만약 일기예보가 비라면 우산을 가지고 간다" 라는 분기나,
"정답일 때 까지 몇 번이라도 문제를 푼다" 라는 반복이다.
프로그램도 이것과 같은 조건분기와 반복을 수행하며 처리를 진행해 나간다.
코드를 실행시키는 순서를 "제어구조"라고 한다.
대표적인 것으로는
'순차' / '분기' / '반복' 이 3가지가 있다.
순차 = 위에서 부터 순차적으로 한줄씩 진행
아무리 복잡한 프로그램이라도, 순차 / 분기 / 반복의 3가지 제어구조를 조합하면
만들 수 있다.
만약 내일이 맑으면 세탁하고 산책을 하자.
하지만, 내일 비가 온다면, 집에서 영화를 보자.
public class Clear {
public static void main(String[] args) {
boolean clear = true;
if (clear == true) { // 분기조건
System.out.println("세탁을 합니다");
System.out.println("산책을 합니다");
} else {
System.out.println("영화를 봅니다");
}
}
}
- if 라는 명령어를 사용하면 "분기"를 할 수 있다.
- if 의 뒤에는 () 안에 "맑은가"에 대한 "분기조건"을 쓴다.
- 변수 clear가 true인지 아닌지를 체크를 할 때에는 "=="을 사용한다.
- 분기조건이 성립한다면, ()의 직후에 있는 블록의 안쪽 코드가 실행된다.
- 분기조건이 성립하지 않는다면, else의 뒤에 있는 블록의 안쪽 코드가 실행된다.
블록 작성에는 2가지 룰이 있음.
- 중괄호의 생략
내용이 1행 밖에 없을 때는 중괄호를 생략해도 됨.
하지만 에러의 방지를 위해 중괄호를 웬만하면 써 줘야함.
- 블록 내에 선언한 변수의 수명
블록 안에서 선언한 변수는 그 블록의 종료와 동시에 소멸한다.
if (clear == true) {}
if (age > 18) {}
조건식 안에 사용되는 == / > / < 등의 기호를 관계연산자 라고 한다.
수학적 표현: x는 10보다 크고, 20보다 작다 ➡️ 10 < x < 20
Java 표현: 따로따로 식을 입력해야 함.
if (x > 10 && x < 20) {
if (10 < x && x < 20) {
- JTI != false -> JTI == true
- initial == '오' (오는 char(숫자형)임 // 관계연산자는 String 못씀)
- if 문은 조건식의 평가 결과가 true이면 바로 밑 블록을,
false이면 이후의 블록을 실행조건식은 반드시 true 또는 false가 나오는 식이어야 함.
- while 문은 조건식의 평가 결과가 true이면 ,블록을 반복 실행
Java에서 String 형의 비교에는 특수한 작성 방법 이 있다.
예를 들어, 변수 s의 내용이 "저녁"이라면 ..."을 코드로 작성하면
if (s == "저녁") {
맞는 것 같지만, Java에서는 문자열의 비교는 "=="을 사용하면 안된다.
이유에 대해서는 나중에 설명함!
일단, 문자열의 비교를 할 때에는 반드시 다음과 같은 방법을 사용해야 함.
if (s.equals ("저녁")) { //문자열 비교는 문자열끼리.
if ("저녁".equals(s)) { // 반대도 가능.
"나이가 20세 이상이고, 성별이 남성"과 같은 2개 이상의 조건의 조합의 조건식을 사용하고 싶을때에는 논리연산자를 사용한다.
if (age >= 20 && gender == 1) {
if (name.equals("철수") || married == true) {
만약 ~이 아니면 을 조건식에 표현하고 싶으면 식의 앞에 부정연산자 !
를 붙인다.
- if - else 문
- if 만 있는 문장
- if - else if - else (false 일 때, 또 다시 조건으로 분기)
if (조건식) { 블록 1 } else { 블록 2 }
if (조건식) { 블록 1 }
if (조건식 1) {
블록 1
} else if (조건식 2) {
블록 2
} else {
최종블록
}
System.out.println("당신의 운세를 점쳐 드립니다");
int fortune = new java.util.Random().nextInt(4) + 1;
if (fortune == 1) {
System.out.println("대길");
} else if (fortune == 2) {
System.out.println("중길");
} else if (fortune == 3) {
System.out.println("길");
} else {
System.out.println("흉");
}
이 코드를 switch 문으로 바꿔보면 위 if문 식보다는 깔끔하게 되었다.
switch (fortune) {
case 1:
System.out.println("대길");
break;
case 2:
System.out.println("중길");
break;
case 3:
System.out.println("길");
break;
default:
System.out.println("흉");
break;
}
// break; 까먹지 말기!
public class Main {
public static void main(String[] args) {
System.out.println("당신의 운세를 점쳐 드립니다.");
int fortune = new java.util.Random().nextInt(5) + 1;
switch (fortune) {
case 1:
case 2:
System.out.println("좋네요!");
break;
case 3:
System.out.println("보통입니다.");
break;
case 4:
case 5:
System.out.println("음 ...");
}
}
}
이것을 if 문으로 쓰면 복잡하게 변한다.
이럴 때 switch 문을 쓰면 간단명료하게 나타낼 수 있다.
만약 화장실에 누군가 있다면 "문을 노크하고 1분 기다림"을 반복.
public class Toilet {
public static void main(String[] args) {
boolean isDoorClose = true;
while (isDoorClose == true) {
System.out.println("노크한다");
System.out.println("1분 기다린다");
}
System.out.println("화장실에 들어간다"); // false값일 때 동작.
} // 지금은 true로 설정했기 때문에 실행을 하게 되면 무한 반복 루프에 빠진다. 컴퓨터가 멈출수도 ...
}
- while 을 사용하면 "반복"제어를 행할 수 있다.
- whil의 뒤에는 ()안에 "문이 닫혔는가"등의 반복하는 조건을 쓴다.
- 반복 조건이 성립한다면 몇번이라도 블록 안의 코드가 반복 실행 된다.
- while 문
- do - while 문
- for 문
사람이 실수하면 프로그램이 잘못되고 종료되지 않는 그런 점 때문에 그렇게 많이 잘 쓰이진 않는다.
while (조건식) { 블록 1 }
do 안에 있는 블록을 먼저 실행 후, 조건에 맞는 코드를 반복한다.
이것도 별로 잘 안쓰임.do { 블록 1 } while (조건식)
❗️제일 많이 쓰는 문❗️
1. 루프 변수의 이름은 자유
2. 변수는 블록내에서 이용 가능
3. 블록 밖에서는 이용 불가
public class Main
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println("안녕하세요");
}
}
❗️ int i = 0 ➡️ 초기화 (for문 안에서 사용할 변수 선언)
❗️ i < 10; ➡️ 조건식
(언제까지 반복할껀지 조건을 써준다.
i가 10보다 작을 때 까지 반복하겠다는 의미.)
❗️ i++ ➡️ 반복 후 처리
(한번 반복이 끝나면 무엇을 수행할건지 써준다.)
public class Clear {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
System.out.print(i * j);
System.out.print(" ");
}
System.out.println(); // 첫번째 for문 기준 개행
}
}
}
- for (int i = 0; i < 10; i++) {
여기서 10번 다 돌면 바로 밑 for문으로 넘어간다.
0 0 0 0 0 0 0 0 0 0 // 한줄씩 카운팅. 0 1 2 3 4 5 6 7 8 9 0 2 4 6 8 10 12 14 16 18 0 3 6 9 12 15 18 21 24 27 ...
- for (int j = 0; j < 10; j++) {
System.out.print(i * j);
System.out.print(" ");
}또 10번 카운팅 하는데, i와 곱해지고 한칸 띄워지면서 카운팅된다. (하나하나 카운팅)
0 3 6 9 12 15 18 21 24 27 // 0, 3, 6, 9같이 하나 옆으로 카운팅된다.
경우에 따라 반복문 도중에 중단을 하고 싶을 때가 있다.
이럴 경우, Java 에서는 Break 문과 continue 문 2종류의 중단 방법이 준비되어 있다.
❗️break 문
for 문을 종료 (if 문과 자주 쓰인다.)for (int i = 1; i < 10; i++) { if (i == 3) { // 3번째에서 멈춤 break; } System.out.println(i); }
❗️countiue 문
이번만 중단하고, 계속해서 루프를 진행for (int i = 1; i < 10; i++) { if (i == 3) { // 3을 건너뛰고 진행 countinue; } System.out.println(i); }
💡 무한 루프
무한루프란, 말 그대로 무한하게 반복하는 제어구조를 말한다.
프로그래밍 초보들은 실수로 무한 루프에 빠지게 되는 경우가 있다.
의도적으로 무한 루프를 만드는 경우 다음 2가지 경우가 일반적이다.
- while (true) {...}
- for (;;) {...}