Acorn Academy 12/01

Bae Seong Jun·2023년 12월 1일

Acorn academy

목록 보기
11/70

리터럴이란 ?

https://mine-it-record.tistory.com/100

리터럴이란 프로그램에서 직접 표현한 값을 의미한다.
소스 코드의 고정된 값을 대표하는 용어이며,
종류로는 정수, 실수, 문자, 논리, 문자열 리터럴이 있다.

배열

  • 기본 데이터 및 참조 데이터 형을 포함한 자바의 모든 데이터 타입을 배열로 저장할 수 있다.
  • 같은 데이터 형만 배열로 저장이 가능하다.
  • 요소의 접근은 인덱스를 이용하여 가능하다.
  • 배열의 크기는 length를 사용하여 구할 수 있다.
  • 1차원 배열 및 다차원 배열이 모두가능하다.
  • 변수는 선언만 하면 사용할 수 있으니 배열은 반드시 선언과 생성작업이 필요하다.
  • 배열은 객체이기 때문에 기본적으로 new 키워드를 사용하여 생성해야되고 간단한 표현식도 제공된다. 기본적으로 3가지 방법으로 배열을 생성해서 사용할 수 있다.
  • 배열이 생성되면 기본적으로 지정한 데이터형에 맞는 기본값으로 초기화된다.
  • 데이터 타입별 배열 기본값 : int:0, String:null, boolean:false, double:0.0
  • 배열은 늘리거나 줄일 수 없다.

배열 선언 방법

데이터형[] 배열명;
데이터형 배열명[];  //배열변수 선언
배열명 = new 데이터형[크기];  //배열 초기화

데이터형[] 배열명 = new 데이터형[크기]; //배열 초기화
데이터형 배열명[] = new 데이터형[크기]; //배열 초기화

int[] num2 = {10, 20, 30}; // 선언과 초기화까지 한번에

궁금점 선언만 할시 무엇이 생성되는지?
num에는 그럼 하나의 참조 주소값이 저장될텐데 정확히 어디 부분의 주소값이 저장되는지?
추론 : 인덱스 0 의 주소값이 저장될 것 같다.

for each

배열 자동 순회 반복문
인덱스 값을 제공하지 않음
제공되는 데이터는 배열 각 값을 제공

	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


배열에 배열을 저장

값이 배열에 저장되는 과정

  1. 배열 변수 선언
  2. 배열 객체 생성
  • 힙공간에 메모리 마련
  • 메모리에 데이터타입의 기본값으로 초기화
  • 주소값을 스택공간의 배열변수에 저장
  1. 배열 객체에 데이터 값 저장

아래 코드는 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문을 통한 이중배열 순회

		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("==========");
		}

2중 배열에서 for each

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;
	}
profile
코딩 프로?

0개의 댓글