Notice
Recent Posts
Recent Comments
Link
250x250
«   2025/03   »
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 29
30 31
Archives
Today
Total
관리 메뉴

공부해보잠

배열과 문자열 본문

자격증/정보처리

배열과 문자열

heejk 2025. 2. 13. 23:21
배열의 개요

 

동일한 데이터 유형을 여러 개 사용할 때, 여러 개의 변수를 하나의 이름으로 묶어 사용하는 방식이다.

 

배열의 특징

  • 배열은 하나의 이름으로 여러 개의 기억장소를 관리할 수 있다.
  • 개별적인 요소들의 위치는 **첨자(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
배열 요소의 개수: 면 개수 × 행 개수 × 열 개수  2 × 2 × 2 = 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 사용 시 더 효율적으로 문자열 수정 가능

 

출처 및 참조

정보처리 산업기사 기본서(시나공)

728x90

'자격증 > 정보처리' 카테고리의 다른 글

사용자 정의 함수  (0) 2025.02.16
포인터  (0) 2025.02.16
반복문  (0) 2025.02.13
제어문  (0) 2025.02.12
데이터 입·출력  (0) 2025.02.10