Java 자바의 기초 (배열, null, ArrayList, Map)

개발일지

자바를 학습하며 객체 지향 프로그래밍에 대한 이해가 조금씩 쌓이고 있으며, 더 많은 연습을 통해 익숙해지기 위해서 노력하고 있습니다. 특히, 객체 지향적인 코드 작성을 위해 절차 지향적인 습관에서 벗어나는 것이 중요하다고 생각합니다. 지금까지 절차 지향적으로 작성한 코드들을 객체 지향적으로 리팩토링하여 변화된 코드 구조와 패턴에 익숙해지려고 합니다.

개발일지를 통해 이러한 학습과 경험을 기록하는 것이, 더 좋은 개발자로 성장하기 위해 도움이 될 것이기에 앞으로도 지속적으로 개발일지를 작성하며 과정을 기록해 나가려 합니다.

이번에 정리할 내용은 자바의 배열, null, ArrayList, Map 입니다. 관련 내용들을 각 주제별로 더 자세히 블로그에 업데이트 할 예정이고, 이에 앞서 개발일지를 통해 주요 내용들을 간단하게 정리해보려 합니다.

배열

배열 선언 방법

Java
데이터타입[] 배열변수명 = new 데이터타입[갯수];
Java

배열 선언과 생성

배열을 선언하려면 해당 데이터 타입의 이름 뒤에 대괄호([])를 사용합니다. 배열을 생성할 때는 new 키워드를 사용하고, 배열의 크기를 지정합니다.

Java
// 정수형 배열 선언
int[] integerArray;

// 크기가 5인 정수형 배열 생성
integerArray = new int[5];
Java

배열 선언과 동시에 생성

선언과 동시에 배열을 생성할 수 있습니다.

Java
// 실수형 배열 선언과 동시에 크기가 3인 배열 생성
float[] floatArray = new float[3];
Java

배열 초기화

배열은 생성 후에 각 요소에 대한 초기값을 지정할 수 있습니다.

Java
// 정수형 배열 생성과 초기화
int[] numbers = {1, 2, 3, 4, 5};

// 문자열 배열 생성과 초기화
String[] names = {"Alice", "Bob", "Charlie"};
Java

배열 요소에 접근

배열의 각 요소에는 인덱스(index)를 사용하여 접근합니다. 인덱스는 0부터 시작합니다.

Java
// 배열의 요소에 접근
int firstNumber = numbers[0];  // 첫 번째 요소
String secondName = names[1];  // 두 번째 요소
Java

배열 길이

배열의 길이는 length 속성을 사용하여 얻을 수 있습니다.

Java
// 배열의 길이
int arrayLength = numbers.length;
Java

배열과 반복문

반복문을 사용하여 배열의 모든 요소에 접근할 수 있습니다.

Java
// for문을 사용한 배열 요소 출력
for (int i = 0; i < numbers.length; i++) {
    System.out.println(numbers[i]);
}

// 향상된 for문(enhanced for loop) 사용
for (int number : numbers) {
    System.out.println(number);
}
Java

배열 복사

System.arraycopy()

System.arraycopy() 메서드는 다음과 같은 형식을 갖습니다:

Java
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
Java

이 메서드는 배열 또는 배열과 비슷한 자료 구조에서 요소를 복사하는 데 사용됩니다. 각 매개변수의 역할은 다음과 같습니다:

  1. src: 복사할 원본 배열 또는 배열과 비슷한 자료 구조입니다.
  2. srcPos: 원본 배열에서 복사를 시작할 위치(index)입니다.
  3. dest: 복사한 요소를 저장할 대상 배열 또는 배열과 비슷한 자료 구조입니다.
  4. destPos: 대상 배열에서 복사(붙여넣기)를 시작할 위치(index)입니다.
  5. length: 복사할 요소의 개수입니다.

2차원 배열

2차원 배열은 행과 열의 두 차원을 가지며, 각 요소는 두 개의 인덱스로 참조됩니다.

Java
// 2차원 배열 선언과 초기화
int[][] twoDArray = new int[3][4];

// 2차원 배열에 값 할당
twoDArray[0][0] = 1;
twoDArray[0][1] = 2;
// ...

// 2차원 배열 요소 접근
int value = twoDArray[1][2];
Java

2차원 배열 초기화

2차원 배열은 중괄호를 사용하여 초기화할 수 있습니다.

Java
// 2차원 배열 초기화
int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};
Java

null

