기본문법활용
#.01 문법간의 중첩구조
조건문, 반복문을 구성하는 블록 {}
안에 다른 문법 표현이 포함될 수 있다
자주 사용되는 패턴으로는 if-if
, if-for
, for-if
, for-for
가 있다.
if-if 구조
특정 조건이 참으로 판단되어 블록안에 진입했을 때, 상세조건을 판별하는 구조.
if (조건) {
if (조건) {
...
} else {
...
}
} else {
if (조건) {
...
} else {
...
}
}
IfNesting.java
public class IfNesting {
public static void main(String[] args) {
int point = 78;
if (point > 70 && point <= 80) {
if (point > 77) {
System.out.println("C+ 입니다.");
} else if (point < 74) {
System.out.println("C- 입니다.");
} else {
System.out.println("C0 입니다.");
}
}
}
}
출력결과
C+ 입니다.
if-for 구조
public class IfFor {
public static void main(String [] args) {
int k = 10;
// int k = 3;
if (k > 1 && k < 10) {
for (int i=1; i<10; i++) {
System.out.printf("%d x %d = %d\n", k, i, k*i);
}
}else {
System.out.println("2~9 사이의 수식만 출력합니다.");
}
}
}
출력결과
K = 10일때2~9 사이의 수식만 출력합니다.
k = 3 일때3 x 1 = 3
3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27
for-if 구조
반복문 안에서 매 반복 수행시마다 조건을 판별한다. 주로 반복문에 사용되는 조건값에 대한 조건 판별을 위해 사용된다.
ForIf.java
public class ForIf {
public static void main(String [] args) {
int max = 10;
int oddsum = 0; // 홀수의 합을 정의할 변수를 선언해준다
int evensum = 0; // 짝수의 합을 정의할 변수를 선언해준다
for (int i=1; i<=max; i++) { // max = 10이므로 10번까지 반복해주며 i값은 1씩 증가 i=1,2,3...
if (i % 2 == 0) {
System.out.printf("%d는 짝수\n", i);
evensum += i;
} else {
System.out.printf("%d는 홀수\n", i);
oddsum += i;
}
}
System.out.printf("1~%d까지 홀수들의 합: %d\n", max, oddsum);
System.out.printf("1~%d까지 짝수들의 합: %d\n", max, evensum);
}
}
출력결과
1는 홀수
2는 짝수
3는 홀수
4는 짝수
5는 홀수
6는 짝수
7는 홀수
8는 짝수
9는 홀수
10는 짝수
110까지 홀수들의 합: 2510까지 짝수들의 합: 30
1
CommouMultiple.java
어떤 수 i가 x로 나누어도 나머지가 0이고 y로 나누어도 나머지가 0일때 이 수를 x와 y의 공배수라고 한다.
2부터 9사이의 두 개의 정수 x, y를 입력받아 1부터 100까지의 범위 안에서 x와 y의 공배수를 모두 출력하고 공배수의 총 합인 sum값을 구해 출력하시오.
import java.util.Scanner;
public class CommouMultiple {
public static void main(String [] args) {
Scanner reader = new Scanner(System.in);
System.out.print("x를 입력하시오.");
int x = reader.nextInt();
System.out.print("y를 입력하시오.");
int y = reader.nextInt();
// 합산결과를 저장할 변수
int sum = 0;
// 1부터 100까지 반복 설정
for (int i =1; i<=100; i++) {
// x로 나누었을때 나머지가 0이고 y로 나누었을때 나머지가 0인 값 판별
if (i % x ==0 && i% y == 0) {
System.out.println(i);
sum += i;
}
}
System.out.println("공배수의 총 합: " + sum);
}
}
출력결과
x를 입력하시오.3
y를 입력하시오.5
15
30
45
60
75
90
공배수의 총 합: 315
LastNoune.java
반복 수행 시 마지막 회차는 생략하도록 처리하는 방법
public class LastNoune {
public static void main(String[] args) {
for (int i=0; i<10; i++) {
//조건값이 마지막이 아닌 경우만 실행하도록 if문을 구성
// [공식1] 조건식이 "변수 < 최대값" 인 경우 -> 변수 + 1 < 최대값
// [공식2] 조건식이 "변수 <= 최대값" 인 경우 -> 변수 < 최대값
if (i + 1 < 10) {
System.out.println("i=" + 1);
}
}
}
}
출력결과
i=0
i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8
forfor 구문 구조
바깥 반복이 1회 수행할 때 마다 안쪽의 반복문이 매번 처음부터 새로 시작하는 이중 반복문 구조.
ForFor.java
public class ForFor {
public static void main(String[] args) {
for (int i=0; i<3; i++) {
System.out.println("i에 대한 반복 수행 시작 >> i=" +i);
for (int j=0; j<5; j++) {
System.out.printf("\ti=%d, j=%\n", i, j);
}
System.out.println("i에 대한 반복 수행 종료 >> i=" + i);
}
}
}
출력결과
i에 대한 반복 수행 시작 >> i=0
i=0, j=0
i=0, j=1
i=0, j=2
i=0, j=3
i=0, j=4
i에 대한 반복 수행 종료 >> i=0
i에 대한 반복 수행 시작 >> i=1
i=1, j=0
i=1, j=1
i=1, j=2
i=1, j=3
i=1, j=4
i에 대한 반복 수행 종료 >> i=1
i에 대한 반복 수행 시작 >> i=2
i=2, j=0
i=2, j=1
i=2, j=2
i=2, j=3
i=2, j=4
i에 대한 반복 수행 종료 >> i=2
Gugu.java
public class Gugu {
public static void main(String[] args) {
for (int i=2; i<10; i++) {
for (int j=1; j<10; j++) {
System.out.printf("%d x %d = %d\n", i, j, i * j);
}
if (i + 1 < 10) {
System.out.println("----------------");
}
}
}
}
출력결과
2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18
3 x 1 = 3
3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27
4 x 1 = 4
4 x 2 = 8
4 x 3 = 12
4 x 4 = 16
4 x 5 = 20
4 x 6 = 24
4 x 7 = 28
4 x 8 = 32
4 x 9 = 36
5 x 1 = 5
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
5 x 6 = 30
5 x 7 = 35
5 x 8 = 40
5 x 9 = 45
6 x 1 = 6
6 x 2 = 12
6 x 3 = 18
6 x 4 = 24
6 x 5 = 30
6 x 6 = 36
6 x 7 = 42
6 x 8 = 48
6 x 9 = 54
7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35
7 x 6 = 42
7 x 7 = 49
7 x 8 = 56
7 x 9 = 63
8 x 1 = 8
8 x 2 = 16
8 x 3 = 24
8 x 4 = 32
8 x 5 = 40
8 x 6 = 48
8 x 7 = 56
8 x 8 = 64
8 x 9 = 72
9 x 1 = 9
9 x 2 = 18
9 x 3 = 27
9 x 4 = 36
9 x 5 = 45
9 x 6 = 54
9 x 7 = 63
9 x 8 = 72
9 x 9 = 81
이중 반복문에서 안쪽 반복문의 반복 범위를 동적으로 설정하기
자식 반복문의 조건식이 부모 반복문의 조건변수를 활용하여 구성되면 자식 반복문의 반복 범위에 변화를 줄 수 있다.
IncreaseCondition.java
1부터 5까지의 범위를 갖는 반복문 안에 자식 반복문을 추가하고 자식 반복문이 부모 반복문의 반복회차 만큼 실행 되도록 하기
public class IncreaseCondition {
public static void main(String[] args) {
for (int i=0; i<5; i++) {
for (int j=0; j<i+1; j++) {
System.out.printf("i=%d, j=%d\n", i, j);
}
if (i + 1 < 5) {
System.out.println("--------");
}
}
}
}
출력결과
i=0, j=0
i=1, j=0
i=1, j=1
i=2, j=0
i=2, j=1
i=2, j=2
i=3, j=0
i=3, j=1
i=3, j=2
i=3, j=3
i=4, j=0
i=4, j=1
i=4, j=2
i=4, j=3
i=4, j=4
StraeAsc.java
아래의 출력결과가 표시되도록 구현하시오.
변수는 반복문에 사용되는 i, j외에 사용할 수 없으며 출력문은
System.out.print()
만을 사용해야 합니다
내 풀이
public class StarAsc {
public static void main(String[] args) {
for (int i=0; i<7; i++) { // 몇 줄을 생성할건지
// 바깥의 반복은 행을 결정한다
for (int j=0; j<i+1; j++) { // 별의 갯수
System.out.print("*");
} // 안쪽의 반복은 열은 결정한다.
// -> i가 0일때 1회를 수행하기 위해서 j < 1
// -> i가 1일때 2회를 수행하기 위해서 j < 2
// -> i가 2일때 3회를 수행하기 위해서 j < 3
// -> i가 3일때 4회를 수행하기 위해서 j < 4
// -> i가 n일때 i+1회를 수행하기 위해서 j < i+1
System.out.print('\n'); // 위의 for의 별찍기가 끝나면 다음줄로 넘어간다.
}
}
}
출력결과
*
**
StarDesc.java
StarAsc 예제에서 자식 반복문의 j값에 대한 조건식만 수정하여 반대의 결과가 표시되도록 소스코드를 수정하시오
위와 같은 문제에서 반대로 출력 되도록 출력하시오.
public class StarDesc {
public static void main(String[] args) {
for (int i=0; i<7; i++) { // 몇 줄을 생성할건지
// 바깥의 반복은 행을 결정한다
for (int j=0; j<7-i; j++) { // 별의 갯수
System.out.print("*");
} // 안쪽의 반복은 열은 결정한다.
// -> i가 0일때 7회를 수행하기 위해서 j < 7
// -> i가 1일때 6회를 수행하기 위해서 j < 6
// -> i가 2일때 5회를 수행하기 위해서 j < 5
// -> i가 3일때 4회를 수행하기 위해서 j < 4
// -> i가 n일때 7-i회를 수행하기 위해서 j < 7-i
System.out.print('\n'); // 위의 for의 별찍기가 끝나면 다음줄로 넘어간다.
}
}
}
출력결과
**
*
변수의 유효성 범위 (변수의 스코프)
1) 변수는 자신이 최초로 선언된 블록 {}
보다 바깥 블록에서는 인식되지 못하고 자신이 선언된 블록보다 안쪽 블록에서는 식별가능하다.
ValueRange1.java
public class ValueRange1 {
public static void main(String[] args) {
if (true) {
int num = 100;
for (int i=0; i<5; i++) {
// 선언된 위치보다 하위 블록에서는 식별 가능
num++;
}
}
// 선언된 위치보다 바깥 블록이므로 에러
System.out.println(num);
}
}
출력결과
ValueRange1.java:12: error: cannot find symbol
System.Out.println(num);
^
symbol: variable num
location: class ValueRange1
ValueRange1.java:12: error: cannot find symbol
System.Out.println(num);
^
symbol: variable Out
location: class System
2 errors
2) for문의 초기식에서 선언한 변수도 for문에 속한것으로 보기 때문에 for문을 벗어나서는 인식되지 못한다.
ValueRange2.java
public class ValueRange2 {
public static void main(String[] args) {
int num = 100;
for (int i=0; i<5; i++) {
// 선언된 위치보다 하위 블록에서는 식별가능
num++;
}
System.out.println(i); // <- 에러
}
출력결과
컴파일시에 아래와 같은 에러 발생
ValueRange2.java:9: error: cannot find symbol 뜻 :기호를 찾을수 없습니다
System.out.println(i); // <- 에러 i라는 값이 없다
^
symbol: variable i 기호
location: class ValueRange2 위치 ValieRange2 라는 클래스
1 error
3) 서로 다른 블록간의 변수 중복 선언
선언된 위치를 기준으로 바깥 블록에서는 그 변수를 인식하지 못하기 때문에 서로 다른 블록간에는 중복선언이 가능하다.
ValueRange3.java
public class ValueRange3 {
public static void main(String[] args) {
int target = 100;
if (target == 100) {
//아래에서 선언된 num은 if블록 밖에서는 인식되지 않는다
int num = target + 100;
System.out.println(num);
} else {
// 아래에서 선언된 num은 else 블록 밖에서는 인식되지 않는다.
int num = target - 100;
System.out.println(num);
}
}
}
출력결과
200
InfiniteLoop1.java
반복문의 조건식 설정상의 오류로 반복문이 종료되지 않고 영원히 실행되는 상태
반복문이 실행되는 동안은 순간적으로 CPU의 점유율이 100%까지 올라가기 때문에 다른 프로그램들이 컴퓨터의 하드웨어 자원을 사용하지 못하게 되어 전체적으로 컴퓨터의 성능 저하가 발생한다.
그러므로 무한루프에 빠지지 않도록 주의해야 한다.
public class InfiniteLoop1 {
public static void main(String[] args) {
int num = 1;
while (true) {
System.out.println("Hello World >> " + num);
num++;
}
}
}
출력결과
Hello World >> 1
Hello World >> 2
Hello World >> 3
Hello World >> 4
Hello World >> 5
Hello World >> 6
.
.
.
.(무한생성)
sublime에서는
Tools > Cancel Build
메뉴를 사용하여 실행중인 자바프로그램을 종료해야한다.
단순히Esc
만 누를 경우 자바프로그램이 종료되지 않은 상태로 출력창만 닫힌다.
InfiniteLoop2.java
1씩 증가해서 언제가는 10을 초과해야하는 i값이 1씩 감소하여 점점 10보다 더 작아지기 때문에 무한루프에 빠지게 된다.
public class InfiniteLoop2 {
public static void main(String[] args) {
for (int i=0; i<10; i--) {
System.out.println("i=" + i);
}
}
}
2) break
반복문(while, for)안에서 반복문을 강제로 중단시키는 기능을 한다.
반복을 몇 번 수행해야 할지 가늠할 수 없을 때 의도적으로 무한루프를 수행시키기도 하는데 이 경우 특정 조건이 충족되면 반복을 중단하도록 설정할 수 있다.
Break.java
두 배씩 증가하는 값이 500보다 커지기 위해서는 총 몇 번을 곱해야 하는지 카운트하기
public class Break {
pubilc static void main(String[] args) {
int times = 1; // 2배씩 커지는 값을 저장할 변수
int count = 0; // 반복 횟수를 저장할 변수
while (true) {
count++; // 반복을 수행한 횟수를 1증가 시킨다.
times *= 2; // 2배 증가
System.out.println(times);
if (time > 500) {
break; // 강제종료
}
}
System.out.println("총 " + count + "회 수행했습니다.");
}
}
출력결과
2
4
8
16
32
64
128
256
512
총 9회 수행했습니다.
3) continue
반복문 안에서 현재 회차를 중단하고 다음 회차로 넘어가게 된다.
- while문: 조건식으로 강제 이동한다.
- for문: 증감식으로 강제 이동한다.
Continue1.java
홀수만 출력하는 프로그램
public class Continue1 {
public static void main(String[] args) {
int num = 0;
while (num < 10) {
num++;
if (num % 2 == 0) {
continue; // 짝수인 경우 조건식으로 강제이동
}
System.out.println(num);
}
}
}
출력결과
1
3
5
7
9
사실 아래와 같이 코딩하는 것이 더 간결하기 때문에 잘 사용되지 않는다.
public class Continue1 {
public static void main(String[] args) {
int num = 0;
while (num < 10) {
num++;
if (num % 2 != 0) {
//홀수만 출력
System.out.println(num);
}
}
}
}
Coutinue2.java
0부터 10 미만의 수 중에서 홀수의 합을 구한느 과정을 출력하는 프로그램
public class Continue2 {
public static void main(String[] args) {
int sum = 0;
for (int i=0; i<10; i++) {
if(i % 2 == 0) {
continue; // for문의 증감식인 `i++`로 이동한다.
}
sum += i;
System.out.println(sum);
}
}
}
출력결과
1
4
9
16
25
사실 아래와 같이 코딩하는 것이 더 간결하기 때문에 잘 사용되지 않는다.
public class Continue2 {
public static void main(String[] args) {
int sum = 0;
for (int i=0; i<10; i++) {
if(i % 2 != 0) {
sum += i;
System.out.println(sum);
}
}
}
}
4) 반복의 변화량 조절
거의 대부분 경우 조건값이 1씩 증가하거나 1씩 감소하도록 설정하지만 필요하다면 변화량을 조절하여 2씩 증가하거나 10씩 증가하는 등 다양하게 설정할 수 있다.
Step1.java
while문을 써서 0부터 100미만까지의 수 중에서 10의 배수만 합산하는 프로그램
public class Step1 {
public static void main(String[] args) {
int sum = 0; // 총 합을 저장할 변수
int i = 0; // 초기식
while (i < 100) { // 조건식
sum += i;
System.out.printf("i=%d, sum=%d\n", i, sum);
i += 10; // 증감식 (10씩 증가)
}
}
}
#####출력결과
i=0, sum=0
i=10, sum=10
i=20, sum=30
i=30, sum=60
i=40, sum=100
i=50, sum=150
i=60, sum=210
i=70, sum=280
i=80, sum=360
i=90, sum=450
Step2.java
0부터 10미만 수 중에서 짝수만 골라서 합산하는 프로그램
짝수만 판단하기 위해 증감식이 2씩 증가한다.
public class Step2 {
public static void main(String[] args) {
int sum = 0; // 총 합을 저장할 변수
for (int i=0; i<10; i+=2) {
sum += i;
System.out.printf("i=%d, sum=%d\n", i, sum);
}
}
}
출력결과
i=0, sum=0
i=2, sum=2
i=4, sum=6
i=6, sum=12
i=8, sum=20