Java | Spring
Java 배열과 메서드, 컬렉션: 프로그래밍 기초 이해하기
@leem
2025. 1. 14. 17:49
프로그래밍 입문자들을 위해 배열(Array), 메서드(Method), 컬렉션(Collection) 등 중요한 개념들을 알아보려 합니다. 비유와 예시를 통해 개념을 쉽게 이해할 수 있도록 써보았습니다.
1. 배열(Array)
배열: 같은 데이터 타입의 값들을 연속된 메모리 공간에 저장하는 고정 크기 자료구조입니다.
- 💡 영화관 좌석을 생각해 봅시다.
각 좌석에는 고유한 번호(인덱스)가 있고, 각 자리에 손님(데이터)이 앉습니다.
배열은 "같은 타입의 데이터"(예: 나이, 점수)만 저장할 수 있어요. - 인덱스는 0부터 시작합니다.
- 영화관 1번 좌석 → 배열의 0번 인덱스.
- 5번 좌석 → 배열의 4번 인덱스.
특징
- 크기가 고정: 배열은 처음에 공간 크기를 정하면 나중에 변경할 수 없어요.
- 빠른 데이터 접근: 인덱스를 사용해 원하는 데이터를 바로 찾을 수 있어요.
- 💡 "몇 번 좌석 손님이 누구인가요?" → 바로 확인 가능!
// 배열 선언 및 초기화
int[] scores = {90, 80, 70, 60}; // 4개의 정수를 저장
// 배열 값 출력
System.out.println(scores[0]); // 90 (첫 번째 값)
System.out.println(scores[3]); // 60 (마지막 값)
// 배열 값 변경
scores[2] = 75; // 세 번째 값을 75로 변경
System.out.println(scores[2]); // 75
📍 Tip: 배열은 데이터를 순서대로 저장하고 빠르게 접근할 때 유용하지만, 크기를 바꿀 수 없어서 데이터가 많아질 경우에는 List와 같은 컬렉션을 사용하는 게 좋음.
- 인덱스 대괄호 [] 0부터 시작, 배열 개수 size
📝 배열의 메모리 공간
배열은 참조타입 | 배열은 참조 타입으로, 데이터는 객체로 생성되고 메모리 번지를 저장. |
데이터 타입 | - 기본형: 값 자체를 저장 (정수형, 실수형, 논리형 등) |
- 참조형: 객체가 생성된 메모리 번지를 저장 (문자열, 배열 등) | |
Stack 영역 | - 변수들이 저장되는 메모리 공간. |
- 메서드 호출 시 프레임(Frame)이 저장되며, 메서드 종료 시 제거됩니다. | |
Heap 영역 | - 객체가 생성되는 메모리 공간. |
- 참조 타입 변수는 이 영역에 생성된 객체의 주소(번지)를 Stack에 저장. |
2. 메서드(Method)
메서드의 정의
메서드: 특정 작업을 수행하는 코드의 묶음이에요.
- 메서드는 입력값(매개변수)을 받아 작업을 처리하고, 결과값(반환값)을 제공합니다.
- 코드의 재사용성과 가독성을 높이기 위한 도구입니다.
- 💡 커피 자판기를 생각해 보세요.
- 버튼을 누르면(메서드 호출) → 커피가 만들어집니다(메서드 실행).
- 각 버튼은 필요한 재료(매개변수)를 사용해 결과(반환값)를 제공합니다.
구조
- 입력값(매개변수): 작업에 필요한 재료
- 코드 실행: 메서드 내부에서 작업 수행
- 출력값(반환값): 작업 결과
// 메서드 정의
int add(int num1, int num2) { // num1, num2: 매개변수
return num1 + num2; // 두 숫자를 더한 값을 반환
}
// 메서드 호출
int result = add(5, 7); // 5와 7을 더하는 메서드 호출
System.out.println(result); // 출력: 12
📍 Tip: 메서드를 사용하면 코드가 깔끔해지고, 같은 작업을 여러 번 반복할 때 편리.
3. 메서드 오버로딩(Overloading)
오버로딩: 같은 이름의 메서드를 매개변수 종류나 개수로 구분해 여러 번 정의하는 것. (매개변수만 다르게 정의)
- 💡 카페에서 "아메리카노"를 주문할 때, 크기(Small, Medium, Large)로 구분하는 것과 같아요.
// 메서드 오버로딩
void printInfo(String name) { // 이름 출력
System.out.println("이름: " + name);
}
void printInfo(String name, int age) { // 이름과 나이 출력
System.out.println("이름: " + name + ", 나이: " + age);
}
// 호출
printInfo("홍길동"); // 출력: 이름: 홍길동
printInfo("홍길동", 25); // 출력: 이름: 홍길동, 나이: 25
4. 컬렉션(Collection)
컬렉션: 데이터를 효율적으로 저장, 관리하기 위한 자료구조를 제공하는 도구
- 💡 다양한 서랍이 있는 서랍장을 생각해 보세요.
- List: 데이터를 줄 세워 저장. (중복 허용) 줄 세우는 서랍.
- Set: 중복을 허용하지 않는 서랍.
- Map: "키(Key)"와 "값(Value)"를 쌍으로 저장하는 서랍.
List 예제
List는 데이터를 순서대로 저장하며 중복을 허용합니다.
import java.util.ArrayList;
ArrayList<String> fruits = new ArrayList<>();
fruits.add("사과");
fruits.add("바나나");
fruits.add("사과"); // 중복 가능
System.out.println(fruits); // 출력: [사과, 바나나, 사과]
Set 예제
Set은 데이터를 순서 없이 저장하며 중복을 허용하지 않습니다.
import java.util.HashSet;
HashSet<String> uniqueFruits = new HashSet<>();
uniqueFruits.add("사과");
uniqueFruits.add("바나나");
uniqueFruits.add("사과"); // 중복 불가
System.out.println(uniqueFruits); // 출력: [사과, 바나나]
Map 예제
Map은 키(Key)와 값(Value) 쌍으로 데이터를 저장합니다.
import java.util.HashMap;
HashMap<String, String> userInfo = new HashMap<>();
userInfo.put("name", "홍길동");
userInfo.put("age", "25");
System.out.println(userInfo.get("name")); // 출력: 홍길동
5. 스택(Stack)과 큐(Queue)
스택(Stack): 후입선출(LIFO) 자료구조. 마지막에 넣은 데이터가 가장 먼저 나옵니다.
큐(Queue): 선입선출(FIFO) 자료구조. 먼저 들어간 데이터가 가장 먼저 나옵니다.
- 💡 스택: 접시를 쌓고 맨 위에서부터 꺼내는 방식 / 큐: 줄을 서서 차례대로 물건을 받는 모습.
스택과 큐 예제
import java.util.Stack;
import java.util.LinkedList;
import java.util.Queue;
// Stack 예제
Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
System.out.println(stack.pop()); // 출력: 2
// Queue 예제
Queue<Integer> queue = new LinkedList<>();
queue.add(1);
queue.add(2);
System.out.println(queue.poll()); // 출력: 1
6. 제네릭(Generic)
제네릭: 데이터를 저장할 타입을 동적으로 설정하는 문법이에요.
- 💡 다용도 통을 사용해 물, 쌀, 밀가루 등 무엇이든 담을 수 있는 것과 비슷.
제네릭 예제
import java.util.ArrayList;
// 정수를 담는 ArrayList
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(10);
numbers.add(20);
System.out.println(numbers); // 출력: [10, 20]
📌 summary
개념 | 설명 | 이해하기 |
배열(Array) | 같은 데이터 타입의 값을 연속된 메모리 공간에 저장하는 고정 크기 자료구조. | 💡 영화관 좌석: 좌석 번호(인덱스)를 통해 각 자리에 접근. 예: int[] scores = {90, 80, 70} → scores[1] = 80 |
메서드(Method) | 특정 작업을 수행하는 코드 묶음. 입력값(매개변수)을 받아 작업 처리 후 결과값(반환값)을 반환. |
💡 커피 자판기: 버튼(호출)을 누르면 커피(결과)가 나옴. 예: int add(int a, int b) { return a + b; } → add(3, 7) 결과: 10 |
메서드 오버로딩 | 같은 이름의 메서드를 매개변수 종류나 개수로 구분해 여러 번 정의. | 💡 카페 메뉴: 아메리카노(Small, Medium, Large)처럼 다양한 옵션. 예: void print(String msg) & void print(String msg, int n) |
컬렉션(Collection) | 데이터를 효율적으로 관리하기 위한 자료구조 도구. | 💡 서랍장: 데이터를 저장하는 방식에 따라 List, Set, Map으로 분류. 예: List는 순서, Set은 중복 금지, Map은 키-값 쌍 저장. |
스택(Stack) | 후입선출(LIFO): 마지막에 넣은 데이터가 먼저 나옴. | 💡 접시 쌓기: 맨 위 접시부터 꺼내는 방식. 예: stack.push(1) → stack.pop() 결과: 1 |
큐(Queue) | 선입선출(FIFO): 먼저 들어간 데이터가 먼저 나옴. | 💡 줄 서기: 먼저 선 사람이 먼저 서비스를 받음. 예: queue.add(1) → queue.poll() 결과: 1 |
제네릭(Generic) | 데이터를 저장할 타입을 동적으로 설정하는 문법. | 💡 다용도 통: 물, 쌀, 밀가루 등 무엇이든 담을 수 있음. 예: ArrayList<Integer> numbers = new ArrayList<>(); numbers.add(10); → [10] |