귓등을 스쳐간 개념 귓구멍에 때려넣기(JAVA 배열)

샨티(shanti)·2022년 7월 7일
0

Study

목록 보기
2/11

JAVA를 공부하는 사람들이라면 누구나 접했을 오라클 공식 문서...
아 영어라 정말 읽기 싫다. ㅎㅎ
특히 내가 이해하기 좀 어렵다~ 싶은 개념에 대한 정보를 영어로 접하는 것 자체가 부담스럽기에...
하지만 이 인터넷의 바다 속에서 '정확한' 정보를 찾겠다고 이리 저리 쏘아다닐 바에는
공식문서 하나를 제대로 파는게 낫지 않나? 하는 생각도 든다.

나 역시도 공부를 하는 입장이니 블로그에 글을 쓰면서도 긴가? 민가? 하는 부분들이 많은데
다른 학습자들도 별반 다르지 않으리라 생각한다. 물론 그중에서도 정확하게 개념을 파악하고, 공식적인 문서만을 소스로 삼아 글을 쓰시는 분들도 있기에 일반화 할 순 없겠지만...

어쨌든. 영어가 어렵다는게 이 글의 메인은 아니고 ㅎㅎ.

이월 3주차 강의 중에서 '마카오뱅크'라는 주축이 되는 강의를 들었는데, 아샬님이 아주 물흐르듯이 이야기를 하시는 부분에서 굉~장히 중요한 개념들이 나오는 것을 이제서야 캐치했다.

정말... 이제서야 알아챌 수 있는게다.
아. 이거 진짜 중요한건데!! 하면서 특정 부분을 몇번이나 돌려서 들었는지 모르겠다.

예전같았으면 그 개념이 내 귓등을 스치고 지나가기만 했을텐데,
이제는 그럴 수가 없다. 귓등을 스쳤다면 얼른 잡아채서 귓구멍에 때려 넣어야 한다.
귓구멍에만 때려넣을 게 아니라 내 뇌에도 때려넣어야지...

우선은 배열과 리스트에 대한 내용을 간단히 기록해두려는데, 나중에 리마인드 차원에서 크게 도움이 될 것 같아 두서없이 그리고 순서 없이 나열해본다.

배열(Array)과 리스트(List)의 차이점

마카오뱅크 강의에서 3개의 JButton을 연달아 생성하는 장면이 나오는데 방법을 3가지로 제시한다.
각 방법에 대한 예시는 내가 임의로 만든 것이니 참고만 하길..

(1) 객체명을 각각 다르게 주면서 JButton을 생성(ex. button1, button2, button3)
(2) 배열로 생성

// 예. 송금, 잔액조회, 거래내역 총 3개의 버튼을 배열로 생성하여 panel에 추가

JButton[] buttons = new JButton[]{
          new JButton("송금"),
          new JButton("잔액조회"),
          new JButton("거래내역")
      };

panel.add(buttons[0]);
panel.add(buttons[1]);
panel.add(buttons[2]);

(3) List로 생성

// 예. 송금, 잔액조회, 거래내역 총 3개의 버튼을 List로 생성하여 panel에 추가

List<JButton> buttons = new ArrayList<>();
buttons.add(new JButton("송금"));
buttons.add(new JButton("잔액조회"));
buttons.add(new JButton("거래내역"));

panel.add(buttons.get(0));
panel.add(buttons.get(1));
panel.add(buttons.get(2));

JButton을 각각의 방법으로 구현하는 것도 정말 중요한데,
강의에서 아샬님이 마치 스치듯 말씀하신 부분을 캐치하고 이해하니 정말 깊은 뜻이 있었구나~ 싶어서 놀랐다.

"배열로도 버튼을 만들 수 있습니다. 하지만 각 버튼의 인덱스를 계속 관리해주어야 합니다.
따라서 우리는 더 '동적으로' 관리하기 위해 List를 활용할 수도 있습니다."

배열과 리스트의 차이점을 정확히 이해하지 않는다면 이 짧은 문장은 그저 귓등을 스쳐지나가는, 그런 문장이 될 것이다.
하지만 이 강의를 반복해서 들을수록 이 말 속에 여러가지 중요한 개념이 복합적으로 포함되어 있다는 것을 눈치챘다.

아래는 간략하게 정리해 본 내용.

이 부분은 dev.java의 Creating Arrays in Your Programs에서 가져온 부분인데, 배열이 무엇인지에 대한 정의를 내리고 있다.
강의에서 들었던 '동적으로' 라는 단어를 떠올려 봤을 때 당연히 그 반대인 '동적이지 않은'건 무엇일까? 라는 의문이 생긴다.
동적으로 관리하기 위해 List를 사용한다면, 배열은 동적이지 않은걸까?
그 답을 명확하게 찾을 수 있다.

