개발자입니다
[Java] 예제 소스 정리 - 제어문(if, for, while, ArrayList) 본문
[Java] 예제 소스 정리 - 제어문(if, for, while, ArrayList)
끈기JK 2022. 12. 30. 10:28com.eomcs.lang.ex06
예제 소스 정리
제어문
# 흐름 제어문 - if 문의 조건
// if 문의 조건은 반드시 boolean 데이터여야 한다.
if (true) System.out.println("1111");
if (false) System.out.println("2222");
if (10 < 8 + 5) System.out.println("3333");
// 그 외의 모든 데이터 타입은 컴파일 오류이다.
// if (1) System.out.println("4444"); // 컴파일 오류!
// if (3.14f) System.out.println("4444"); // 컴파일 오류!
// if (0b0110 & 0b0011) System.out.println("4444"); // 컴파일 오류!
// == 연산자 대신 =을 사용한 경우,(오타)
int a = 100;
if (a == 100) System.out.println("5555"); // OK!
// 다음은 a 변수에 100을 넣는다.
// 그런데 a가 boolean이 아니기 때문에 컴파일 오류가 발생한다.
// if (a = 100) System.out.println("6666"); // 컴파일 오류!
boolean b;
if (b = true) System.out.println("된다!");
# 흐름 제어문 - else 문의 소속
int age = 15;
// else는 가장 가까운 if에 소속된다.
// 들여쓰기에 속지 말라!
if (age >= 19)
if (age >= 70)
System.out.println("지하철 무임승차 가능합니다.");
else
System.out.println("미성년입니다.");
System.out.println("------------------------------");
// 어? 강사님, if 문에 블록을 사용하지 않으면
// 오직 한 개의 문장만 온다고 했는데,
// 위의 코드를 보면 if (age > 19) 안에
// if 와 else 두 개의 문장이 있잖아요.
// 그럼 컴파일 오류가 발생해야 되는 거 아닌가요?
// => else문은 if 없이 단독으로 사용할 수 없다.
// 오직 if가 있어야만 사용할 수 있다.
// 그래서 if ~ else ~ 는 한 문장으로 취급한다.
// => 그런 이유로, 위의 if (age >= 70) ~ else ~ 는 한 문장으로 간주한다.
// 굳이 다음과 같이 중괄호를 사용할 필요 없다.
if (age >= 19) {
if (age >= 70)
System.out.println("지하철 무임승차 가능합니다.");
else
System.out.println("미성년입니다.");
}
System.out.println("------------------------------");
// 만약 else 문을 첫 번째 if 문에 소속되게 하고 싶다면
// 다음과 같이 두 번재 if 문을 블록으로 묶어라!
if (age >= 19) {
if (age >= 70)
System.out.println("지하철 무임승차 가능합니다.");
}
else // 두 번째 if는 첫 번째 if 블록에 묶여있기 때문에 이 else와 상관없다.
System.out.println("미성년입니다.");
# 흐름 제어문 - switch 사용 전
nextInt() 관련 설명도 있다.
// 키보드 입력을 다루는 도구 생성
Scanner keyScan = new Scanner(System.in);
System.out.println("[지원부서]");
System.out.println("1. S/W개발");
System.out.println("2. 일반관리");
System.out.println("3. 시설경비");
System.out.print("지원 분야의 번호를 입력하세요? ");
// 사용자가 콘솔 창에 입력할 수 있도록
// 커서를 대기시키고 싶다면 nextInt()를 실행하라!
// => nextInt()는 사용자가 숫자를 입력하고 엔터를 칠 때까지 기다린다.
int no = keyScan.nextInt();
System.out.println("제출하실 서류는 다음과 같습니다.");
if (no == 1) {
System.out.println("정보처리자격증");
System.out.println("졸업증명서");
System.out.println("이력서");
} else if (no == 2) {
System.out.println("졸업증명서");
System.out.println("이력서");
} else if (no == 3) {
System.out.println("이력서");
} else {
System.out.println("올바른 번호를 입력하세요!");
}
keyScan.close();
if vs switch
- 복잡한 조건으로 프로그램 흐름을 제어해야 하는 상황이라면, if 문을 사용하라!
- int나 문자열처럼 단순한 값으로 프로그램을 제어할 수 있다면, switch문을 사용하는 게 낫다.
# 흐름 제어문 - switch 문법
switch (값) {}
값으로 가능한 데이터 타입은?
=> int 정수(byte,short,int,char), 문자열, 특별한 상수 Enum 타입
=> case 값으로 변수를 사용할 수 없다. 리터럴만 가능하다.
// case에는 리터럴만 올 수 있다.
// 즉 변수를 사용할 수 없다.
int x = 1, y = 300;
switch (x) {
case 1 * 300: // OK
// case 1 * y: // 컴파일 오류!
# 흐름 제어문 - switch 문법
// switch (값) {}
// 값으로 가능한 데이터 타입은?
// => int 정수(byte,short,int,char), 문자열, 특별한 상수 Enum 타입
// => case 값으로 변수를 사용할 수 없다. 리터럴만 가능하다.
// 컴파일 오류
// - 4바이트를 넘어가는 정수는 사용할 수 없다.
// long l = 2;
// switch (l) {
// case 1:
// case 2:
// default:
// }
// 컴파일 오류
// - 부동소수점은 사용할 수 없다.
// float f = 2;
// switch (f) {
// case 1.1f:
// case 2.7f:
// default:
// }
// 컴파일 오류
// - boolean 값을 switch와 case에 사용할 수 없다.
// boolean bool = true;
// switch (bool) {
// case true:
// case false:
// }
# 흐름 제어문 - switch 문법 II
int level = 1;
// 상수를 사용하면 주석없이 바로 이해할 수 있다.
// => case 문자의 값으로 변수를 사용할 수 없다.
// => 단 값이 변경되지 않는 final 변수라면 사용할 수 있다.
//
final int GUEST = 0, MEMBER = 1, ADMIN = 2;
switch (level) {
case GUEST:
System.out.println("조회만 가능합니다.");
break;
case MEMBER:
System.out.println("글작성 가능합니다.");
break;
case ADMIN:
System.out.println("다른 회원의 글을 변경, 삭제할 수 있습니다.");
break;
}
# 흐름 제어문 - switch 문법 II
상수를 좀 더 조직적으로 관리하는 방법
=> enum을 사용하여 상수를 정의한다.
=> nested enum은 기본이 static 이다.
그래서 static을 생략해도 된다.
public class Exam0242 {
enum Level {
GUEST, MEMBER, ADMIN
}
public static void main(String[] args) {
// enum으로 정의된 상수를 사용하려면
// enum 타입의 변수를 선언해야 한다.
// => final int처럼 직접 값을 지정하지 않아도 된다.
// => 값을 직접 지정할 수도 있다. (나중에 따로 enum 문법에서 설명)
//
// enum을 사용하는 주된 이유는?
// => 100, 200, "admin" 과 같이 값을 직접 지정할 필요가 없다.
// => enum 변수에는 그 타입에 정의된 값만 저장할 수 있다.
// => 안전한 코드를 작성할 수 있다.
//
Level level = Level.MEMBER;
// 다음과 같이 switch나 case 값으로 enum 타입의 값이 올 수 있다.
switch (level) {
case GUEST:
System.out.println("조회만 가능합니다.");
break;
case MEMBER:
System.out.println("글작성 가능합니다.");
break;
case ADMIN:
System.out.println("다른 회원의 글을 변경, 삭제할 수 있습니다.");
break;
}
}
}
# 흐름 제어문 - break와 continue 활용
int count = 0;
int sum = 0;
// 1부터 100까지의 짝수의 합은?
// => continue 사용 전
count = 0;
sum = 0;
while (count < 100) {
count++;
if ((count & 1) == 0) { // count & 1 ==> count & 0x01 ==> count % 2
sum += count;
}
}
System.out.printf("count=%d, sum=%d\n", count, sum);
System.out.println("------------------------");
// => continue 사용 후
count = 0;
sum = 0;
while (count < 100) {
count++;
if (count % 2 == 1)
continue; // 다음 문장을 실행하지 않고 즉시 조건 검사로 이동한다.
sum += count;
}
System.out.printf("count=%d, sum=%d\n", count, sum);
# 흐름 제어문 - 중첩된 반복문 탈출
int x = 2, y = 1;
// 5 * 5 까지만 출력하라!
//
while (x <= 9) {
while (y <= 9) {
System.out.printf("%d * %d = %d\n", x, y, x * y);
if (x == 5 && y == 5)
break; // 이 break는 자신이 소속된 가장 가까운 반복문을 나간다.
y++;
}
System.out.println();
x++;
y = 1;
}
System.out.println("종료!!");
# 흐름 제어문 - 중첩된 반복문 탈출
int x = 2, y = 1;
// 라벨명: 반복문1 { 반복문2 {break 라벨명;}}
// 라벨 문법:
// 라벨: 문장;
// 라벨: {문장1, 문장2, ...}
myloop:
while (x <= 9) {
while (y <= 9) {
System.out.printf("%d * %d = %d\n", x, y, x * y);
if (x == 5 && y == 5)
break myloop; // myloop 라벨에 소속된 문장을 나간다.
y++;
}
System.out.println();
x++;
y = 1;
}
System.out.println("종료!!");
System.out.println("-----------------------------");
# 흐름 제어문 - do ~ while 반복문
public class Exam0340 {
public static void main(String[] args) {
int i = 0;
// 1부터 10까지 출력하기
do
System.out.println(++i);
while (i < 10);
System.out.println("---------------------");
// 여러 개의 문장을 반복할 때는 블록으로 묶어라!
i = 0;
do {
i += 1;
System.out.println(i);
} while (i < 10);
}
}
/*
# do ~ while
- 최소 한 번은 반복한다.
- 한 번 이상 반복하면 do ~ while
- 0 번 이상 반복하면 while
do
문장1;
while (조건);
do {
문장1;
문장2;
문장3;
} while (조건);
*/
# 흐름 제어문 - for 반복문
for (변수선언 및 초기화; 조건; 증감문) 문장;
for (변수선언 및 초기화; 조건; 증감문) {문장1; 문장2; ...}
// 조건문 제거
int i = 1;
for ( ; ; ) {
if (i > 5)
break;
System.out.println(i);
i++;
}
# 흐름 제어문 - for 반복문의 초기화 변수
변수초기화 시키는 문장에 여러 개의 변수를 선언 할 수 있다.
변수 증가문에 여러 개의 문장을 작성할 수 있다.
for (int i = 1, j = 3, k = 5; i <= 10; i++, j--, k += 2)
System.out.printf("(%d,%d,%d) ", i, j, k);
System.out.println();
# 흐름 제어문 - for 중첩과 break
// break 라벨명;
loop1: {
for (int i = 1; i <= 10; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + " ");
if (j == 5)
break loop1; // 라벨로 지정한 문장을 나간다.
}
System.out.println();
}
System.out.println("-------------------------");
}
System.out.println("loop1 밖!");
# 흐름 제어문 - for(:) 와 배열
String[] names = {"홍길동", "임꺽정", "유관순", "윤봉길", "안중근"};
// 배열의 처음부터 끝까지 값을 꺼내는 것이라면
// 다음의 for 문법을 사용하라! 아주 편하다!
// for (배열에서 꺼낸 값을 저장할 변수 선언 : 배열주소) 문장;
for (String name : names)
System.out.println(name);
# for (:)
- 배열 전체를 반복하거나 컬렉션 객체(java.util.Iterable 구현체) 전체를 반복할 때 유용한다.
- 배열의 일부만 반복할 수 없다.
- 배열의 값을 다룰 때 인덱스를 사용할 필요가 없어 편리하다.
문법:
for (변수 선언 : 배열, Iterable 구현체) 문장1;
for (변수 선언 : 배열, Iterable 구현체) { 문장1; 문장2; ...}
- 변수의 타입은 배열이나 Iterable 구현체의 항목 타입과 같아야 한다.
- 반복문을 돌 때 마다 항목을 값을 꺼내 변수에 담는다.
# 흐름 제어문 - for 반복문과 컬렉션
배열은 같은 타입의 값만 보관할 수 있지만
컬렉션은 다른 타입의 값도 보관할 수 있다.
배열은 크기가 고정되지만,
컬렉션은 크기가 가변적이다.
ArrayList list = new ArrayList();
list.add("홍길동");
list.add(3.14f);
list.add(true);
list.add(365);
for (int i = 0; i < list.size(); i++)
System.out.println(list.get(i));
# 흐름 제어문 - for 반복문과 컬렉션
ArrayList list = new ArrayList();
list.add("홍길동");
list.add(3.14f);
list.add(true);
list.add(365);
// for 문에 컬렉션도 적용할 수 있다.
// for (변수 선언 : 컬렉션객체) 문장;
for (Object value : list)
System.out.println(value);
# 흐름 제어문 - for 반복문과 컬렉션
// 제네릭 적용
ArrayList<String> list = new ArrayList<>();
list.add("홍길동");
list.add("임꺽정");
list.add("유관순");
list.add("안중근");
list.add("윤봉길");
list.add("김원봉");
list.add("김구");
// String 이 아닌 값은 넣을 수 없다.
// list.add(3.14f); // 컴파일 오류
// list.add(true); // 컴파일 오류
// list.add(365); // 컴파일 오류
for (int i = 0; i < list.size(); i++)
System.out.println(list.get(i));
# 흐름 제어문 - for 반복문과 컬렉션
// 제네릭 적용
ArrayList<String> list = new ArrayList<>();
list.add("홍길동");
list.add("임꺽정");
list.add("유관순");
list.add("안중근");
list.add("윤봉길");
list.add("김원봉");
list.add("김구");
// 제네릭을 사용하면 for(:) 문장에서
// 항목의 타입을 정확하게 지정하여 값을 받을 수 있다.
for (String name : list) {
System.out.print(name + " ");
}
'네이버클라우드 AIaaS 개발자 양성과정 1기 > Java' 카테고리의 다른 글
[Java] 예제 소스 정리 - 메서드(개념, 가변 파라미터, 배열 파라미터, call by value, call by reference, main(), JVM 아규먼트) (0) | 2022.12.30 |
---|---|
[비트캠프] 40일차(8주차5일) - Java(클래스), myapp-03~06 실습 (0) | 2022.12.30 |
[Java] 예제 소스 정리 - 연산자(산술, 논리, 비트, 조건, 증감, 할당) (0) | 2022.12.29 |
[Java] 예제 소스 정리 - 변수(원시 변수, 레퍼런스 변수, 형변환) (0) | 2022.12.29 |
[비트캠프] 39일차(8주차4일) - Java(변수, 메모리), myapp-01~02 (0) | 2022.12.29 |