자바에서 참조 타입 변수는 해당 타입의 객체를 참조하는 데 사용됩니다. 이러한 변수들은 객체의 주소를 저장하며, 그 주소를 통해 객체에 접근하고 조작할 수 있습니다. 그런데 때로는 어떠한 이유로 인해 객체를 가리키지 않아야 하는 경우가 있습니다. 이때 참조 타입 변수는 null 값을 가지게 됩니다.

  • null은 참조 변수가 어떠한 객체도 참조하지 않음을 나타내는 특별한 값입니다.
  • null은 객체의 주소를 나타내는 값이 아니라, “아무것도 참조하지 않음”을 나타냅니다.
  • 참조 변수가 null을 가지면, 그 변수는 어떤 객체도 가리키지 않음을 의미합니다.
  • null이 할당된 참조 변수를 사용하려고 하면 NullPointerException이 발생합니다.
참조 타입 변수 선언과 null

자바에서 참조 타입 변수를 선언만 하면 해당 변수는 자동으로 null로 초기화됩니다. 따라서 명시적으로 초기화하지 않아도 변수는 null 값을 가지게 됩니다. 이는 참조 변수가 아무런 객체도 가리키지 않음을 나타냅니다.

ArrayList

ArrayList는 자바에서 제공되는 동적 배열 기반의 컬렉션 클래스 중 하나입니다. 크기가 동적으로 조절되며, 배열과 유사하지만 배열과 달리 크기를 자유롭게 조절할 수 있습니다. ArrayList는 java.util 패키지에 속해 있습니다.

ArrayList의 주요 특징

  1. 크기 동적 조절: ArrayList는 크기가 가변적으로 조절되므로 요소를 추가하거나 삭제할 때 크기를 신경쓰지 않아도 됩니다.
  2. 제네릭 타입 지원: 제네릭을 사용하여 타입 안정성을 보장하므로 다양한 타입의 요소를 저장할 수 있습니다.
  3. 배열과 유사한 인덱스 사용: ArrayList는 배열과 마찬가지로 인덱스를 사용하여 요소에 직접 접근할 수 있습니다.

Wrapper 클래스(래퍼 클래스)

ArrayList에서 Wrapper 클래스(래퍼 클래스)는 기본 데이터 타입을 객체로 감싸는 역할을 합니다. 자바에서는 기본 데이터 타입(primitive data type)과 객체를 구분하기 때문에, 기본 데이터 타입을 객체로 다루어야 하는 상황에서 Wrapper 클래스가 사용됩니다. Wrapper 클래스는 각 기본 데이터 타입에 대응되는 클래스로 구성되어 있습니다.

아래는 기본 데이터 타입과 그에 대응하는 Wrapper 클래스의 목록입니다:

  • byte: Byte
  • short: Short
  • int: Integer
  • long: Long
  • float: Float
  • double: Double
  • char: Character
  • boolean: Boolean

ArrayList의 선언과 초기화

Java
import java.util.ArrayList;

// Integer 타입을 저장하는 ArrayList 선언
ArrayList<Integer> numbers = new ArrayList<>();

// 초기값을 가진 ArrayList 선언
ArrayList<String> names = new ArrayList<>(Arrays.asList("Alice", "Bob", "Charlie"));
Java

ArrayList 클래스 메서드들

ArrayList 클래스는 다양한 메서드를 제공하여 리스트에 데이터를 추가, 삭제, 조회하는 등의 작업을 수행할 수 있습니다.

add() 메서드
  • 리스트에 요소를 추가합니다.
  • add(E element) 또는 add(int index, E element) 형태로 사용 가능합니다.
get() 메서드
  • 리스트에서 지정된 위치의 요소를 반환합니다.
  • get(int index) 형태로 사용합니다.
set() 메서드
  • 리스트에서 지정된 위치의 요소를 새로운 값으로 대체합니다.
  • set(int index, E element) 형태로 사용합니다.
remove() 메서드
  • 리스트에서 지정된 위치의 요소를 삭제합니다.
  • remove(int index) 형태로 사용하면 해당 위치의 요소를 삭제하고, remove(Object o) 형태로 사용하면 주어진 객체와 일치하는 첫 번째 요소를 삭제합니다.
size() 메서드
  • 리스트의 크기(요소의 개수)를 반환합니다.
isEmpty() 메서드
  • 리스트가 비어있는지 여부를 반환합니다. 비어있으면 true, 아니면 false를 반환합니다.
clear() 메서드
  • 리스트의 모든 요소를 제거하여 비웁니다.
