오늘은 날씨가 완전 좋다!
하늘도 맑고일어나자마자 상쾌하고
코딩도 잘될 수 있을 것 같은 느낌!

image

8월에서 9월로 넘어갔다.
시간이 엄청 빨리가는 것 같다.
늘 지식에 촉박한 느낌을 받긴하지만

한계단씩 성장해가자, 오늘도 공부시작!!


어제는 제어문에 대해 공부해보았다. 아주 기본적인 문법이고, 어떤 프로그램이든 많이 공통적으로 사용하는 파트이다.
오늘은 배열에 대해 공부하려고한다.

배열이란?

동일한 타입의 값들을 하나의 묶음으로 묶은 자료 구조를 의미한다.
예를 들어 어떠한 학교 한반의 학생이 40명이라고 했을 경우
몸무게를 조사하는데 변수를 40개만들어 저장하기에는 비효율 적이다.
그럴 경우에 배열을 사용한다.

요소(element) : 배열이 가진 각 값들을 배열의 요소라고한다.
인데스(index) : 배열의 각요소는 0부터 시작하는 번호를 부여받는데, 이처럼 배열의

각 요소가 부여받은 순번을 인덱스라고한다.

1차원 배열

선언방법

double[] weight; // 선언
weight = new double[40]; // 할당
double[] weight = new double[40]; // 선언과 할당을 한번에

double[] weight; 라는 의미에 집중해보자
🔹 배열을 가리킬 참조변수 weight를 선언했다.

new double[40]; 라는 의미는
🔹 총 40개의 double형 값을 저장할 수 있는 배열이 생성된다.
🔹 double형의 기본값인 0.0으로 초기화 하였다.

즉, weight = new double[40]; 의 의미는
🔹 대입 연산자에 의해 생성된 배열 첫 번재 요소의 주소값이 참조 변수 weight에 할당된다.
🔹 참조변수 weight은 배열의 맨 첫번째 요소(weight[0])를 가르키게 된다.

double[] weight = new double[] {60, 62, 45, 77, .... , 55};

위에있는 코드와는 다르게
0.0값으로 초기화하지않고 직접 방에 값을 넣어서 초기화해주는 방법이다.
여기서 중요한점은 double[]안에 숫자를 넣지 않아야한다는 점이다.

int[] a = new int[]{};
int[] a = new int[0];
System.out.println(Arrays.toString(a)); // []

빈배열을 선언하고 싶을 경우 위와 같이 선언할 수 있고
Arrays.toString으로 출력할 경우 [] 이렇게 빈배열이 출력됨을 알 수 있다.
return 해야할경우 a를 return하거나, 뒤에 할당한 값을 그대로 return하면된다.
배열에 있는 값을 탐색할 수 있는 방법이 있다.

int[] num = {1,2,3,4};

위와 같은 코드를 작성했을때 num[0]을 출력하게 되면
0번 인덱스에 있는 int형 값인 1이 출력되게 되어진다.
반대로 값을 넣을 수 도 있다.

num[0] = 5;

이렇게 5라는 값을 인덱스 0번방에 할당하게되면
{5,2,3,4}로 바뀌게 되어진다.


2차원 배열

위에 까지는 1차원 배열에 대해 알아보았고
여러차원의 배열들이 존재한다.

2차원 배열에 대해 알아보자

선언방법

int[][] kcal;
kcal = new int[31][3];

위에 1차원 배열과 다를게 없다
[]하나가 더추가된 모습이고
여기서 중요한건 내부배열과 외부배열이다.

[31] = 외부배열
[3] = 내부배열

위와같이 가정하였을 경우 내부배열 3개짜리를 외부배열 31개가 가지고 있다고 생각혀면된다.

초기화를 하였을 경우

{0,0,0}
{0,0,0}




{0,0,0}

즉, {0,0,0}이라는 방이 31개가 생기는 것을 알 수 있다.
할당하는법은 1차원 배열과 동일하다


가변 배열

가변배열은 배열이 2차원 이상일때 마지막 차수에 해당하는 배열의 길이를 고정하지 않아도 되며
이러한 배열을 가변 배열이라고 한다.
가별 배열은 아래와 같이 선언 및 초기화가 가능

int[][] ages = new int[5][];

위처럼 초기화를 시키고 age를
Arrays.toString();으로 출력을 해보면
아래와 같이 나온다.

[null, null, null, null, null]
int[][] ages = new int[5][];

ages[0] = new int[5];
ages[1] = new int[6];
ages[2] = new int[7];
ages[3] = new int[8];  
ages[4] = new int[9];

System.out.println("Arrays.toString(ages[0]) = " + Arrays.toString(ages[0]));
System.out.println("Arrays.toString(ages[1]) = " + Arrays.toString(ages[1]));
System.out.println("Arrays.toString(ages[2]) = " + Arrays.toString(ages[2]));
System.out.println("Arrays.toString(ages[3]) = " + Arrays.toString(ages[3]));
System.out.println("Arrays.toString(ages[4]) = " + Arrays.toString(ages[4]));

// 결과
// Arrays.toString(ages[0]) = [0, 0, 0, 0, 0]
// Arrays.toString(ages[1]) = [0, 0, 0, 0, 0, 0]
// Arrays.toString(ages[2]) = [0, 0, 0, 0, 0, 0, 0]
// Arrays.toString(ages[3]) = [0, 0, 0, 0, 0, 0, 0, 0]
// Arrays.toString(ages[4]) = [0, 0, 0, 0, 0, 0, 0, 0, 0]

여기서 알 수 있는점은
처음에 외부배열 5개를 초기화 시켜 ages에 할당했고
그 아래에 내부 배열의 값을 가변시켜 초기화를 시켜주오
5~9까지의 방을 만들어준 모습이다.

가변 배열에 관해서는 이차원배열을 이해하면
어느정도 이해가 가능할 것 같다.

오늘 배열문제를 풀어보면서
조금 유용했던 것들을 적어본다.

Arrays.toString();
-> 배열의 주소값을 String으로 표현하여 시각적으로 보기편하게 바꿔줌

배열.length
-> String과는 다르게 메서드가 아니다. 배열의 길이를 알 수 있다.

Arrays.copyOf();
-> 복사할 배열과 길이를 새로정해 새로운 배열을 만들어 리턴한다.

Arrays.copyOfRange();
-> 대상의 배열의 시작과 종료위치를 정해 복사하여 배열로 리턴해주는 함수이다.

System.arraycopy();
-> 복사배열과 붙여넣을 배열을 선택해 어디서 부터 복사할지. 어디서 부터 붙여넣을지

정해주는 메서드이다.

공부해보면서 Arrays.stream(); 에대한 내용들이 꽤나 자주보였다.
stream을 이용해 여러가지 메서드들을 더 불러올 수 있는 모양이다.
이 교육과정은 이후에 있기때문에 우선 기본적인
배우는 것에 집중하기위해 우선 공부는 미뤄두었다.



마치며…

오늘의 공부는 배열에 대한 공부가 주를 이루었다.
이 외에도 페어와 계산기를 만들기도했고
여러가지 배열의 문제를 푸는 시간도 가졌다.

아직까진 이해에 대한 어려움은 크게없지만
이해와 사용은 별개인 것 같다.

조금더 배열과 친숙해지기 위해서는…
알고리즘 문제를 열심히 푸는 수 밖에..

오늘 공부는 여기서 끝!


오늘의 커피량: ☕️ ☕️ ☕️ ☕️️️️
오늘의 점심: 대패삽겹살,라면,공기밥