먼저, 'fixed number'가 눈에 들어온다. 'single type'도 눈에 들어오고...
'length is fixed' 라는 문장도 보인다.

종합해서 이야기하면 배열은 만들어지고 나면 그 길이가 고정되는, 즉 고정된 갯수의 싱글 타입의 값들을 포함하는 컨테이너 객체라고 할 수 있다.
만약 내가 배열을 선언할 때 길이(the length of an array)를 8이라고 정한다면 그 길이는 변동되지 않는다. 바꿀 수 없게 되는 것이다.

그래서 아샬님은 강의에서 배열로 버튼을 만드는 경우와 리스트로 버튼을 만드는 경우를 설명하시고, '동적으로' 관리하기 위해 리스트를 활용할 수 있다고 말씀하신 것이다....... 오마이갓.

물 흐르듯 흘러 지나가버린 한마디에서 우리는 배열의 특징과 List의 특징을 모두 발견할 수 있는 것이었다. 그냥 내가 몰랐을 뿐. 하하...

실제로 마카오뱅크 강의를 반복해서 인출하고, 실제에선 어떻게 쓰일수 있을지 고민해보니 array를 활용하여 컴포넌트를 생성하면 추후 컴포넌트를 없애거나 추가하는 경우가 생길 때 꽤 불편해지겠다는 생각이 들었다.

물론 필드에서 컴포넌트가 그만큼 자주 사라지고 또 생기는지는 모르겠지만.
인덱스를 통해 관리해주어야 하기 때문에 개발자가 '인덱스'라는 요소를 고려해야 한다는 점은 분명히 로드를 얹게될 것이다.


개인적으로 배열에서 가장 헷갈리는 부분이 있다면 선언하고, 초기값을 지정해주는 방법이다.
한 번 머릿속에서 꼬여버리고 나면 '내가 배열에 대해 과연 아는게 있는건가?' 싶을 정도로 머릿속이 하-얘지는.. ㅎㅎ 그런 배열..;;

아주 간단하게 int 타입의 값 5개(1, 2, 3, 4, 5)를 가지고 있는 number라는 이름의 배열을 생성하고 값을 할당하는 예시를 통해 배열과 좀 더 친해져보자.

// int타입의 값 1, 2, 3, 4, 5 총 5개의 값을 포함하는 number 배열 생성하기

// 방법 1-1. 배열을 생성함과 동시에 값 5개를 인덱스 0~4까지 차례로 할당. 값의 총 갯수가 곧 배열의 길이

int[] number = new int[]{1, 2, 3, 4, 5};


// 방법 1-2. new int[]를 생략해도 결과는 같음

int[] number = {1, 2, 3, 4, 5}



// 방법 2-1. 배열을 생성할 때 배열 길이를 5로 정해주고 나서, 각 인덱스에 값을 직접 할당해주는 것

int[] number = new int[5];

number[0] = 1;
number[1] = 2;
number[2] = 3;
number[3] = 4;
number[4] = 5;



// 방법 2-2. 배열을 생성할 때 배열 길이를 5로 정해주고 나서, 각 인덱스에 값을 직접 할당해줄 때 반복문을 사용
int[] number = new int[5];

for (int i = 0; i < number.length; i += 1) {
  number[i] = i + 1;
}

나는 아직 List나 이외 자료구조에 대해 잘 이해하지 못해서 배열을 유용하게 활용할 때가 많다.

하지만 앞에서도 이야기했듯이 배열은 인덱스로 관리해야 하기 때문에, 내가 원하는 '값(value)'이 포함된 배열 인덱스에 직접 접근하는 것이 어렵다. 보통 배열에서 원하는 값을 얻어내거나 접근하기 위해서는 (1) 그 값의 인덱스를 내가 미리 알고 있거나, (2) 아님 적절한 조건을 부여하여 배열의 처음부터 끝까지 탐색해야 한다.

결국... 더 쉬운 작업을 위하여 더 어려운 개념을 배워야 하는(ㅎㅎ) 아이러니~

사실 이번 마카오뱅크 강의에서 놀랐던 점 중 하나는, 원시타입(primitive type)이 아닌 클래스타입(ex. JButton)도 배열 생성이 가능하다는 점이었다.
JButton을 한두 개 생성한다면야 당연히 객체명을 바꿔서 만들고 패널에 add하면 되겠지만...
여러개일 땐 정말 상황이 달라지기에ㅎㅎ. 그 때는 맨 위에서 했던 것 처럼 배열을 활용하여 더해줄 수 있겠다.


아주 간략하게 배열에 대해 알아보았다.
사실 2차원 배열도 있는데 그것 또한 계속 파고들어가면 다른 것 공부할 시간을 빼앗길테니...;; 계속 밸런스를 잡아야겠다.

다음번엔 List... 공부해야지. 뽀개고말겄어!!

profile
가벼운 사진, 그렇지 못한 글

0개의 댓글