https://mine-it-record.tistory.com/100
리터럴이란 프로그램에서 직접 표현한 값을 의미한다.
소스 코드의 고정된 값을 대표하는 용어이며,
종류로는 정수, 실수, 문자, 논리, 문자열 리터럴이 있다.
배열 선언 방법
데이터형[] 배열명;
데이터형 배열명[]; //배열변수 선언
배열명 = new 데이터형[크기]; //배열 초기화
데이터형[] 배열명 = new 데이터형[크기]; //배열 초기화
데이터형 배열명[] = new 데이터형[크기]; //배열 초기화
int[] num2 = {10, 20, 30}; // 선언과 초기화까지 한번에
궁금점 선언만 할시 무엇이 생성되는지?
num에는 그럼 하나의 참조 주소값이 저장될텐데 정확히 어디 부분의 주소값이 저장되는지?
추론 : 인덱스 0 의 주소값이 저장될 것 같다.
배열 자동 순회 반복문
인덱스 값을 제공하지 않음
제공되는 데이터는 배열 각 값을 제공
for (int data : num) { //배열 자동 순회
System.out.println(data);
}
배열변수에 새로운 배열객체를 할당하면 이전에 할당한 배열객체는 더 이상 참조할 수 없음
int [] num = new int[4];
num[0] = 1;
num[1] = 2;
num[2] = 3;
num[3] = 4;
num = new int[3]; // num에 아예 새로운 메모리의 주소값을 할당하는 구조임
// 따라서 num[3]은 더이상 참조할 수 없음
num[0] = 1;
num[1] = 20;
num[2] = 30;
: https://yaboong.github.io/java/2018/05/26/java-memory-management/
자바 스레드에 관하여 : https://kadosholy.tistory.com/121
배열의 정확한 이해 : https://coding-factory.tistory.com/253
아래 코드는 3가지 방법으로 배열을 선언 및 초기화해보는 코드다.
단, 3번째 방법에서는 미리 선언된 num3배열변수에 새로운 배열객체를 덮어씌워봤다.
// 1. new 이용
int []num;
num = new int[3];
num[0] = 10;
num[1] = 20;
num[2] = 30;
// 2. 값만 이용 (리터럴을 이용한 배열 생성)
int [] num2 = {10, 20, 30};
// 주의점 이 선언법은 배열 선언과 값 입력을 따로 해줄 수 없다.
// 무조건 같이 선언+입력해야한다.
// 3. new+값 이용
int [] num3;
num3 = new int[] {10, 20, 30};
num3 = new int[] {10, 20, 30, 40};
배열값을 저장해서 새로운 객체를 만들어 새로운 주소에 저장하여 참조값을 새로 얻어내는 것이 아니라,
그냥 같은 참조값을 그대로 저장한다.
고로 같은 주소지를 가르키는 것이다.
해당 주소지의 값을 변경하면 두 배열변수가 가르키는 값이 동시에 변경되는 효과가 나타난다.
아래 코드는 num1배열을 num2 배열에 저장해보고 값을 확인해보는 코드다.
int[] num2 = {10, 20, 30};
System.out.println(num2.length);
System.out.println(num2[0]);
int[] num1;
num1=num2;
num1[0]=100;
System.out.println(num2 +" "+ num1 + " " + num2[0]);
배열을 역방향으로 순회한다.
for (int i = num3.length-1 ; i >= 0; i--) {
System.out.println(num3[i]);
}
배열 선언
데이터형 [][] 배열명;
배열 생성
배열명 = new 데이터형[행크기][열크기];
배열명 = new 데이터형[행크기][];
배열 생성+선언 동시에
int[][] nums = {{3,4}, {1,2}};
int[][] num = new int[3][2];
위의 num이차원배열을 본다면
num[0]에는 num[0][0]을 가르키는 주소값이 저장된다.
따라서 각 행에는 참조값이 저장되고,
각 열에는 배열의 데이터들이 저장된다.
2차원 배열에서 행의 크기는 반드시 지정해야한다.
new 키워드를 사용하여 지정된 크기만큼 배열이 생성된다. 행 크기와 열 크기를 모두 지정
하면 정방형의 2차원 배열이 생성되고 열크기를 지정하지 않으면 비정방형의 2차원 배열이
생성된다. 일반적으로 행 크기만 지정하고 열 크기는 동적으로 지정하는 방법으로 2차원 배
열을 사용한다. 하지만 반드시 행 크기는 지정해야 된다.
정방형배열 : 행과 열의 크기가 전부 정해진 2차원 배열
비정방형배열 : 열의 크기를 지정하지 않은 2차원 배열
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
System.out.println("num["+i+"]["+j+"]= "+ num[i][j]);
}
System.out.println("==========");
}
for each문을 자세히 알아보자.
for(int[] i : num) 반복문이 있다고 본다면
괄호안의 int[] i : num 식은 사실 배열을 반환하는 구조다.
이제 반환된 그 배열을 for문으로 반복하는 것이다.
아래 이중배열을 단순 for each로 반복하는 코드가 있다.
for (int[] is : num) {
System.out.println(is);
}
결과값은 각 행에 저장된 주소값을 반복하며 출력한다.
아래는 이중배열을 for each문을 중첩해서 반복하는 코드다.
for (int[] is : num) {
for (int is2 : is) {
System.out.println(is);
}
}
첫번째 for문제에서 num의 행에 대한 값들을 배열로 반환해서 is변수에 저장하고,
저장된 is 배열변수에 대해 한번 더 for each문으로 반복하여 각 주소값에 해당하는 배열을 반복하며 값을 출력한다.
이런 식으로 for each문을 통하여 간단하게 2중 배열 변수를 순회할 수 있다.
선언 및 초기화를 동시에 할 수 있다.
int [][] num = {
{10, 20, 30},
{40},
{50,60}
};
주의점: 선언 과 초기화를 따로할 수는 없다.
함수 호출시에 값만 전달: pdt(기본형데이터타입) 8가지 데이터만 해당
다만, 배열 같은 객체를 참조하는 데이터타입을 매개변수로 전달할 경우에는
주소값을 전달하는거라서 다른 함수에서 그 주소값의 값을 변경하면 전달된다.
기본형 데이터타입 제외 모든 것이 해당됨.
private static void test2(int[] num2) {
num2[0]=100;
}
public static void main(String[] args) {
int [] num2 = {10, 20, 30};
for (int i : num2) {
System.out.println(i);
}
System.out.println("============");
test2(num2); //test2 함수에 num2 정수의 배열 전달
System.out.println("============test2 함수 호출 후");
for (int i : num2) {
System.out.println(i);
}
}
}
조심해야할 사항 : 배열의 특정값을 집어서 전달해줄 경우 값이 반환되어 전달되는 것이니 콜바이벨류다.
public static void main(String[] args) {
test3(num2[2]);
}
private static void test3(int i) {
i=1;
}