반응형

 

안녕하세요! 제 개발 블로그에 오신 것을 환영합니다. 🧑‍💻 지난번에는 클래스와 객체, 인스턴스에 대해 붕어빵을 굽는 것에 비유해서 재미있게 알아봤었죠.
오늘은 이렇게 만든 객체들을 더 효율적으로 관리하고 활용하는 방법에 대해 이야기해 보려고 합니다.
바로 배열(Array)의 도입인데요, 배열이 객체와 만나면 얼마나 강력해지는지 함께 알아볼까요?

 

객체, 그런데 이제 여러 개를 다루는 방법 📦

우리가 학생 데이터(Student 클래스)를 다루면서 student1, student2 변수를 따로 선언해 관리했어요. 각각의 학생 데이터를 구조적으로 다룰 수 있게 된 것은 좋았지만, 학생 수가 100명이 되면 student100까지 변수를 만들어야 하고, 출력 코드도 100줄을 작성해야 하는 문제가 생기죠.

 

비효율적인 코드의 예시:

// 학생 100명을 선언하고 출력하려면..
Student student1 = new Student();
// ...
Student student100 = new Student();

// 출력 코드도 100줄!
System.out.println("이름:" + student1.name + " 나이:" + student1.age + " 성적:" + student1.grade);
// ...
System.out.println("이름:" + student100.name + " 나이:" + student100.age + " 성적:" + student100.grade);

새로운 학생이 추가될 때마다 코드를 일일이 수정해야 하는 이 지루하고 비효율적인 작업을 배열을 사용해서 혁신적으로 개선할 수 있습니다. 마치 여러 개의 상자를 한 줄로 묶어서 한 번에 관리하는 것처럼요


배열, 객체를 담는 마법의 상자 🎁

배열은 같은 타입의 데이터를 한데 모아서 관리하는 데 최적화된 자료구조입니다. 이전에는 int[]나 String[]처럼 기본 자료형의 배열만 주로 사용했지만, 우리가 직접 정의한 Student 클래스도 하나의 타입이므로 당연히 Student[] 배열을 만들 수 있습니다.

배열에 객체 보관하기:

Student student1 = new Student();
// student1 객체 정보 설정...
Student student2 = new Student();
// student2 객체 정보 설정...

// Student 객체를 담을 수 있는 크기 2짜리 배열 생성
Student[] students = new Student[2];

// 배열에 객체의 '참조값'을 대입
students[0] = student1;
students[1] = student2;

중요한 개념: 여기서 배열에 들어가는 것은 student1이라는 객체 자체가 아니라, 객체의 위치를 가리키는 '참조값(주소)'이라는 사실을 꼭 기억해야 해요. 자바에서 변수 대입(=)은 항상 변수에 들어있는 값을 복사하는데, 객체 변수는 참조값을 가지고 있기 때문에, 이 참조값이 배열에 복사되어 저장됩니다.

위 그림처럼 student1 변수와 students[0] 변수는 모두 같은 x001이라는 주소를 공유하게 되는 거죠. 마찬가지로 student2와 students[1]도 같은 x002 주소를 가리킵니다. 이제 students[0]와 students[1]을 통해 각각 학생1과 학생2 객체에 접근할 수 있게 된 거예요!


배열을 사용한 코드 리팩토링 ✨

배열을 도입한 덕분에 코드가 훨씬 간결하게 변했습니다. 이제 학생이 100명이든 1,000명이든 for문 하나로 모든 학생의 정보를 출력할 수 있어요.

개선된 코드 예시:

// 학생 객체들을 한 번에 배열로 초기화!
Student[] students = new Student[]{student1, student2};

// for문으로 배열의 모든 학생 정보 출력
for (int i = 0; i < students.length; i++) {
    // 배열의 각 인덱스에 접근하고, 다시 .으로 객체의 멤버 변수에 접근
    System.out.println("이름:" + students[i].name + " 나이:" + students[i].age + " 성적:" + students[i].grade);
}

이 코드는 학생이 몇 명인지에 관계없이 students.length만큼 반복하기 때문에, 학생이 추가되어도 출력 코드를 수정할 필요가 없습니다. 아주 깔끔하고 효율적이죠!


배열 초기화: 텅 빈 상자 vs. 채워진 상자 🎁

