공부해보잠
배열과 문자열 본문
배열의 개요
동일한 데이터 유형을 여러 개 사용할 때, 여러 개의 변수를 하나의 이름으로 묶어 사용하는 방식이다.
배열의 특징
- 배열은 하나의 이름으로 여러 개의 기억장소를 관리할 수 있다.
- 개별적인 요소들의 위치는 **첨자(Index)**를 이용하여 접근한다.
- 변수명 뒤에 대괄호 []를 붙이고 개수를 지정하여 선언한다.
- 배열의 인덱스는 0부터 시작한다.
- 배열의 데이터는 행 우선으로 저장된다.
- 배열 이름을 단독으로 사용하면 배열의 첫 번째 요소의 주소를 의미한다.
배열의 종류
배열의 종류 | 선언 방식 | 사용 방식 | 주요 특징 |
1차원 배열 | int arr[5]; | arr[i] | 일렬로 데이터를 저장 |
2차원 배열 | int arr[3][4]; | arr[i][j] | 행과 열로 데이터를 저장 |
3차원 배열 | int arr[2][3][4]; | arr[i][j][k] | 면, 행, 열로 데이터를 저장 |
다차원 배열 | int arr[2][2][2][2]; | arr[i][j][k][l] | 3차원 이상의 다차원 공간 저장 |
- 1차원 배열 → 데이터를 한 줄로 저장하는 배열
- 2차원 배열 → 데이터를 행과 열의 표 형태로 저장하는 배열
- 3차원 배열 → 데이터를 면, 행, 열의 입체 구조로 저장하는 배열
- 다차원 배열 → 3차원 이상의 데이터 저장 (거의 사용되지 않음)
배열의 차원이 높아질수록 복잡해지고, 메모리 사용량도 많아지므로 일반적으로 2차원 배열까지가 가장 많이 사용된다.
1차원 배열 (1D Array)
- 배열 요소를 하나의 행으로 나열하는 배열
- 데이터를 일렬로 저장하며, 각 요소에 인덱스를 사용해 접근
- 연속된 메모리 공간에 저장됨
- 한 줄로 데이터를 저장하는 방식이므로 가장 기본적인 배열 구조
기본 구조
int arr[5]; // 크기가 5인 1차원 배열
예제
int arr[5] = {10, 20, 30, 40, 50}; // 5개의 정수 저장
printf("%d", arr[2]); // 30 출력 (3번째 요소, 인덱스 2)
메모리 구조
arr[0] arr[1] arr[2] arr[3] arr[4]
10 20 30 40 50
인덱스 | 값 |
arr[0] | 10 |
arr[1] | 20 |
arr[2] | 30 |
arr[3] | 40 |
arr[4] | 50 |
배열의 크기는 5이지만, 인덱스는 0부터 4까지 사용된다.
배열을 선언할 때 arr[5]라고 하면, arr[0]부터 arr[4]까지 5개의 공간이 할당된다.
만약 arr[5]를 선언하고 arr[5]에 접근하면 오류 발생 (배열의 범위를 초과하기 때문)
2차원 배열 (2D Array)
- 행(row)과 열(column)로 이루어진 배열
- 배열 요소를 테이블(표) 형태로 저장하며, 인덱스 두 개를 사용해 접근
- 배열 선언 시 [행][열] 형식으로 정의
- 메모리 내부에서는 1차원 배열처럼 연속된 공간에 저장되지만, 논리적으로는 행과 열로 구분됨
기본 구조
int arr[3][4]; // 3행 4열의 2차원 배열 선언
예제
int arr[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
printf("%d", arr[1][2]); // 6 출력 (1번째 행, 2번째 열)
메모리 구조
arr[0][0] arr[0][1] arr[0][2]
arr[1][0] arr[1][1] arr[1][2]
열의 크기: 2행(row) x 3열(column) → 총 6개의 요소를 저장할 수 있음
인덱스의 범위:
- 행의 인덱스: 0 ~ 1 (총 2개)
- 열의 인덱스: 0 ~ 2 (총 3개)
열 0 (arr[x][0] | 열 1 (arr[x][1]) | 열 2 (arr[x][2]) | |
행 0 (arr[0][x]) | arr[0][0] | arr[0][1] | arr[0][2] |
행 1 (arr[1][x]) | arr[1][0] | arr[1][1] | arr[1][2] |
배열 요소의 개수: 행 개수 × 열 개수 → 2 × 3 = 6개의 요소를 저장할 수 있음
배열의 인덱스는 0부터 시작 → arr[0][0]부터 arr[1][2]까지 존재
3차원 배열 (3D Array)
- 면(layer), 행(row), 열(column)으로 이루어진 배열
- 배열 요소를 3차원 공간에 저장하며, 인덱스 세 개를 사용해 접근
- 배열 선언 시 [면][행][열] 형식으로 정의
- 메모리 내부에서는 1차원 배열처럼 연속된 공간에 저장됨
기본 구조
int arr[2][3][4]; // 2면, 3행, 4열의 3차원 배열 선언
예제
int arr[2][2][2] = {
{{1, 2}, {3, 4}},
{{5, 6}, {7, 8}}
};
printf("%d", arr[1][0][1]); // 6 출력 (1번째 면, 0번째 행, 1번째 열)
메모리 구조
면 0:
arr[0][0][0] arr[0][0][1]
arr[0][1][0] arr[0][1][1]
면 1:
arr[1][0][0] arr[1][0][1]
arr[1][1][0] arr[1][1][1]
배열의 크기: 2면(layer) × 2행(row) × 2열(column) → 총 8개의 요소 저장 가능
✔ 인덱스의 범위:
- 면의 인덱스: 0 ~ 1 (총 2개)
- 행의 인덱스: 0 ~ 1 (총 2개)
- 열의 인덱스: 0 ~ 1 (총 2개)
면 0 | 열 0 (arr[0][x][0] | 열 1 (arr[0][x][1]) |
행 0 (arr[0][0][x]) | arr[0][0][0] = 1 | arr[0][0][1] = 2 |
행 1 (arr[0][1][x]) | arr[0][1][0] = 3 | arr[0][1][1] = 4 |
면 1열 | 열 0 (arr[1][x][0]) | 열 1 (arr[1][x][1]) |
행 0 (arr[1][0][x]) | arr[1][0][0] = 5 | arr[1][0][1] = 6 |
행 1 (arr[1][1][x]) | arr[1][1][0] = 7 | arr[1][1][1] = 8 |
배열의 인덱스는 0부터 시작 → arr[0][0][0]부터 arr[1][1][1]까지 존재
다차원 배열 (N차원 배열)
설명:
- 3차원 이상의 배열을 의미
- 보통 4차원 배열 이상은 실무에서 거의 사용되지 않음
- 4차원 배열은 면(layer) - 행(row) - 열(column) - 깊이(depth) 로 이루어진 배열이다.
- 3차원 배열이 2차원 배열을 여러 개 포함하는 것처럼, 4차원 배열은 3차원 배열을 여러 개 포함하는 구조다.
- 필요한 경우 다차원 배열 대신 구조체(struct)나 동적 메모리 할당을 활용하는 것이 일반적
- 게임 프로그래밍, 그래픽 처리, 데이터 분석 등 특수한 경우에서 사용됨
기본 구조
int arr[2][2][2][2]; // 4차원 배열 선언
예제
int arr[2][2][2][2]; // 4차원 배열 선언
메모리 구조
int arr[2][2][2][2] = {
{
{{1, 2}, {3, 4}},
{{5, 6}, {7, 8}}
},
{
{{9, 10}, {11, 12}},
{{13, 14}, {15, 16}}
}
};
배열 크기: 2 × 2 × 2 × 2 = 16개의 요소를 저장할 수 있음
배열의 인덱스 범위
- 면 (1번째 차원): 0~1 (총 2개)
- 행 (2번째 차원): 0~1 (총 2개)
- 열 (3번째 차원): 0~1 (총 2개)
- 깊이 (4번째 차원): 0~1 (총 2개)
배열의 초기화
배열 선언 시 초기값을 지정할 수 있다.
배열을 만들면서 동시에 값을 넣을 수 있다.
int arr[5] = {10, 20, 30, 40, 50}; // 5개의 값을 가진 배열
- 배열의 크기를 [5]로 설정하고 {} 안에 초기값을 넣으면 해당 값들이 배열에 저장된다.
- arr[0] = 10, arr[1] = 20, arr[2] = 30, arr[3] = 40, arr[4] = 50으로 자동 저장된다.
배열의 크기를 생략하면 반드시 초기값을 지정해야 한다.
배열 크기를 따로 설정하지 않으면 초기값 개수만큼 배열이 자동으로 생성된다.
int arr[] = {1, 2, 3}; // 크기 생략, 자동으로 3개 크기로 설정됨
- arr[0] = 1, arr[1] = 2, arr[2] = 3으로 저장됨.
- 배열 크기를 지정하지 않았기 때문에 반드시 초기값을 넣어야 한다.
잘못된 예제 (배열 크기를 생략했지만 초기값이 없음)
int arr[]; // 오류 발생 (초기값 없이 크기를 생략할 수 없음)
배열의 크기보다 적은 값만 초기화하면 나머지는 자동으로 0이 입력된다.
int arr[5] = {5, 10}; // 2개의 값만 초기화
- arr[0] = 5, arr[1] = 10으로 저장됨.
- 나머지 arr[2], arr[3], arr[4]는 자동으로 0이 저장됨.
배열의 상태
arr[0] = 5
arr[1] = 10
arr[2] = 0
arr[3] = 0
arr[4] = 0
배열 초기화 예제
#include <stdio.h>
int main() {
int arr1[5] = {10, 20, 30, 40, 50}; // 크기와 초기값 지정
int arr2[] = {1, 2, 3}; // 크기 생략 (자동으로 3개 크기 설정)
int arr3[5] = {5, 10}; // 일부만 초기화 (나머지는 0)
printf("arr1: ");
for (int i = 0; i < 5; i++) {
printf("%d ", arr1[i]);
}
printf("\n");
printf("arr2: ");
for (int i = 0; i < 3; i++) {
printf("%d ", arr2[i]);
}
printf("\n");
printf("arr3: ");
for (int i = 0; i < 5; i++) {
printf("%d ", arr3[i]);
}
printf("\n");
return 0;
}
배열을 선언하면서 값을 넣을 수 있다.
int arr[5] = {10, 20, 30, 40, 50};
배열 크기를 생략하면 반드시 초기값을 지정해야 하며, 초기값 개수만큼 배열 크기가 설정된다.
int arr[] = {1, 2, 3}; // 크기 3으로 자동 설정
배열의 크기보다 적은 값만 초기화하면 나머지 요소는 자동으로 0이 입력된다.
int arr[5] = {5, 10}; // 나머지는 0으로 설정됨
배열 형태의 문자열 변수
C 언어에서는 문자열을 저장할 전용 자료형이 없기 때문에 char 배열 또는 포인터를 이용해 문자열을 다룬다.
문자열 저장 방법
문자 배열을 이용한 저장
char str[6] = "HELLO";
- 문자열은 큰따옴표(" ") 로 감싸서 선언
- 마지막에 자동으로 널 문자(\0) 가 추가됨
- 배열 크기는 문자 개수 + 1 (HELLO → 5글자 + \0)
포인터를 이용한 문자열 저장
char *str = "HELLO";
- 문자열 리터럴이 메모리에 저장되고, str이 그 위치를 가리킴
- 수정 불가능한 문자열 (읽기 전용)
문자열 저장 방식 비교
선언 방식 | 사용 예시 | 특징 |
문자 배열 | char str[6] = "HELLO"; | 개별 문자 수정 가능 |
포인터 | char *str = "HELLO"; | 문자열 수정 불가능 (읽기 전용) |
문자열 출력 예제
#include <stdio.h>
int main() {
char a = 'A'; // 문자 하나 저장
char b[] = "SINAGONG"; // 문자 배열
char *c = "SINAGONG"; // 포인터 문자열
printf("%c\n", a); // 문자 출력: A
printf("%s\n", b); // 문자 배열 출력: SINAGONG
printf("%s\n", c); // 포인터 문자열 출력: SINAGONG
return 0;
}
- printf("%s", 변수명); → 문자열 출력
- printf("%c", 변수명); → 단일 문자 출력
문자열 끝을 나타내는 \0 (널 문자)
- C에서는 문자열의 끝을 \0 (NULL 문자) 로 자동 추가
- 배열 크기를 지정할 때 널 문자까지 포함해야 함
- char str[6] = "HELLO"; → 내부적으로 { 'H', 'E', 'L', 'L', 'O', '\0' } 로 저장됨
요약
- C에서는 문자열 자료형이 따로 없음
- 문자 배열과 포인터를 사용하여 문자열 저장
- 문자열은 \0 (널 문자)로 끝이 자동 추가됨
- 포인터 문자열은 수정 불가능, 문자 배열은 수정 가능
Java에서의 배열 처리
- Java에서 배열은 동일한 데이터 타입을 여러 개 저장할 수 있는 자료구조이며, 객체로 취급된다.
- C 언어와 달리 Java의 배열은 크기가 고정된 객체이며, 배열의 크기를 동적으로 할당할 수 있다.
배열 선언과 초기화
데이터타입[] 배열이름;
또는
데이터타입 배열이름[];
배열 생성 (new 키워드 사용)
배열이름 = new 데이터타입[크기];
선언과 동시에 배열 생성
int[] arr = new int[5]; // 크기가 5인 정수형 배열 선언
Java에서는 배열을 생성하면 기본값으로 초기화됨
- 정수형(int) → 0
- 실수형(double) → 0.0
- 논리형(boolean) → false
- 참조형(String) → null
배열 초기화
int[] arr1 = {10, 20, 30, 40, 50}; // 직접 초기화
int[] arr2 = new int[]{1, 2, 3, 4, 5}; // new 키워드 사용
int[] arr3 = new int[5]; // 크기만 설정 (모든 값은 0으로 초기화)
배열 요소 접근
int[] arr = {10, 20, 30, 40, 50};
// 개별 요소 접근
System.out.println(arr[0]); // 10 출력
// 배열 요소 변경
arr[1] = 100; // arr[1]의 값을 100으로 변경
배열 요소 출력(반복문 사용)
int[] arr = {10, 20, 30, 40, 50};
for (int i = 0; i < arr.length; i++) {
System.out.println("arr[" + i + "] = " + arr[i]);
}
arr.length → 배열의 크기를 나타내는 속성 (C 언어의 sizeof()와 유사)
향상된 for문을 사용한 배열 출력
int[] arr = {10, 20, 30, 40, 50};
for (int num : arr) {
System.out.println(num); // 배열 요소를 하나씩 출력
}
향상된 for 문을 사용하면 인덱스를 사용하지 않고 배열 요소를 직접 순회할 수 있다.
2차원 배열
int[][] arr = new int[2][3]; // 2행 3열의 2차원 배열 선언
2차원 배열 초기화
int[][] arr = {
{1, 2, 3},
{4, 5, 6}
};
2차원 배열 요소 접근
System.out.println(arr[1][2]); // 6 출력
2차원 배열 반복문 출력
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
배열의 특징
배열의 크기는 한 번 설정하면 변경할 수 없다.
- int[] arr = new int[5];
- 배열의 크기를 변경하려면 새로운 배열을 생성해야 함
배열은 객체이므로 null을 가질 수 있다.
- int[] arr = null;
length 속성을 사용하여 배열 크기를 알 수 있다.
- arr.length
배열과 ArrayList 차이점
비교 항목배열 (Array)ArrayList
비교 | 항목 | 배열 (Array)ArrayList |
크기 변경 | 불가능 (고정) | 가능 (동적) |
선언 방식 | int[] arr = new int[5]; | ArrayList<Integer> list = new ArrayList<>(); |
데이터 추가 | arr[i] = 값; | list.add(값); |
데이터 삭제 | 불가능 (직접 처리) | list.remove(index); |
길이 확인 | arr.length | list.size() |
배열의 한계와 해결 방법
- 배열의 크기가 고정되어 있어, 크기 변경이 불가능하다.
→ ArrayList 또는 LinkedList를 사용하여 해결 - 배열 요소를 추가/삭제하는 것이 어렵다.
→ ArrayList 또는 Set을 사용하여 해결 - 다차원 배열이 복잡해질수록 가독성이 떨어진다.
→ List<List<Integer>>와 같은 컬렉션을 활용
요약
- Java에서 배열은 객체이며, 크기가 고정됨.
- 배열의 길이는 length 속성을 사용하여 확인.
- 다차원 배열도 사용 가능하지만, ArrayList 등의 컬렉션을 사용하는 것이 더 유연함.
- 크기를 변경할 수 있는 동적 배열이 필요하면 ArrayList 사용을 고려.
Java 문자열
Java에서는 C 언어와 다르게 문자열을 다룰 전용 자료형이 존재한다.
문자열을 저장하고 조작하는 String 클래스를 사용한다.
Java에서 문자열 선언 및 저장 방법
문자(char) 하나 저장 (C와 동일)
char ch = 'A'; // 문자 하나 저장
- 작은따옴표(' ')로 감싸야 한다.
- 한 글자만 저장 가능 ('AB'는 오류 발생)
문자열(String) 저장
String str = "HELLO";
- 큰따옴표(" ") 를 사용하여 문자열 저장
- String은 클래스형 자료형 (객체)
문자열 저장 방식 비교
선언 방식 | 사용 예시 | 특징 |
문자 변수 (char) | char ch = 'A'; | 한 글자만 저장 가능 |
문자열 (String) | String str = "HELLO"; | 문자열 저장 가능, 다양한 메서드 사용 가능 |
Java 문자열 출력 예제
public class Main {
public static void main(String[] args) {
char a = 'A'; // 문자 하나 저장
String b = "SINAGONG"; // 문자열 저장
String c = new String("SINAGONG"); // 객체로 문자열 생성
System.out.println(a); // 문자 출력: A
System.out.println(b); // 문자열 출력: SINAGONG
System.out.println(c); // 문자열 출력: SINAGONG
}
}
- System.out.println(변수명); → 콘솔에 출력
- String c = new String("SINAGONG"); → 객체 방식으로 문자열 생성 (비추천)
- String b = "SINAGONG"; → 가장 많이 사용됨
Java에서 String과 char[]의 차이
- Java에서도 문자 배열 (char[]) 을 사용 가능하지만, 보통 String을 사용한다.
char[] charArray = { 'H', 'E', 'L', 'L', 'O' }; String str = "HELLO";
데이터 타입 | 특징 |
char[] (문자 배열) | C 스타일, 수동으로 관리해야 함 |
String | 문자열 전용 클래스, 다양한 기능 제공 |
Java의 문자열은 불변(Immutable)
String str = "HELLO"; str = str + " WORLD"; System.out.println(str);
- String은 수정 불가능(Immutable) → 새로운 문자열이 생성됨
- 문자열을 자주 변경해야 하면 StringBuilder 또는 StringBuffer 사용
StringBuilder sb = new StringBuilder("HELLO"); sb.append(" WORLD"); System.out.println(sb);
요약
- Java에서는 String 자료형을 사용하여 문자열 저장
- C처럼 char[] 사용 가능하지만, String이 더 일반적
- 문자열은 불변(Immutable) → 변경 시 새로운 객체 생성
- StringBuilder 사용 시 더 효율적으로 문자열 수정 가능
출처 및 참조
정보처리 산업기사 기본서(시나공)