배열
◎ 변수와 배열
프로그래밍에서 변수는 하나의 값만 저장할 수 있고, 만약 필요한 변수가 많아진다면, V필요 수에 해당하는 많은 변수가 필요하게 된다. 예를 들어 100명의 학생 성적을 저장하기 위해서 변수 100개를 선언하고 평균을 구하려고 한다면. . .
// 학생 100명 변수에 대한 점수를 할당
int score1 = 83;
int score2 = 90;
...
...
int score100 = 67;
// 학생 100명의 점수 총합
int sum = 0;
sum += score1;
sum += score2;
...
...
sum += score100;
// 평균 구하기
int avg = sum / 30;
위의 코드처럼 100개의 변수에 각 점수를 할당한 뒤에 합을 구하고 학생 수 100으로 나눠준다. 이와 같은 방식의 변수를 사용한 프로그래밍은 수백 수천 개의 변수를 다루는 힘든 프로그래밍을 초래할 수 있다. 따라서 효율적으로 변수들을 다루기 위한 방법으로 ‘배열’을 사용한다.

배열은 특정 타입의 데이터가 선형적인 공간에 연속적으로 담긴 자료구조이며 각 데이터는 0부터 시작하는 인덱스 번호로 관리 및 접근이 가능하다.
즉, 배열은 특정 타입의 데이터 묶음으로 인덱스를 활용해 관리하고 다루는 선형 자료구조이다.
예를들어,
int [] score = new int [100];
for(int i = 0; i<100; i++) {
sum += score[i];
}
과 같은 코드를 작성한다면, score 배열에 있는 점수들을 for문을 통해 쉽게 총 점수의 합을 구할 수 있다.
◎ 배열 선언과 사용법
자바에서 배열의 사용법을 알아보자면, 기존 변수 선언은
( 타입 + 변수명 ; ) 의 형태이다.
int score;
그리고 배열 사용 문법도 이와 크게 다르지 않는데,
( 타입 + [] + 변수명 ; )
타입과 변수명 사이에 []를 넣어주면, 문법상 변수명의 배열을 사용하겠다는 의미이다 .
int [] score;
● 배열 선언 방법 1( 초기화 o )
int [] studentScore = {51,76,89,90};
int [] studentScore = new int [] {51,76,89,90};
index = 0
|
index = 1
|
index = 2
|
index = 3
|
51
|
76
|
89
|
90
|
위와 같이 studentScore 변수의 int형 배열 객체에 {51,76,89,90}의 값을 초기화하여 사용할 수 있다.
그리고 {51,76,89,90}의 int 배열에는 처음부터 0이라는 인덱스로 시작하여 0,1,2,3 인덱스가 붙는다.
int score1 = studentScore[0];
// score1 = 51
int score2 = studentScore[1];
// score2 = 76
int score3 = studentScore[2];
// score3 = 89
● 배열 선언 방법 2( 초기화 x , 선언 o)
// 먼저 선언하였다.
int [] studentScore = new int [4];
// 이 경우에는 아래와 같이 사용이 불가하다.
studentScore = {51,76,89,90};
// 이렇게는 사용가능
studentScore = new int[] {51,76,89,90};
index = 0
|
index = 1
|
index = 2
|
index = 3
|
0
|
0
|
0
|
0
|
※ 배열은 타입에 따라 선언만 이뤄지는 경우 아래와 같은 값을 초기화한다.

위의 코드와 같이 선언하면, 크기가 4인 int 형의 배열을 사용하겠다는 문법이며,

각각이 담는 자료형의 크기만큼 인덱스마다 메모리 차지 또한 다르다.
개수의 변경이 불가능함
◎ 다중 배열
배열 항목에는 또 배열이 대입될 수 있으며, 이를 통해 다차원의 배열으로 활용할 수 있다.
본 정리에서는 가장 흔하게 쓰이는 이중 배열까지만 정리하겠다.
// 이중 배열( 초기화 o )
int [][] score = new int [][] {
// ※ 각 요소 배열의 크기는 다를 수 있다.
// 아래의 '※ 다중 배열이 메모리에 데이터 접근하는 방법'을 보면 이해될 것.
{1,2,3},
{4,5},
{6,7,8,9}
}
int[][] score = new int[][]{ {1, 2, 3}, {4, 5, 6} };
int[][] score = { {1, 2, 3}, {4, 5, 6} };
// 이중 배열( 초기화 x, 선언 o )
int [][] score = new int [4][3];

선언한 뒤에 각 인덱스를 활용하여, 값을 할당하거나 접근이 가능하다.
※ 다중 배열이 메모리에 데이터 접근하는 방법
int[][] score = {
{100, 100, 100},
{20, 20, 20},
{30, 30, 30},
{40, 40, 40},
{50, 50, 50}
};
// 위와 같이 score 변수의 이중 배열을 초기화한 경우
// 아래처럼 메모리에 데이터가 형성된다.

