Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
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 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

개발자입니다

[Java] 예제 소스 정리 - 제어문(if, for, while, ArrayList) 본문

네이버클라우드 AIaaS 개발자 양성과정 1기/Java

[Java] 예제 소스 정리 - 제어문(if, for, while, ArrayList)

끈기JK 2022. 12. 30. 10:28

com.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 + " ");
}