5 분 소요

제어문, 배열, 열거 타입


조건문

   조건문은 조건에 따라 다른 실행문을 실행하기 위해 사용한다. 조건문에는 if문과 switch문이 있다.

if

   if문은 조건식이 true이면 해당 블록을 실행하고, false이면 실행하지 않는 제어문이다. if문은 다음과 같이 사용한다.

if ( 조건식 ) { // 실행문이 1개라면 중괄호 생략 가능
    실행문 1;
    실행문 2;
    ...
}

실행문 3;
...

if-else

   만약에 조건식이 false일 경우에 실행하고 싶은 실행문이 있다면 if-else문을 사용하면 된다.

if ( 조건식 ) {
    실행문;
    ...
  
} else {
    실행문;
    ...
}

if-else if-else

   조건이 여러 개일 경우 다중 if문을 사용할 수 있다. 조건식은 위에서부터 순차적으로 확인된다.

if ( 조건식 1 ) {
    실행문;
    ...
  
} else if ( 조건식 2 ) {
    실행문;
    ...
  
} else if ( 조건식 3 ) {
    실행문;
    ...
  
} else {
    실행문;
    ...
}

switch

   조건식이 아니라 값에 따른 제어를 수행하고 싶다면 switch문을 사용할 수 있다.

switch ( 변수 ) {
    case 값1 :
        실행문;
        ...
        break;

    case 값2 :
        실행문;
        ...
        break;

    case 값3 :
        실행문;
        ...
        break;

    ...

    default : // 해당하는 값이 없을 경우 실행(생략 가능)
        실행문;
        ...
        break;
}

주의!
   break;를 사용하지 않으면 해당 케이스의 실행문이 모두 실행되고 switch문이 끝나지 않고 아래에 있는 case문까지 실행이 되어버리기 때문에 꼭 break;로 해당 case문을 종료해주어야 한다.


반복문

   반복문은 동일한 동작을 반복하고 싶을 때 사용한다. 반복문은 크게 for문과 while문이 있다.

for

기본 사용법

for (1. 초기화식; 2. 조건식; 4. 증감식) {
    3. 실행문;
    ...
}
  1. 초기화식 : for문이 실행될 때 가장 처음 실행되는 식이다. 주로 for문에서 사용할 변수를 초기화 할 때 사용한다.
  2. 조건식 : 조건식이 true이면 for문 중괄호 안에 있는 코드를 실행한다. 조건식이 false이면 for문을 종료한다.
  3. 실행문 : 조건식이 true이면 실행되는 코드들의 집합
  4. 증감식 : 실행문이 종료되면 실행된다. 증감식 실행 후 다시 조건식을 판단한다.

향상된 for(for-each)

   자바에서는 배열이나 컬렉션을 좀 더 쉽게 처리하기 위해 향상된 for문을 제공한다. 또한, Iterable 인터페이스를 구현한 클래스에도 사용할 수 있다.

for (2. 타입 변수 : 1. 배열) {
    3. 실행문;
    ...
}
  1. 배열 : 반복 가능한 객체를 적어준다. 즉, 배열 뿐만 아니라 컬렉션이나 Iterable을 구현한 클래스의 객체들이 올 수 있다. 여기에서는 편의상 배열이라고 표현하겠다. 배열에서 더 이상 가져올 값이 없으면 for문이 종료된다.
  2. 타입 변수 : 배열에서 꺼내올 수 있는 객체의 타입과 변수 명을 지정한다. 배열에서 꺼내온 객체가 해당 변수에 담긴다.
  3. 실행문 : 배열에서 꺼내올 수 있는 객체가 있을 경우 실행되는 코드들의 집합

while

기본 사용법

while (1. 조건식) {
    2. 실행문;
    ...
}
  1. 조건식 : 조건식이 true일 경우 while문의 중괄호 내에 있는 코드들을 실행한다. false일 경우 while문이 종료된다.
  2. 실행문 : 조건식이 true일 경우 실행되는 코드들의 집합

do-while

   while문과 동일하지만, 조건식 체크보다 실행문을 먼저 실행하고 싶다면 do-while문을 사용할 수 있다. while문과는 다르게 끝에 세미콜론(;)을 붙여야 한다.

do {
    1. 실행문;
    ...
} while(2. 조건식);
  1. 실행문 : do-while문이 실행될 때 이 실행문이 먼저 실행된다. 이후부터는 조건식이 true일 경우에 실행된다.
  2. 조건식 : 조건식이 true일 경우 실행문을 다시 실행한다. false일 경우 do-while문이 종료된다.

break

   break문은 반복문을 강제로 종료하고 싶을 때 사용한다. switch문에서도 사용 가능하다. 반복문을 반복하다가 break문을 만나면 그 즉시 반복문을 빠져나온다.

   반복문이 중첩되어 있을 경우 이름을 지정해 줄 수 있다.

Name:
for (...) {         // 외부 반복문
    for (...) {     // 내부 반복문
        ...
        break Name; // 외부 반복문 종료
    }
}

continue

   continue문은 반복문에서 사용하는데, continue문을 만나면 그 즉시 for문의 증감식 또는 while, do-while문의 조건식으로 이동한다. break문과 마찬가지로 이름을 지정해 줄 수 있다.


참조 타입

기본 타입과 참조 타입

   자바에서 사용하는 데이터 타입은 크게 기본 타입과 참조 타입으로 분류된다. 기본 타입은 값이 변수 안에 직접 저장되지만 참조 타입은 변수 안에 메모리 번지를 저장한다.

