목차
03 조건문, 반복문, 배열
3.1 if-else 문
- 조건에 따라서 서로 다른 처리를 하고 싶을 때 사용
- https://kyeong-hoon.tistory.com/47 참조
다중 if-else 문
- if-else 문장이 연속되는 형태
예제 가위, 바위, 보
package practice;
import java.util.Scanner;
public class RockScissorsPaper {
final int SCISSORS = 0;
final int ROCK = 1;
final int PAPER = 2;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("가위(0), 바위(1), 보(2) : ");
int computer = (int) (Math.random() * 3);
int user = sc.nextInt();
if (user == computer) {
System.out.println("비겼습니다.");
} else if (user == (computer + 1) % 3) {
System.out.println("당신 : " + user + " 컴퓨터 : " + computer + " 당신이 이겼습니다.");
} else {
System.out.println("당신 : " + user + " 컴퓨터 : " + computer + " 당신이 졌습니다.");
}
sc.close();
}
}
-------------------------------------------------------------------------
결과 (3회 반복)
가위(0), 바위(1), 보(2) : 1
당신 : 1 컴퓨터 : 0 당신이 이겼습니다.
가위(0), 바위(1), 보(2) : 1
비겼습니다.
가위(0), 바위(1), 보(2) : 2
당신 : 2 컴퓨터 : 1 당신이 이겼습니다.
3.2 switch 문
switch(제어식)
{
case c1:
문장1;
break;
case c2:
문장2;
break;
...
default:
문장d;
break;
}
- default 문은 어떤 case 문과도 일치되지 않는 경우에 실행. 없을 수도 있다. 가급적 default문을 포함 시키는것이 좋음
- break문이 없으면 선택된 case 절 안의 문장들을 실행한 다음, 계속해서 다음 case절의 문장을 실행
- 소수점이 들어간 실수는 사용할 수 없음
switch 문에 문자열 사용
- switch 문의 제어식으로 String 객체를 사용
향상된 switch 문
- Java 12 부터 "화살표"를 사용하는 향상된 switch 문 사용 가능
package practice;
public class practice {
public static void main(String[] args) {
var day = "SAT";
var today = "";
switch (day) {
case "SAT", "SUN" -> today = "주말";
case "MON", "TUE", "WED", "THU", "FRI" -> today = "주중";
default -> System.out.println("Error");
}
System.out.println(today);
}
}
여기서 break는 없어도된다.
3.3 for 문
초기식 : 반복 루프를 시작하기 전에 한 번만 실행. 제어 변수를 선언하고 초기화하는 용도
선언된 변수는 for문 안에서만 사용 가능
조건식 : 반복의 조건을 검사하는 수식. true면 계속 false면 중단
증감식 : 한 번의 반복 루프가 끝나면 실행
예제 : 약수 계산하기
사용자로부터 양의 정수를 입력받아 그 정수의 모든 약수를 출력하는 프로그램 작성
package practice;
import java.util.Scanner;
public class Divisor {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("양의 정수를 입력하세요 : ");
int num = sc.nextInt();
System.out.println(num + "의 약수는 다음과 같습니다.");
for (int i = 1; i <= num; i++) {
if (num % i == 0) {
System.out.print(i + " ");
}
}
sc.close();
}
}
-------------------------------------------------------------------------------
결과
양의 정수를 입력하세요 : 100
100의 약수는 다음과 같습니다.
1 2 4 5 10 20 25 50 100
3.4 while 문
- 어떤 조건을 정해놓고 반복을 하는 구조
do-while 문
- 조건을 검사하기 전에 블록 안의 문장을 실행한다. 적어도 한번은 실행됨
중첩 반복문
- 내부 반복문은 외부 반복문이 한 번 반복할 때마다 새로 실행
- 각각의 제어 변수가 달라야 한다.
break 문
- 반복문을 벗어날 때 사용.
continue 문
- 현재의 반복을 건너뛰어서 다음 반복으로 넘어감
무한 루프와 break 문
- while (true) 로 무한 루프를 만들고 특정 조건에서 break를 사용하여 빠져나온다.
3.5 배열
- 배열 : 여러 개의 변수를 하나로 묶어 넣은 것
- 배열의 요소들은 인덱스라 불리는 번호가 붙어 있고 이 번호를 통하여 배열 요소에 접근할 수 있다.
배열의 선언과 사용
- 배열은 객체이다.
int[] s; // 정수형 배열 s 선언.
s = new int[10]; // 크기 10짜리 배열 생성.
// 한번에 할 수 있음
int[] s = new int[10];
// 크기는 상수가 아니어도 됨
int size = 10;
int[] s = new int[size];
참조 변수 선언 방법
int[] values;
int values[];
둘다 똑같고 써도 되는데 자료형과 변수를 명확하게 분리하기 위해 자료형에 붙이는걸 선호
반복문과 배열
- 배열의 각각의 요소는 인덱스라는 번호로 접근할 수 있다.
- 배열은 한번 생성되면 크기를 변경할 수 없다.
- 만약 실행 도중에 배열의 크기를 변경해야 한다면 ArrayList나 Vector 클래스를 사용하여야 한다.
배열의 크기
- 변수명.length
배열의 초기화
- 선언과 동시에 초기화를 하면 new 연산자를 사용하지 않아도 되고, 크기를 지정하지 않아도 된다.
int[] scores = { 10, 20, 30, 40, 50}
- 이 방법은 배열에 저장되는 수를 미리 알고 있는 경우에 사용
for-each 루프
- 배열의 각 요소를 순차적으로 접근할 수 있다.
int[] list = { 1, 2, 3, 4, 5}
for(int e : list){
System.out.println(e);
}
1
2
3
4
5
- for (int i = 0; i < list.length; i++) 와 동일한 효과 (물론 list[i]를 쓰는것과 변수를 새로 선언해서 값을 넣어서 사용하는 차이는 있음)
- for-each 루프는 배열 크기를 신경 쓰지 않아도 되고, 인덱스 값을 저장하는 변수(i)를 생성할 필요도 없고, 사용법이 간결하여 오류가 발생할 가능성이 적다.
- 단, 배열 요소의 값을 변경하는 경우, 역순으로 처리하는 경우, 일부 요소만 처리하는 경우, 하나의 반복에서 두 개 이상의 배열을 처리하는 경우에는 for-each가 부적합
배열의 모든 요소 값을 출력하는 간단한 방법
System.out.println(Arrays.toString(list));
배열에서 인덱스가 배열의 크기를 벗어날 때 예외(오류)가 발생.
예외 이름은 ArrayIndexOutOfBoundsExcepiton
3.6 2차원 배열
int[][] s = new int[3][5]; // 3행 x 5열의 요소를 가지는 2차원 배열 선언
// 2차원 배열을 처리하는 프로그램은 일반적으로 중첩된 루프 사용.
for(int i = 0; i < 3; i++){
for(int j = 0; j < 5; j++){
System.out.print(s[i][j] + " ");
}
System.out.println();
}
2차원 배열의 초기화
- 같은 행의 요소를 중괄호로 묶는다.
int[][] testArray ={
{10, 20, 30},
{40, 50, 60},
{70, 80, 90}
};
래그드 배열
- 자바에서 다차원 배열은 "배열의 배열"을 이용하여서 구현된다.
- 실제로 다차원 배열은 없고 1차원 배열밖에 없다.
- 2차원 배열 s[][]에서 s[i]는 배열 s의 i번째 요소이고 이것은 다시 배열이 된다.
- 래그드 배열(ragged array) : 행마다 길이가 다른 배열
예시. i번째 행의 길이는 (i+1)
MAX_ROWS = 3;
int[][] ragged = new int[MAX_ROWS][];
for(int r = 0; r < MAX_ROWS; r++){
ragged[r] = new int[r+1];
}
for (int i = 0; i < ragged.length; i++) {
for (int j = 0; j < ragged[i].length; j++) {
ragged[i][j] = j;
}
}
- 배열명[] = new int[]; 로 배열의 배열을 선언해도 되지만, 아래처럼 바로 초기화 할 수 있음.
int[][] ragged = {{0},{0,1},{0,1,2}}
3.7 ArrayList
- 배열의 크기를 동적으로 변경하면서 사용할 수 있다.
ArrayList<자료형(클래스명으로)> 변수명;
변수명 = new ArrayList<자료형(클래스명으로)>();
변수명.add(값);
변수명.add(값);
- 변수명.remove(index 번호); : 삭제
Mini Project 숫자 추측 게임
1 ~ 100까지의 숫자 맞추기
입력 받은 숫자보다 타겟 숫자가 작은지 큰지 출력해줌.
package practice;
import java.util.*;
public class GuessNumber {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Random random = new Random();
int targetNumber = random.nextInt(100) + 1;
int count = 1;
while (true) {
System.out.println("1부터 100까지의 숫자를 입력해주세요");
int inputNumber = sc.nextInt();
if (inputNumber == targetNumber) {
System.out.println("정답을 맞추셨습니다. 정답 : " + inputNumber);
System.out.println("당신의 시도 횟수 : " + count);
break;
} else if (inputNumber < targetNumber) {
System.out.println(inputNumber + "보다 큽니다.");
} else {
System.out.println(inputNumber + "보다 작습니다.");
}
count++;
}
sc.close();
}
}
1부터 100까지의 숫자를 입력해주세요
50
50보다 작습니다.
1부터 100까지의 숫자를 입력해주세요
25
25보다 큽니다.
1부터 100까지의 숫자를 입력해주세요
37
37보다 큽니다.
1부터 100까지의 숫자를 입력해주세요
43
43보다 큽니다.
1부터 100까지의 숫자를 입력해주세요
46
46보다 큽니다.
1부터 100까지의 숫자를 입력해주세요
48
48보다 작습니다.
1부터 100까지의 숫자를 입력해주세요
47
정답을 맞추셨습니다. 정답 : 47
당신의 시도 횟수 : 7
Summary
- 조건문은 조건에 따라 여러 실행 경로로 분기하는 구조로서 if-else 문, switch 문이 있다.
- break 문은 현재의 반복을 중3단하고 반복 루프를 빠져나갈 때 사용한다.
- switch 문의 case 절에는 정수, 문자, 문자열이 올 수 있다.
- 반복문은 조건에 따라 문장을 반복하여 실행하는 구조로서 for 문, while 문이 있다.
- do-while 문은 문장을 무조건 한번 실행한 후에 조건을 검사하여 반복한다.
- 반복문 안에 다른 반복문을 포함할 수 있다.
- 배열은 같은 자료형의 데이터를 여러 개 순차적으로 저장하는 자료 구조이다.
- 자바에서 배열은 객체이다.
- 자바에서 배열을 생성하려면 먼저 참조 변수부터 선언한다. 참조 변수는 배열 객체의 주소를 저장하는 변수이다. 이어서 배열을 생성하여 저장 공간을 확보한다.
- 정수 3개를 저장하는 배열은 int[] a = new int[3];와 같이 만든다.
- 배열의 크기는 배열 객체의 length 필드에 저장된다.
Programming
369게임 만들기 (50까지만)
package practice;
public class Game369 {
public static void main(String[] args) {
for (int i = 1; i <= 50; i++) {
int a = i / 10; // 10의 자리수
int b = i % 10; // 1의 자리수
if ((a == 3 || a == 6 || a == 9) && (b == 3 || b == 6 || b == 9)) {
System.out.print("짝짝 ");
} else if ((a == 3 || a == 6 || a == 9) || (b == 3 || b == 6 || b == 9)) {
System.out.print("짝 ");
} else {
System.out.print(i + " ");
}
// 10개 마다 줄바꿈을 위한 코드
if (i%10 == 0) {
System.out.println();
}
}
}
}
1 2 짝 4 5 짝 7 8 짝 10
11 12 짝 14 15 짝 17 18 짝 20
21 22 짝 24 25 짝 27 28 짝 짝
짝 짝 짝짝 짝 짝 짝짝 짝 짝 짝짝 40
41 42 짝 44 45 짝 47 48 짝 50
실수 발생 (https://kyeong-hoon.tistory.com/91)
2 ~ 100 사이의 모든 소수를 출력하라
package practice;
public class PrimeNumber {
public static void main(String[] args) {
System.out.print("2부터 100사이의 모든 소수 : ");
for (int i = 2; i < 101; i++) {
boolean flag = true; // 어떤 수로 나누어 떨어질 때를 체크 하기위함
for (int j = 2; j < i; j++) {
if (i % j == 0){
flag = false;
}
}
if (flag) {
System.out.print(i + " ");
}
}
}
}
2부터 100사이의 모든 소수 : 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
피보나치 수열 출력하기 (항의 갯수는 10개)
package practice;
import java.util.Scanner;
public class Fibonacci {
public static void main(String[] args) {
int[] num = new int[3];
int RESULT = 2; // 출력할 인덱스 번호
Scanner sc = new Scanner(System.in);
System.out.print("출력할 항의 개수 : ");
int max = sc.nextInt();
for (int i = 0; i < max; i++) {
num[RESULT] = num[0] + num[1];
num[0] = num[1];
num[1] = num[RESULT];
System.out.print(num[RESULT] + " ");
// 피보나치 수열의 초기 0 1 을 맞추기 위해 작성
if (num[RESULT] == 0) {
num[0] = 1;
}
}
sc.close();
}
}
출력할 항의 개수 : 10
0 1 1 2 3 5 8 13 21 34
'Java > 교재 정리' 카테고리의 다른 글
06 상속 (1) | 2024.04.23 |
---|---|
05 클래스와 객체 II (0) | 2024.04.18 |
04 클래스와 객체 I (0) | 2024.04.15 |
02 자바 프로그래밍 기초 (0) | 2024.04.12 |
01 자바 소개와 개발도구 설치 (0) | 2024.04.11 |