contains() 메서드
  • 리스트에 특정 요소가 포함되어 있는지 여부를 반환합니다.
  • contains(Object o) 형태로 사용합니다.
indexOf() 메서드
  • 리스트에서 주어진 객체의 첫 번째 등장 위치를 반환합니다. 해당 객체가 없으면 -1을 반환합니다.
  • indexOf(Object o) 형태로 사용합니다.
toArray() 메서드
  • 리스트의 요소들을 배열로 변환합니다.
  • toArray() 메서드를 사용하거나, toArray(T[] a) 형태로 명시적으로 배열의 타입을 지정할 수 있습니다.

Map

Map(맵)은 키-값 쌍으로 이루어진 데이터를 저장하는 자료구조입니다. Java에서는 java.util 패키지에서 Map 인터페이스를 제공하며, 이를 구현한 다양한 클래스들이 있습니다. 이들 클래스는 각각의 특징과 용도에 따라 선택하여 사용할 수 있습니다.

Map의 주요 특징

  1. Key-Value Pair (키-값 쌍): Map은 각각의 요소가 키와 값의 쌍으로 이루어져 있습니다. 각 키는 유일해야 하며, 키를 통해 해당 값을 검색할 수 있습니다.
  2. 키의 중복 불가능성: 모든 Map 구현에서 키는 중복될 수 없습니다. 각 키는 고유해야 합니다.
  3. 순서의 보장 여부: 일부 Map 구현은 키-값의 삽입 순서를 유지하지만, 다른 일부는 그렇지 않을 수 있습니다.
  4. 값의 중복 허용: 하나의 키에 대해 여러 개의 값이 매핑될 수 있습니다.

주요 Map 인터페이스 구현체

  1. HashMap:
    • 키-값 쌍을 해시 테이블에 저장합니다.
    • 순서를 유지하지 않습니다.
  2. TreeMap:
    • 키-값 쌍을 정렬된 순서대로 저장합니다.
    • 키에 대한 정렬 기준을 제공할 수 있습니다.
  3. LinkedHashMap:
    • 삽입 순서나 액세스 순서를 유지합니다.
    • 특히, 삽입 순서대로 순회하거나 최근에 액세스한 순서대로 순회할 수 있습니다.
  4. HashTable:
    • HashMap과 유사하지만 동기화된 메서드를 가지고 있습니다.
    • null 키나 값이 허용되지 않습니다.

주요 Map 인터페이스 메서드

  1. put(K key, V value):
    • 지정된 키와 값으로 맵에 새로운 항목을 추가합니다.
  2. get(Object key):
    • 지정된 키에 해당하는 값을 반환합니다.
  3. remove(Object key):
    • 지정된 키와 연결된 맵의 항목을 제거합니다.
  4. containsKey(Object key):
    • 맵이 지정된 키를 포함하고 있는지 여부를 반환합니다.
  5. containsValue(Object value):
    • 맵이 지정된 값을 포함하고 있는지 여부를 반환합니다.
  6. keySet():
    • 맵의 모든 키를 Set으로 반환합니다.
  7. values():
    • 맵의 모든 값을 Collection으로 반환합니다.
  8. entrySet():
    • 맵의 모든 키-값 쌍을 Set으로 반환합니다.

예제

Java
import java.util.HashMap;
import java.util.Map;

public class MapExample {
    public static void main(String[] args) {
        // HashMap 생성
        Map<String, Integer> scores = new HashMap<>();

        // 값 추가
        scores.put("Alice", 90);
        scores.put("Bob", 85);
        scores.put("Charlie", 95);

        // 값 조회
        int aliceScore = scores.get("Alice");
        System.out.println("Alice's score: " + aliceScore);

        // 값 수정
        scores.put("Bob", 88);

        // 값 제거
        scores.remove("Charlie");

        // 전체 맵 순회
        for (Map.Entry<String, Integer> entry : scores.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}
Java

이 예제에서는 HashMap을 사용하여 학생들의 이름과 점수를 저장하고, 값을 조회하고 수정하며 제거하는 등의 작업을 수행합니다.

마무리

이번 학습을 통해 자바의 배열, null, ArrayList, Map에 대한 기초를 다졌습니다. 객체 지향 프로그래밍에 대한 이해를 높이고, 코드를 리팩토링하며 더 나은 습관을 기르고 있습니다. 이제까지 학습한 내용을 블로그에 더 자세히 업데이트할 예정이며, 지속적으로 개발일지를 작성하여 성장과 경험을 기록할 계획입니다.

Leave a Comment