메모리 사용 영역

   JVM은 운영체제에서 할당받은 메모리 영역을 다음과 같이 세부 영역으로 구분해서 사용한다.

  • 메서드 영역
       JVM이 시작할 때 모든 스레드가 공유하는 영역. 메서드 영역에는 코드에서 사용되는 클래스들을 클래스 로더로 읽어 클래스별로 정적 필드와 상수, 메서드, 생성자 등을 저장한다.

  • 힙 영역
       힙 영역은 객체와 배열이 생성되는 영역. 여기에 생성된 객체와 배열은 JVM 스택 영역의 변수나 다른 객체의 필드에서 참조한다. 만일 참조하는 변수나 필드가 없다면 Garbage Collector가 자동으로 제거한다.

  • JVM 스택 영역
       JVM 스택은 메서드를 호출할 때마다 프레임을 추가하고 메서드가 종료되면 해당 프레임을 제거한다.
       프레임 내부에는 로컬 변수 스택이 있는데, 기본 타입 변수와 참조 타입 변수가 추가되거나 제거된다. 스택 영역에 변수가 생성되는 시점은 최초로 변수에 값이 저장될 때이다. 변수는 선언된 블록 안에서만 존재하고 블록을 벗어나면 스택에서 제거된다.

==, != 연산

   참조 변수의 ==, != 연산은 해당 변수의 힙 영역 번지 주소를 비교한다. 즉, 값을 비교하는 것이 아니라 동일한 객체를 참조하고 있는지를 비교하는 것. 따라서, 연산의 결과는 두 변수가 동일한 객체를 참조하고 있다면 true, 그렇지 않다면 false가 된다.

null

   참조 변수는 아무 객체도 참조하고 있지 않는다는 뜻의 null 값을 가질 수 있다. null 값을 가지고 있는지 확인하려면 ==, != 연산을 수행하면 된다.

String str = null;

System.out.println(str == null); // true가 출력된다.
System.out.println(str != null); // false가 출력된다.


배열

   배열이란, 같은 타입의 데이터들을 연속된 공간에 나열하고, 각 데이터에 인덱스를 부여해놓은 자료구조이다. 인덱스는 0부터 시작한다.
   배열에는 같은 타입의 데이터만 저장할 수 있고, 한 번 생성된 배열은 그 길이를 바꿀 수 없다.

배열 선언

   배열 변수를 선언하는 방법은 두 가지가 있다. 타입은 배열에 저장될 데이터들의 타입을 말한다.

  • 타입[] 변수;
  • 타입 변수[];
int[] intArray;
double doubleArray[];

배열 생성

  • 값 목록으로 배열 생성

     int[] intArray = { 1, 3, 5, 7, 9 };
    

       값 목록으로 배열을 생성하는 방법은 배열이 이미 선언된 후에는 사용할 수 없다. 배열 선언 후 나중에 값을 저장하고 싶다면 new 연산자를 이용하면 된다.

     int[] intArray;
     intArray = new int[]{ 1, 3, 5, 7, 9 };
    
  • new 연산자로 배열 생성

   값을 저장하기 전에 미리 배열을 생성하고 싶다면, new 연산자를 이용할 수 있다.

타입[] 변수 = new 타입[길이]; // 길이 : 배열의 총 길이

   new 연산자로 생성된 배열의 데이터들은 자동으로 기본값으로 초기화된다.

타입 초기값
byte, short, int 0
char ‘\u0000’
long 0L
float 0.0F
double 0.0
boolean false
참조 타입 null

배열의 길이

   배열의 길이는 배열에 저장할 수 있는 데이터의 개수를 의미한다. 배열의 길이를 읽기 위해서는 length 필드를 이용하면 된다.

arr.length;

   length 필드는 읽기 전용이기 때문에 값을 저장할 수 없다.

다차원 배열

   배열 안의 데이터가 같은 데이터 타입의 또 다른 배열을 참조한다면 이를 다차원 배열이라고 부른다.

int[][] arr1 = new int[2][3];
int[][][] arr2 = new int[2][3][4];

참조 타입 배열

   기본 타입의 배열은 각 인덱스에 직접 값이 저장되지만, 참조 타입의 배열은 각 인덱스에 객체의 번지가 저장된다.


열거 타입

   열거 타입은 열거 상수의 집합이라고 할 수 있다. 열거 나열된 데이터를 처리할 때 유용하다.

열거 타입 선언

   열거 타입은 class 중 하나로써 class 대신에 enum을 적어주면 된다.

public enum Week {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}

   열거 타입의 변수들은 기본적으로 상수로 취급하므로, 자바 상수와 같이 변수명을 대문자로 작성하는 것이 관례이다. 또한, 단어와 단어 사이는 밑줄(_)로 이어준다.

열거 타입 변수

   열거 타입도 참조 타입에 포함되며, 각 변수는 힙 영역에 객체로 저장된다. 열거 타입의 변수는 다음과 같이 사용한다.

Week today = Week.SUNDAY;

변수에 값 지정하기

   열거 상수 각각에 값을 지정할 수 있다.

public enum Direction {
    EAST(1), SOUTH(5), WEST(-1), NORTH(10); // 끝에 세미콜론(;)을 붙여줘야 한다.
    
    private final int value; // 값을 저장할 변수를 추가
    
    Direction(int value) { // 생성자 추가, 묵시적으로 private이다.
        this.value = value;
    }
    
    public int getValue() { // 메서드도 추가 가능
        return value;
    }
}

<== 부트캠프 1일차          부트캠프 9일차 ==>