Posts 학원 #14일차: 제어문과 컬렉션
Post
Cancel

학원 #14일차: 제어문과 컬렉션

흐름제어문 if

  • 블록으로 묶지 않으면 첫번째 문장만 if에 종속된다.
  • if 문의 조건은 반드시 boolean 데이터여야 한다.

흐름제어문 if ~ else

1
2
3
4
5
6
7
8
9
10
// if ~ else ~ 문법이 없다면?
if (gender == 1) {  
  System.out.println("여성"); 
} 

if (gender == 2) {
  System.out.println("남성");
}
// 비효율적인 코드
// => 배타적인 조건일 경우 실행하지 않기 위해서 else 라는 문법 탄생
  • else는 항상 if문과 짝을 이뤄 사용한다. else문만 단독으로 사용할 수 없다.

  • if문과 else 문 사이에 다른 문장이 올 수 없다.

  • else는 가장 가까운 if에 소속된다. (들여쓰기 주의)

  • if ~ else ~는 한 문장으로 취급한다.

    1
    2
    3
    4
    5
    6
    
    if (age >= 19)
        if (age >= 70)
            System.out.println("지하철 무임승차 가능합니다.");
    else
        System.out.println("미성년입니다.") // 두번째 if에 종속
    // if ~ else는 한 문장으로 취급되기 때문에 중괄호 사용할 필요 없음
    
  • else if 라는 문법은 따로 없다. if와 else만이 있을 뿐이다.

흐름제어문 switch

  • 복잡한 조건으로 프로그램 흐름을 제어하는 상황이라면 if문을 사용한다.
  • int나 문자열처럼 단순한 값으로 프로그램을 제어할 수 있다면 switch문을 사용한다.
  • break문을 쓰지 않으면 계속 이어서 실행된다.
    • 값이 case에 해당되는 경우 break 명령을 만날 때까지 아래로 계속 실행한다.
    • => 의도적으로 break를 사용하지 않을 수 있다.
  • switch문은swtich (값) {} 형태로 사용한다. 값으로는 int 정수(byte, short, int, char), 문자열, 특별한 상수 Enum 타입이 올 수 있다. 4바이트를 넘어가는 정수, 부동소수점, boolean 타입을 사용하면 컴파일 오류를 뱉는다.
  • case 값으로는 리터럴만 가능한다. 값이 변경되지 않는 final 변수(즉 상수)라면 사용할 수 있다.
1
2
3
4
5
6
7
8
9
10
final int GUEST = 0;  MEMBER = 1, ADMIN = 2;
switch (level) {
    case GUEST:
        System.out.println("글 조회를 할 수 있다.");
    case MEMBER:
        System.out.println("글을 작성할 수 있다.");
    case ADMIN:
        System.out.println("다른 회원의 글을 변경, 삭제할 수 있다.");
        break;
}

enum 타입

enum 타입은 일종의 사용자가 정의한 데이터 타입이라고 할 수 있다. 변수 대신 상수를 사용하면 주석 없이 바로 이해할 수 있고, enum 타입을 사용하면 이 상수를 좀 더 조직적으로 관리할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
enum Level {
    GUEST, MEMBER, ADMIN
}

public static void main(String[] args){
    Level level = Level.MEMBER;
    
    switch(level){
        case GUEST:
            System.out.println("글 조회를 할 수 있다.");
        case MEMBER:
            System.out.println("글을 작성할 수 있다.");
        case ADMIN:
            System.out.println("다른 회원의 글을 변경, 삭제할 수 있다.");
            break;
    	}
    }
}

nested enum은 기본이 static이므로 static을 생략해도 된다. enum으로 정의된 상수를 사용하기 위해서는 enum 타입의 변수를 선언해야 한다. 이때 final int 처럼 직접 값을 지정하지 않아도 되고, 값을 직접 지정할 수도 있다. enum을 사용하면 100, 200, “admin”과 같이 값을 직접 지정할 필요가 없고, enum 변수에는 그 타입에 정의된 값만 저장할 수 있다는 장점이 있다.

반복문

continue

1
2
3
4
5
6
7
8
9
// 1부터 100까지의 짝수의 합
count = 0;
sum = 0;
while (count < 100) {
    count++;
    if (count % 2 == 1)
        continue;
    sum += count;
}

