본문 바로가기
dev/기본쌓기

[JAVA] 빠르게 정리하는 자바 문법 (3)

by dev-everyday 2024. 12. 30.
반응형
더보기

해당 글은 아래 링크를 참고하여 작성되었습니다.

https://www.tcpschool.com/java/intro

4. 제어문

자바 프로그램이 원하는 결과를 얻기 위해서는 프로그램의 순차적인 흐름을 제어해야하는 경우가 생긴다.

이 때 사용하는 명령문을 제어문이라 하며 제어문에는 조건문 반복문 등이 있다.

 

1. 조건문

조건문은 주어진 조건식의 결과에 따라 별도의 명령을 수행하도록 제어하는 명령문이다.

 

1) if문

2) if/else문

3) if/else if/else 문

4) switch문

switch (조건 값) {
    case 값1:
        조건 값이 값1일 때 실행하고자 하는 명령문;
        break;
    case 값2:
        조건 값이 값2일 때 실행하고자 하는 명령문;
        break;
    ...
    default:
        조건 값이 어떠한 case 절에도 해당하지 않을 때 실행하고자 하는 명령문;
        break;
}

 

2. 반복문

반복문이란 프로그램 내에서 똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어하는 명령문이다.

프로그램이 처리하는 대부분의 코드는 반복적인 형태가 많으므로 가장 많이 사용되는 제어문 중 하나이다.

 

1) while문

2) do/while문

3) for문

4) Enhanced for문

int[] arr = new int[]{1, 2, 3, 4, 5};

for (int e : arr) {
    System.out.print(e + " ");
}

 

3. 기타 제어문

1) continue문

continue 문은 루프 내에서 사용하여 해당 루프의 나머지 부분을 건너뛰고, 바로 다음 조건식의 판단으로 넘어가게 해준다.

보통 반복문 내에서 특정 조건에 대한 예외 처리를 하고자 할 때 자주 사용된다.

2) break문

break 문은 루프 내에서 사용하여 해당 반복문을 완전히 종료시킨 뒤 반복문 바로 다음에 위치한 명령문을 실행한다.

즉 루프 내에서 조건식의 판단 결과와 상관없이 반복문을 완전히 빠져나가고 싶을 때 사용한다.

3) 이름을 가지는 반복문

일반적인 break 문은 단 하나의 반복문만을 빠져나가게 해준다.

따라서 여러 반복문이 중첩된 상황에서 한 번에 모든 반복문을 빠져나가거나, 특정 반복문까지만 빠져나가고 싶을 때 사용하는 방법이다.

allLoop :
for (int i = 2; i < 10; i++) {
    for (int j = 2; j < 10; j++) {
        if (i == 5) {
            break allLoop;
        }
        System.out.println(i + " * " + j + " = " + (i * j));
    }
}

5. 배열

1. 메모리 구조

모든 자바 프로그램은 JVM을 통해서 실행된다.

자바 프로그램이 실행되면 JVM은 OS로부터 해당 프로그램을 수행할 수 있도록 필요한 메모리를 할당받는다.

이렇게 할당받은 메모리를 JVM은 용도에 따라 구분하여 관리한다.

1) 메소드 영역

메소드 영역은 자바 프로그램에 사용되는 클래스에 대한 정보와 함께 클래스 변수(static variable)가 저장되는 영역이다.

JVM은 자바 프로그램에서 특정 클래스가 사용되면 해당 클래스의 클래스 파일(*.class)를 읽어들여 해당 클래스에 대한 정보를 메소드 영역에 저장한다.

 

2) 힙 영역

힙 영역은 자바 프로그램에서 사용되는 모든 인스턴스 변수가 저장되는 영역이다.

new 키워드를 사용해 인스턴스가 생성되면 해당 인스턴스의 정보를 힙 영역에 저장하는데 힙 영역은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.

 

3) 스택 영역

스택 영역은 자바 프로그램에서 메소드가 호출될 때 메소드의 스택 프레임이 저장되는 영역이다.