배열을 만드는 방법은 크게 두 가지로 나눌 수 있어요.

  1. 크기만 지정하고 만들기:
    • int[] numbers = new int[3];
    • 이 코드는 정수(int)를 3개 담을 수 있는 상자를 만들겠다는 뜻이에요. 상자는 만들어졌지만, 안에는 아무것도 넣지 않았죠. 이렇게 만들면 각 칸은 기본값으로 초기화돼요. 정수(int)는 0, 실수(double)는 0.0, 불리언(boolean)은 false, 그리고 객체 타입은 null로 초기화됩니다. null은 '값이 없다'는 특별한 상태를 의미해요.
  2. 크기와 값 모두 지정해서 만들기:
    • String[] fruits = {"사과", "바나나", "딸기"};
    • 이 방법은 배열을 만들면서 동시에 값을 채워 넣는 거예요. 이렇게 하면 자바가 알아서 배열의 크기를 3으로 지정해 줍니다. 배열에 어떤 값이 들어갈지 미리 알고 있을 때 아주 편리해요.

배열의 크기: 한 번 정하면 끝! 📏

배열의 가장 큰 특징 중 하나는 '크기가 고정되어 있다'는 점이에요. int[] numbers = new int[3];처럼 한 번 크기를 3으로 정하면, 나중에 4번째 값을 추가하고 싶어도 불가능해요.

만약 배열의 크기를 늘리거나 줄여야 한다면, 다음과 같은 과정을 거쳐야 해요.

  1. 새로운, 더 큰 배열을 만든다.
  2. 기존 배열의 값들을 새로운 배열로 모두 복사한다.
  3. 새로운 배열에 추가하고 싶은 값을 넣는다.

이 과정은 생각보다 번거롭고 메모리 사용 측면에서도 효율적이지 않아요. 그래서 만약 크기가 변할 수 있는 데이터를 다루고 싶다면, 나중에 배울 ArrayList 같은 다른 자료구조를 사용하는 것이 더 좋아요.


배열과 메모리: 상자와 이름표 🧠

우리가 int[] numbers를 만들면, 변수 numbers는 배열이 담긴 메모리 주소(참조값)를 가리켜요. 그리고 그 주소에 실제 배열 상자가 만들어지는 거죠.

이것은 객체와 마찬가지로, numbers에 = (대입)을 할 때도 참조값만 복사된다는 뜻이에요.

 

int[] a = {1, 2, 3};
int[] b = a; // a의 참조값을 b에 복사

b[0] = 10; // b 배열의 0번째 값을 10으로 변경

System.out.println(a[0]); // 출력 결과는?

위 코드의 출력 결과는 10이 돼요. a와 b가 같은 배열 상자를 가리키고 있기 때문에, b를 통해 값을 바꾸면 a를 통해서도 바뀐 값을 확인할 수 있는 거죠. 처음에는 헷갈릴 수 있지만, 이 '참조값' 개념을 잘 이해하면 객체와 배열을 다루는 데 큰 도움이 될 거예요.

 

한 걸음 더 나아가기: 향상된 for문 🚀

위 for문도 좋지만, 자바에는 배열의 요소를 하나씩 순회할 때 더 편리한 향상된 for문(Enhanced For Loop)이 있습니다.

향상된 for문으로 코드 더 간결하게 만들기:

for (Student s : students) {
    // students 배열의 각 요소를 하나씩 꺼내 s 변수에 담아 사용
    System.out.println("이름:" + s.name + " 나이:" + s.age + " 성적:" + s.grade);
}

이 코드는 "students 배열의 각 Student 타입 요소를 하나씩 꺼내서 s라는 변수에 넣어라"는 의미입니다.
students[i]처럼 인덱스를 직접 사용하는 번거로움이 사라져 코드가 훨씬 읽기 쉬워졌죠.

최종 정리: 객체 + 배열 = 시너지! 🤝

오늘 배운 내용을 간단히 정리해 볼까요?

  • 객체: 학생 한 명의 데이터를 구조적으로 묶는 개별 관리 단위
  • 배열: 여러 객체를 한 번에 묶어서 다루는 집단 관리 단위

이 둘을 함께 사용하면, 데이터를 구조적으로 잘 정리하면서도 확장성 있는 코드를 작성할 수 있게 됩니다.

 

 

 

이 링크를 통해 구매하시면 제가 수익을 받을 수 있어요. 🤗

https://inf.run/b1SMF

 

 

 

728x90

+ Recent posts