countinue;가 나오면 다음 문장이 실행되지 않고 즉시 조건 검사로 이동한다.

break

1
2
3
4
5
6
7
8
9
/// 1부터 100까지 카운트하는데 합은 50까지만 계산한다.
count = 0;
sum = 0;
while (count < 100) {
    count++;
    if (count > 50)
        break;
    sum += count;
}

중첩된 반복문 탈출

1
2
3
4
5
6
7
8
// 구구단 5x5까지만 출력하고 탈출하기
loop:
  while (x <= 9) {
    System.out.printf("%d * %d = %d\n", x, y, x * y);
    if (x == 5 && y ==5)
      break loop;
    y++;
  }

nested loop의 inner loop에서 그냥 break; 명령어를 주면 inner loop만 탈출한다. outer loop까지 탈출하기 위해 바깥쪽 중첩문에 라벨을 붙이고 break 라벨명;문장으로 중첩 반복문을 탈출할 수 있다.

do ~ while

do ~ while문은 조건에 맞지 않으면 한 번도 실행되지 않을 수 있는 while문과 달리, 최소 한 번은 반복한다.

1
2
3
4
// 1부터 10까지 출력
do
    System.out.println(++i);
while (i < 10);

for 반복문

for loop

for 문 안에서 선언한 변수는 그 for문 안에서만 사용할 수 있다. 반복문을 종료한 뒤에도 변수의 값을 사용하고 싶다면, 반복문 밖에 변수를 선언해야 한다. 변수 선언 및 초기화 문장, 조건문, 증감문은 제거할 수 있다. 또한 변수 초기화 문장과 증가문에 여러 개의 문장을 작성할 수도 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 증감문 제거
for (int i = 1; i <= 5;) {
    System.out.println(i);
    i++;
}

// 변수 선언 및 초기화 문장 제거
int i = 1;
for (; i<= 5;){
    System.out.println(i);
    i++;
}

// 조건문 제거
int i = 1;
for (;;) {
    if (i > 5)
      break;
    System.out.println(i);
    i++;
}

// 여러 개의 문장
for (int i = 1, j = 3, k = 5; i <= 10; i++, j--, k += 2)
  System.out.printf("(%d,%d,%d) ", i, j, k);

break를 통해 소속된 반복문을 빠져나올 수 있고,continue 를 통해 다음줄을 실행하지 않고 증가문으로 이동할 수 있다. 이때, 라벨을 붙임으로서 중첩된 전체 반복문을 빠져나올 수 있다.

향상된 for문

배열 전체를 반복하거나 컬렉션 객체 전체를 반복할 때 for(:)문법을 활용하면 간단하다.

  • for (변수 선언 : 배열, iterable 구현체의 주소) 문장
  • 변수의 타입은 배열이나 Iterable 구현체의 항목 타입과 같아야 한다.
  • 반복문을 돌 때마다 항목의 값을 꺼내 변수에 담는다.
  • 변수 선언을 바깥에 둘 수 없다.
  • 배열의 일부만 반복할 수 없다.
1
2
3
4
5
String[] names = {"seoul", "tokyo", "asuncion", "vilnius", "oslo"};

String name;
for (name : names) // 컴파일 오류!
  System.out.println(name);

컬렉션

  • 배열은 같은 타입의 값만 보관할 수 있지만, 컬렉션은 다른 타입의 값도 보관할 수 있다.
  • 배열은 크기가 고정적이지만, 컬렉션은 크기가 가변적이다.
1
2
3
4
5
6
7
8
9
10
ArrayList list = new ArrayList(); // 컬렉션타입 변수 선언
list.add("monica");	//컬렉션에 값 보관
list.add(3.14f);
list.add(true);

for(int i = 0; i < list.size(); i++) //컬렉션의 크기
    System.out.println(list.get(i)); //컬렉션 항목 읽기

for(Object value : list)
    System.out.println(value);
This post is licensed under CC BY 4.0 by the author.

🍵 후위증감연산자와 컴파일 최적화

학원 #15일차: 배열과 흐름제어문, 클래스

Loading comments from Disqus ...