본문 바로가기
개발공부하며 느낀 인생 공부

자바 배열의 선언과 초기화[220622 TIL]

by 날파리1 2022. 6. 23.

자바에서 배열이란?

자바언어를 코딩을 얼마 배우지 않은 사람들도 코웃음 칠정도로 많이 듣고 메소드,생성자,필드변수 이런 말들보다 쉽다고 생각되는 배열은 내게는 그리 쉽지 않았다. 사실 아직도 쉽지 않다. 다만 어제보다는 배열에 대해 조금은 더 안 것 같기에 오늘의 til 주제로 써볼까 한다.

아주 초반에 메가테라에서 주던 코딩도장 문제들은 좌절감만 안겨줬다면 요새 주는 것들은 난이도가 조금 낮아서 코딩 허접인 내게 challenging한 만큼의 과제를 준다. 이것을 풀었을때 통쾌함은 있으면서 결코 한번에 슥삭슥삭 풀리지 않는 정도의 수준이다. 이게 난 요새 좋은데 나한테 적절한 수련을 할 정도의 과제를 주고 있는 것 같다. 

배열은 뭐 어떤 열들안에 값을 넣은거지 뭐

라는 단순한 개념을 깨부수고 

도대체 배열은 어떻게 선언하고 초기화하는거지?
배열은 시스템 아웃하면 어떻게 출력되는거야?
테스트 코드에서 비교하려면 대체 어떻게 입력해야하는 거야?

라는 여러 의문을 정의내리고 정리하고싶게 만들어 줬다.

일단 오늘 받은 코딩문제는

이거 였다.

읽어보면 알겠지만 x를 차례대로 곱하여 배열에 넣으면 완성되는 그런 문제였다.

그래서 내가 처음 쓴 코드는

public class XspaceNumber {
  public long[] Solution(int x, int n) {

    int result;
    long[] answer = {};

    for (int i = 1; i < n + 1; i += 1) {
      result = x * i;
      answer = new long[n];
      answer[i - 1] = result;
    }
    return answer;

  }
}

문제는 시스템이 아예 돌아가지 않는다.

왜?

for 문의 작동과 배열의 초기화와 재할당에 대한 부족한 이해

문제는 answer = new long[n]이 for 문 안에 있다는 건데 즉 반복문이 한번 실행될 때마다 answer 배열의 크기가 재할당된다.

근데 이게 왜 문제인지도 몰라서 한참이나 내가 만든 식을 보았다.( 사실 식 그 자체 보다는 내가 쓰는 타입과 메소드 등 프로그래밍 용어와 컴퓨터가 그 역할을 처리하는 방식에 대한 이해가 부족해서 일어난 실수들이 대부분인 것 같다.)

 

배열의 선언과 초기화

배열 참조변수만 선언 (배열의 크기도 할당해주지 않고 초기화해주지도 않았음)

int[] array;

int array[]

선언과 동시에 배열의 크기를 할당

int[] array = new int[5];

String[] array = new String[5]

기존 배열의 참조 변수에 재할당(초기화)

int[] array;

array = new int[5] (5의 크기를 가지고 초기값을 0으로 채워진 배열을 만듬)

 

배열의 선언과 동시에 배열의 크기 지정  및 값 초기화

int[] array = {1,2,3,4,5}  -> 배열의 선언과 크기 지정, 값 지정

int[] array = new int[] {1,2,3,4,5}. -> 배열을 선언함과 동시에 5의 크기를 가지고 5개의 값을 넣은 배열을 새로 할당(생성)해줌

 

2차원 배열 선언

int[][] array = new int[2][3] ->

int array[][];

int[]array[]

 

첫 예에서 사용된 array는 2차원 배열이며,

int[2][3] array= {

 {10,20,30},

 {40,50,60}

};

arrya[i]는 array의 각 배열 요소로 1차원 배열이 됨 즉 array[0]={10,20,30} 

 

마지막! 타입의 통일

class Solution {
  public long[] solution(int x, int n) {
    long z = Long.valueOf(x);
    
    long result;
    long[] answer = new long[n];

    for(int i = 1; i < n+1; i += 1) {
      result = z * i ;
      answer[i-1] = result;
    }
    return answer;
  }
}

 위 코드는 배열을 제대로 선언한 후 통과한 식인데,  long z = long.valueOf(x); 가 포인트이다. 사실 주어진 수 x를 타입 변환 없이 테스트에 넣으니 87.5퍼센트만 통과하는게 아닌가. 그래서 원인들을 짚어봤는데 짚은 원인은 맞았으나 또 머리가 뒤죽박죽이라 (실제로 어떤 것 때문에 오류가 났는지 모르니까) 이것저것 다건드리다가 원래 식까지 건드려서 더 멘붕인 상황이 왔다. 이래서 하나하나씩 테스트해보면서 완성해가는 TDD(Test Driven Development 테스트 주도 개발)가 좋고 중요한듯. 이 작은 코드도 멘붕인데 프로그램이 커지면 어후야..)

식의 변수인 x를 long 타입으로 바꾸어주고서야 겨우 완료.. 원래는 i 도 long으로 바꿨다가 정말 이것저것 다했다.

추가로 알게된건 

배열의 크기를 선언해줄때 타입은 무조건 int 로 써야한다는 것!

int[] array = new int[int 타입]

배열의 크기값이 왜 int인지 알 수 있는 힌트로는 answer.length를 간단하게 찍어보시면 int를 매개변수로 받고 있다는 걸로 확인할 수 있습니다. 즉 배열의 크기는 int로 취급하고 있다는 거죠. 이 때 정확하게 알고 싶으시면 Array를 command + B 키를 눌러 찍어 타고 들어가시면 Array를 생성할 때 필요한 길이를 무엇으로 받고 있는지 확인하실 수 있습니다.
command + B 키를 누르고 타입명을 찍어 타고 들어가시는 습관을 들이시면 좋습니다

라는 트레이너 분의 첨언!

 

느낀 점

그래서 오늘은 다시한번 반복문 포문의 사용, 배열의 초기화와 생성, 재할당 을 배웠고 또 거기에 타입의 통일 또는 변환 그리고 만든 식이 문제가 생겼을때 문제를 좇아가는 법을 배웠다. 1시간 코딩 도장에 이정도 배우면 정말 많이 배운듯! 다시 이렇게 정리하는데 추가...1시간 그치만 다시 또 막히면 이 글을 찾아와 보지 않을까??

다시한번 느끼지만 어떤 개념은 '정의'로 알게되는 것이 아니라 정의로 대략적인 형태를 그리고 수많은 예시와 예외들의 반복으로 그 디테일을 채워나간다고 생각한다. 그리고 그 디테일을 내가 자유자재로 활용하고 변형까지 가능할 때 정복했다고 할 수 있지 않을까?

 

오늘은 마땅한 짤이...

아앗! 취한다 코딩뽕! 오늘은 배열 흡성대법 으어아아아!
ㅈ도 아닌거 해결하고 코딩뽕에 찬 내 모....ㅅ...ㅡㅂ

마지막이 ㅅ...ㅂ라고 읽히는 건 내 ...착 ..각일까? ^____^!

댓글