지역 변수와 매개 변수를 스택 영역에 저장하는데 메소드의 호출과 함께 할당되고 호출이 완료되면 소멸한다.

스택 영역에 저장되는 메소드의 호출 정보를 스택 프레임이라고 한다.

스택 영역은 push 동작으로 데이터를 저장하고 pop으로 데이터를 인출하고 LIFO로 동작한다.

높은 주소에서 낮은 주소의 방향으로 할당된다.

 

2. 1차원 배열

배열은 같은 타입의 변수들로 이루어진 유한 집합이다.

자바에서 인덱스는 언제나 0부터 시작하며 0을 포함한 양의 정수만을 가질 수 있다.

아래와 같이 배열을 선언한다.

1. 타입[] 배열이름;
2. 타입 배열이름[];

위와 같이 선언된 배열은 new 키워드를 사용해서 실제 배열로 생성할 수 있다.

배열이름 = new 타입[배열길이];

배열을 선언과 동시에 초기화하는 방식은 아래와 같다.

1. 타입[] 배열이름 = {배열요소1, 배열요소2, ...};
2. 타입[] 배열이름 = new 타입[]{배열요소1, 배열요소2, ...};

하지만 배열의 선언과 초기화를 따로 진행하거나 메소드의 인수로 배열을 전달하면서 초기화할 경우에는 두 번째 방식으로 초기화해야 한다.

 

3. 다차원 배열

다차원 배열은 2차원 이상의 배열로 배열 요소로 또 다른 배열을 가지는 배열을 의미한다.

아래와 같은 선언할 수 있다.

1. 타입[][] 배열이름;
2. 타입 배열이름[][];
3. 타입[] 배열이름[];

// int[][] arr = new int[2][3];

배열의 선언과 동시에 초기화하는 방법은 아래와 같다.

int[][] arr = {
    {10, 20, 30},
    {40, 50, 60}
};

자바에서는 2차원 배열을 생성할 때 열의 길이를 명시하지 않고 행마다 다른 길이의 배열을 요소로 저장할 수 있다.

이를 가변 배열이라고 하는데 아래와 같이 행마다 다른 길이의 배열을 저장할 수 있다.

int[][] arr = new int[3][];

arr[0] = new int[2];
arr[1] = new int[4];
arr[2] = new int[1];

 

4. 배열의 활용

1. 배열의 복사

자바에서 배열은 한 번 생성하면 그 길이를 변경할 수 없다.

따라서 더 많은 데이터를 저장하려면 더 큰 배열을 만들고 이전 배열의 데이터를 복사해야하는데 배열의 복사를 위해 여러 방법이 존재한다.

 

1) System 클래스의 arraycopy() 메소드

2) Arrays 클래스의 copyOf() 메소드

3) Object 클래스의 clone() 메소드

4) for문과 인덱스를 이용한 복사

가장 성능이 좋은 것은 배열의 복사만을 위한 arraycopy()이나 많이 사용되는 메소드는 copyOf() 메소드다.

int[] arr1 = new int[]{1, 2, 3, 4, 5};
int newLen = 10;

// 1. System 클래스의 arraycopy() 메소드
int[] arr2 = new int[newLen];
System.arraycopy(arr1, 0, arr2, 0, arr1.length);

// 2. Arrays 클래스의 copyOf() 메소드
int[] arr3 = Arrays.copyOf(arr1, 10);

// 3. Object 클래스의 clone() 메소드
int[] arr4 = (int[])arr1.clone();

// 4. for 문과 인덱스를 이용한 복사
int[] arr5 = new int[newLen];

 

2. Enhanced for문

JDK 1.5부터 배열과 컬렉션의 모든 요소를 참조하기 위한 Enhanced for문이라는 반복문이 추가되었다.

아래와 같은 문법으로 사용된다.

 for (타입 변수이름 : 배열이나컬렉션이름) {
    배열의 길이만큼 반복적으로 실행하고자 하는 명령문;
}

 

반응형