'(๑_๑)' 카테고리의 다른 글
[스크]이제 삼겹살 제대로 먹게 된 미국인들 (0) | 2025.09.03 |
---|---|
[스크랩]또 미쳐버린 굿즈 뽑아낸 국립중앙박물관 (0) | 2025.09.02 |
[스크랩] 최근 <폭군의 셰프> 감독의 필모그래피.jpg (0) | 2025.08.27 |
[스크랩] 강아지 만져줘요 신호 (2) | 2025.08.27 |
[스크랩] 점점 심각하다는 1980년대와 요즘의 옷 구매량 (1) | 2025.08.26 |
[스크]이제 삼겹살 제대로 먹게 된 미국인들 (0) | 2025.09.03 |
---|---|
[스크랩]또 미쳐버린 굿즈 뽑아낸 국립중앙박물관 (0) | 2025.09.02 |
[스크랩] 최근 <폭군의 셰프> 감독의 필모그래피.jpg (0) | 2025.08.27 |
[스크랩] 강아지 만져줘요 신호 (2) | 2025.08.27 |
[스크랩] 점점 심각하다는 1980년대와 요즘의 옷 구매량 (1) | 2025.08.26 |
안녕하세요! 제 개발 블로그에 오신 것을 환영합니다. 🧑💻 지난번에는 클래스와 객체, 인스턴스에 대해 붕어빵을 굽는 것에 비유해서 재미있게 알아봤었죠.
오늘은 이렇게 만든 객체들을 더 효율적으로 관리하고 활용하는 방법에 대해 이야기해 보려고 합니다.
바로 배열(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만큼 반복하기 때문에, 학생이 추가되어도 출력 코드를 수정할 필요가 없습니다. 아주 깔끔하고 효율적이죠!
배열을 만드는 방법은 크게 두 가지로 나눌 수 있어요.
배열의 가장 큰 특징 중 하나는 '크기가 고정되어 있다'는 점이에요. int[] numbers = new int[3];처럼 한 번 크기를 3으로 정하면, 나중에 4번째 값을 추가하고 싶어도 불가능해요.
만약 배열의 크기를 늘리거나 줄여야 한다면, 다음과 같은 과정을 거쳐야 해요.
이 과정은 생각보다 번거롭고 메모리 사용 측면에서도 효율적이지 않아요. 그래서 만약 크기가 변할 수 있는 데이터를 다루고 싶다면, 나중에 배울 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문(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
[JAVA_인프런] 1. 클래스란 무엇인가? (0) | 2025.09.02 |
---|---|
[JAVA_인프런] JAVA를 다시 시작해보자 (3) | 2025.08.27 |
출처: https://theqoo.net/square/3897381881
솥뚜껑삼겹살+곱창에
가운데 돼지기름으로 김치 구워먹기...
그리고 볶음밥 후식까지 야무지게 제대로 배워감...
[스크랩]맥도날드 지역명 버거 특이점 (0) | 2025.09.04 |
---|---|
[스크랩]또 미쳐버린 굿즈 뽑아낸 국립중앙박물관 (0) | 2025.09.02 |
[스크랩] 최근 <폭군의 셰프> 감독의 필모그래피.jpg (0) | 2025.08.27 |
[스크랩] 강아지 만져줘요 신호 (2) | 2025.08.27 |
[스크랩] 점점 심각하다는 1980년대와 요즘의 옷 구매량 (1) | 2025.08.26 |
[스크랩]맥도날드 지역명 버거 특이점 (0) | 2025.09.04 |
---|---|
[스크]이제 삼겹살 제대로 먹게 된 미국인들 (0) | 2025.09.03 |
[스크랩] 최근 <폭군의 셰프> 감독의 필모그래피.jpg (0) | 2025.08.27 |
[스크랩] 강아지 만져줘요 신호 (2) | 2025.08.27 |
[스크랩] 점점 심각하다는 1980년대와 요즘의 옷 구매량 (1) | 2025.08.26 |
김영한의 '실전 JAVA' 1강: 클래스, 다시 첫 걸음 떼기 👣
오랜만에 책상에 앉아 코드를 다시 마주합니다. 비전공자 직장인으로서 업무와는 거리가 멀었던 자바를 다시 시작하며, 김영한 님의 '실전 자바' 강의를 택했습니다. 첫 강의의 주제는 자바의 가장 기본적인 구성 요소인 클래스(Class)였습니다.
잊고 지냈던 개념들을 다시 복기하며, 단순한 지식을 넘어 실제 프로그램을 설계하는 관점을 다시 한번 복기해보도록 하겠습니다.
클래스를 해당 강의에선 이해하기 쉽게 두 가지 비유로 설명합니다.
자바를 처음 배울 때 가장 헷갈리는 개념이 바로 객체(Object)와 인스턴스(Instance)입니다.
Car car1 = new Car();라는 코드는 Car라는 설계도(클래스)를 바탕으로 new 키워드를 사용해 메모리에 실제 자동차(인스턴스)를 생성하고, 그 인스턴스를 car1이라는 변수가 가리키도록 하는 과정입니다. 여기서 car1은 참조 변수이며, 실제 객체는 메모리의 어딘가에 저장되어 있습니다. 마치 '내 차가 주차된 주차장 번호'를 기억하고 있는 것과 같습니다.
자바에서는 변수가 선언된 위치에 따라 그 성격이 완전히 달라집니다. 이 차이를 명확히 아는 것이 향후 발생할 오류를 줄이는 데 큰 도움이 됩니다.
지역 변수는 메서드가 끝나는 즉시 메모리에서 사라지므로, 사용하려는 시점에 값이 존재하지 않을 수 있다. 따라서 반드시 초기화해야합니다. 이 차이를 인지하는 것만으로도 실수를 방지할 수 있습니다.
이제 이 개념들을 코드로 어떻게 구현하는지 살펴볼게요. Student라는 클래스를 만들고, 학생 객체들을 생성해볼까요?
Student student1;
이 코드는 student1이라는 변수(그릇)를 만들겠다는 뜻이에요. 이 그릇에는 Student 타입의 객체만 담을 수 있어요. 마치 int 변수가 정수만 담는 것처럼요.
student1 = new Student();
이 부분이 바로 붕어빵 틀(Student 클래스)로 실제 붕어빵(객체)을 만드는 과정이에요. new 키워드는 "새로운 객체를 만들어!"라고 명령하는 마법의 주문이랍니다. 이렇게 객체를 만들면, 자바는 그 객체가 메모리 어디에 있는지 알려주는 참조값(주소)을 반환해줘요.
Student student1 = new Student();
이 코드를 한 번에 실행하면, new Student()로 만들어진 객체의 주소값(x001이라고 가정해볼게요)이 student1 변수에 저장돼요. 이제 student1이라는 이름으로 이 주소에 있는 객체에 접근할 수 있게 된 거죠.
student1.name = "학생1"; student1.age = 15; student1.grade = 90;
이제 student1 변수에 있는 주소값으로 실제 객체에 찾아가서 값을 채워 넣을 수 있어요. 변수 이름 뒤에 . (점)을 찍으면 해당 객체의 속성에 접근할 수 있답니다.
마치 student1이라는 이름표를 보고, '이 붕어빵의 속 재료는 팥이야!'라고 정해주는 것과 같아요.
우리가 만든 객체들이 메모리에서 어떻게 저장되는지 궁금하시죠?
Student student1 = new Student(); Student student2 = new Student();
위 코드를 실행하면, 메모리에는 두 개의 독립적인 Student 객체가 만들어져요. student1은 x001이라는 주소에,
student2는 x002라는 또 다른 주소에 저장되죠. 서로 주소값이 다르기 때문에 student1에 값을 넣는다고 student2의 값이 바뀌지 않아요.
코드로 직접 확인해볼까요? System.out.println(student1); System.out.println(student2);
출력 결과: class1.Student@7a81197d
class1.Student@2f2c9b19
보이시나요? @ 뒤에 있는 이상한 숫자들이 바로 객체의 고유한 주소값이에요. 이렇게 주소값이 다르기 때문에 두 객체는 서로 다른 존재로 인식된답니다.
오늘 배운 내용을 한 문장으로 정리해 드릴게요.
클래스는 객체를 만들기 위한 설계도이고, 이 설계도를 기반으로 실제로 만들어진 실체를 객체 또는 인스턴스라고 부릅니다.
바쁜 업무에 치이다 보면 자바의 기초 개념들은 쉽게 잊혀집니다. 하지만 1강을 들으며 다시 한번 깨달았습니다. 탄탄한 기초 위에 견고한 건물이 세워지듯, 명확한 기초 개념이 있어야 복잡한 프로그램을 만들 수 있다는 것을요. 클래스에 대한 깊이 있는 이해는 단순히 코딩을 넘어, 객체지향이라는 거대한 설계를 이해할 수 있는 첫걸음입니다.
이 작은 공부가 결국 비즈니스 문제를 해결하고, 반복적인 업무를 자동화하는 데 필요한 논리적 사고의 밑거름이 될 것입니다.
저처럼 비전공자이신 분들도 김영한 님의 강의를 통해 자바의 세계를 다시 만나보시길 강력히 추천합니다.
이 링크를 통해 구매하시면 제가 수익을 받을 수 있어요. 🤗
https://inf.run/b1SMF
[JAVA_인프런] 2. 배열의 도입 (0) | 2025.09.03 |
---|---|
[JAVA_인프런] JAVA를 다시 시작해보자 (3) | 2025.08.27 |
출처: https://www.dmitory.com/issue/378902267
약 25년전에 데뷔해서 아직도 히트작 생성해냄
드덕들한테는 유명한 장태유임
특히 사극 잘함 근데 현대극도 잘함
https://cafe.daum.net/subdued20club/WU3B/1
사회성 떨어지는 댓 금지
문제시 내 말이 그냥 맞음
[스크]이제 삼겹살 제대로 먹게 된 미국인들 (0) | 2025.09.03 |
---|---|
[스크랩]또 미쳐버린 굿즈 뽑아낸 국립중앙박물관 (0) | 2025.09.02 |
[스크랩] 강아지 만져줘요 신호 (2) | 2025.08.27 |
[스크랩] 점점 심각하다는 1980년대와 요즘의 옷 구매량 (1) | 2025.08.26 |
[스크랩] 1991년 비디오게임에 비트코인 로고 등장 (0) | 2025.08.25 |