Java | Spring

Java 배열과 메서드, 컬렉션: 프로그래밍 기초 이해하기

@leem 2025. 1. 14. 17:49
 프로그래밍 입문자들을 위해 배열(Array), 메서드(Method), 컬렉션(Collection) 등 중요한 개념들을 알아보려 합니다. 비유와 예시를 통해 개념을 쉽게 이해할 수 있도록 써보았습니다.

 

1. 배열(Array)

배열: 같은 데이터 타입의 값들을 연속된 메모리 공간에 저장하는 고정 크기 자료구조입니다.
  • 💡 영화관 좌석을 생각해 봅시다.
    각 좌석에는 고유한 번호(인덱스)가 있고, 각 자리에 손님(데이터)이 앉습니다.
    배열은 "같은 타입의 데이터"(예: 나이, 점수)만 저장할 수 있어요.
  • 인덱스는 0부터 시작합니다.
    • 영화관 1번 좌석 → 배열의 0번 인덱스.
    • 5번 좌석 → 배열의 4번 인덱스.

특징

  1. 크기가 고정: 배열은 처음에 공간 크기를 정하면 나중에 변경할 수 없어요.
  2. 빠른 데이터 접근: 인덱스를 사용해 원하는 데이터를 바로 찾을 수 있어요.
    • 💡 "몇 번 좌석 손님이 누구인가요?" → 바로 확인 가능!
// 배열 선언 및 초기화
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)

메서드의 정의

메서드: 특정 작업을 수행하는 코드의 묶음이에요.
  • 메서드는 입력값(매개변수)을 받아 작업을 처리하고, 결과값(반환값)을 제공합니다.
  • 코드의 재사용성과 가독성을 높이기 위한 도구입니다.
  • 💡 커피 자판기를 생각해 보세요.
    1. 버튼을 누르면(메서드 호출) → 커피가 만들어집니다(메서드 실행).
    2. 각 버튼은 필요한 재료(매개변수)를 사용해 결과(반환값)를 제공합니다.

구조

  1. 입력값(매개변수): 작업에 필요한 재료
  2. 코드 실행: 메서드 내부에서 작업 수행
  3. 출력값(반환값): 작업 결과
// 메서드 정의
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]