이중 배열은 첫 번째 인덱스의 값들이 내부에서 각각 새로운 배열 객체를 참조하는 형태이다.
따라서 score 변수는 JVM 메모리의 STACK 영역에 생성되어 Heap영역의 배열 객체에 대한 주소값을 할당받는다.
한편, 각각의 첫 인덱스에 이어 지정된 두 번째 인덱스의 크기에 따라 Heap영역에 배열 객체가 다시 생성된다.
즉, 배열의 첫 인덱스 값들은 두 번째 인덱스의 크기에 맞춰 생성된 배열 객체를 다시 참조한다.
따라서, 다중 배열 내 배열의 크기가 다를 수 있는 이유는 배열은 참조형(주소값)이기 때문이다.
◎ 배열 vs 리스트
배열과 리스트는 선형 자료 구조이며 데이터를 연속적으로 저장한다는 공통점이 있지만, 데이터를 저장하는 방식에서 차이점을 지닌다.
배열(Array)는 같은 타입의 데이터들이 순서(연속)적으로 구성된 ‘선형 자료 구조’이며, 메모리 상에 연속적으로 데이터가 저장된 ‘연접 리스트(순차 리스트)’에 해당한다.
배열은 고정된 선언 및 초기화에 따른 고정된 크기를 지니기에 만약 배열의 크기를 10으로 지정하면, 내부에 데이터가 5개만 있더라도 실제 배열의 크기는 10으로 유지되며 메모리가 낭비될 수 있는 가능성을 지닌다.
이러한 작동 방식은 배열이 논리적 저장 순서와 물리적 저장 순서가 일치한다는 특징에 의해 비롯된다. 만약 크기가 5인 배열을 선언한다면, 메모리 상에서도 물리적으로 이어진 5크기의 자원을 할당하고 이를 토대로 사용한다. 따라서 물리적으로 메모리 상에 한번 필요한 크기를 할당하고 사용한다는 객체를 생성하고 나면, 크기를 조절할 수 없다.
반면에 리스트(보통, Linked List / Array List)는 배열과 달리 메모리 상에 직접적인 연속성을 지니고 있지 않으며, 각 인덱스의 값의 연결이 다음 인덱스의 주소 값을 참조하는 형식인 선형 자료 구조이다. 따라서, 주소 값에 대한 참조를 변경하며 크기를 가변적으로 조절할 수 있는 장점을 지니고 있다. 다만, 각각 데이터에 대한 순회가 메모리 상 물리적 연속성을 지닌 배열에 비해 느리다.

제어문
◎ 제어문
● if / else 문
if(조건문) {
//실행문
} else {
//if문의 조건이 false일 경우의 실행문
}
※ 사용 예시
int score = 85;
// else if : 첫 if문이 false일 때 다른 조건을 연속 사용
// else만 사용하는 것은 맨 마지막에
if (score > 90) {
System.out.println('A');
} else if (score > 80) {
System.out.println('B');
} else if (score > 70) {
System.out.println('C');
} else if (score > 60) {
System.out.println('D');
} else {
System.out.println('F');
}
● switch 문
// 기준 변수로 가능한 자료형: byte, short, int, char, String, enum
switch ( 기준 변수 )
// case : 기준에 일치하는 case로 바로 이동
// break : switch문 실행을 종료
// default: 해당하는 case가 없을 때 - 마지막에 작성
case 2:
System.out.println("1");
break;
case 0:
System.out.println("2");
break;
case 5:
System.out.println("3");
break;
default:
System.out.println("4");
}
● for 문

-> 실행 과정
1. 루프 안에서 사용할 변수 초기화
2. 루프를 실행하기 위한 조건 확인
3. 조건을 충족시 실행할 내용
4. 각 루프가 끝날때마다 이행할 내용
-> 1번 이후 2를 충족할 동안 2~4 반복
// 루프 블록 안에서 변수값을 바꾸는 것으로 4번 과정 대신 가능
for (int i = 0; i < 10;) {
System.out.println(i);
i += 2;
}
// 구구단 예제
for (int i = 1; i < 10; i++) {
for (int j = 1; j < 10; j++) {
System.out.printf("%d X %d = %2d%n", i, j, i * j);
}
}
● while문 / do - while문
while문 : 조건이 true일 동안 반복 수행한다.
int i = 0;
// while 문의 괄호에는 종료조건만
while (i < 10) {
// 종료조건 충족을 위한 값 변화는 외적으로
System.out.println(i++);
}
double popInBillion = 8.5;
// break 를 통한 반복 탈출
while (true) {
System.out.println("세계인구: " + (popInBillion -= 0.1));
if (popInBillion <= 0) break;
System.out.println("인간의 욕심은 끝이 없고");
System.out.println("같은 실수를 반복한다.");
}
System.out.println("인류 멸종");
do while문 : 일단 수행하고 조건을 본다.
int enemies = 0;
do {
System.out.println("우선 시작");
if (enemies > 0) enemies--;
} while (enemies > 0);
🙏 잘못된 내용이 있다면 알려주심 감사하겠습니다.
'Java > 자바개념' 카테고리의 다른 글
Optional 기초 사용법 (1) | 2025.01.18 |
---|---|
상속 (0) | 2024.03.14 |
final과 final class (1) | 2024.03.08 |
자바의 메모리 구조 (0) | 2024.02.27 |
댓글