본문 바로가기
  • 개발공부 및 일상적인 내용을 작성하는 블로그 입니다.
부트캠프/후기 챌린지

[멋쟁이사자처럼부트캠프] 백엔드 자바 21기 (2026.01.16)

by 방구석 취준생 2026. 2. 8.

* 해당 글은 백엔드 자바 강의이후 회고 글입니다.

https://bootcamp.likelion.net/school/kdt-backendj-21th

 

백엔드 부트캠프 21기: Java : 멋사 부트캠프

실전 스킬 기반 백엔드 개발자 취업 완벽 대비 교육

bootcamp.likelion.net

 

배열의 기본적인 개념

- 동일한 자료형의 데이터를 하나의 이름으로 관리하는 데이터 객체(data objectg) 이다.

- 배열은 같은 종류의 데이터를 여러개 선언하는 대신 하나의 변수로 나열형 상수를 인덱스를 통해 관리한다.

- 기본 데이터 형과 참조형 객체 배열을 포함하여 모든 자료형에서 사용 가능하다.

- 배열은 선언과 동시에 주소를 할당받아 요소로 관리되며 연속된 메모리 공간을 차지한다. 

- 가변 배열을 사용하면 크기가 다른 배열을 저장할 수 있다.

- System.arraycopy() 를 활용하면 배열을 복사할 수 있다.

- Arrays.sort(), Arrays.copyOf(), Arrays.fill(), Arrays.equals() 등 주요 메서드를 활용하면 배열을 효율적으로 관리할 수 있다.

- List.of(), Stream API, Pattern Matching for switch 등의 최신 JDK 21 기능을 활용하여 배열을 더욱 효율적으로 사용할 수 있다.

// Pattern Matching for switch (JDK 21)
// 객체가 특정 배열 타입인지 검사 가능
Object obj = new int[]{1,2,3};

switch(obj) {
	case int[] arr -> System.out.println("This is an int array: " + Arrays.toString(arr));
	default -> System.out.println("Unknown type");
}

 

배열(Array) 이 구현하는 인터페이스

배열은 java.lang.Clonable 인터페이스와 java.io.Serializable 인터페이스를 구현한다.

 

- Clonable 인터페이스

  • 클래스가 java.lang.Clonable 인터페이스를 구현한다는 것은 Object.clone() 메서드가 해당 클래스의 인스턴스를 필드 단위로 복사하는 것이 허용됨을 나타낸다.
  • Clonable 인터페이스를 구현하지 않는 인스턴스에서 Object 클래스의 clone 메서드를 호출하면 CloneNotSupportedException 예외가 발생한다.
  • 관례적으로 이 인터페이스를 구현하는 클래스는 Object.clone (protected) 메서드를 공개(public) 메서드로 재정의 해야 한다.
  • 이 인터페이스 자체에는 clone 메서드가 포함되어 있지 않다는 것을 유의해야 한다. 

 

- clone() 메서드 활용

int [] ia1 = {1,2};
int [] ia2 = ia1.clone(); // ia1 배열 복사
int[] ia3 = ia1;

System.out.println((ia1 == ia2)); //false
System.out.println((ia1 == ia3)); //true

 

- clone() 메서드의 설명을 보면 알 수 있듯 이 메서드를 배열 객체에 대해 실행했을 경우 해당 배열의 메모리 주소값을 그대로 참조해서 복사하는 것이 아닌, 해당 배열의 내용을 그대로 복사한 새로운 배열 객체를 만들어서 반환해주므로(new) 위의 코드에서 ia1 에 대해 clone() 메서드를 통해 생성한 ia2 배열은 ia1 과 시작 주소가 서로 다른 새로운 배열 객체가 된다. 그렇기 때문에 ia1 == ia2 의 결과는 false 가 반환된다. 

 

리플렉션을 이용해 객체의 타입 정보를 확인해보자.

아래의 코드를 실행시켜 보자.

int[] ia = new int[3];
System.out.println(ia.getClass());
System.out.println(ia.getClass().getSuperclass());
for(Class<?> c : ia.getClass().getInterfaces())
	System.out.println("Superinterface : " + c);

 

- Class<? extends T> java.lang.Object.getClass() : 객체가 어떤 클래스의 인스턴스인지 반환한다.
- Class<? super T> java.lang.Class.getSuperclass() : 해당 클래스의 부모 클래스를 반환한다.

- Class<?>[] java.lang.Class.getInterfaces() : 해당 클래스가 구현하고 있는 인터페이스 목록을 반환한다.

 

출력은 아래와 같이 나오는 것을 확인할 수 있다.

class [I
class java.lang.Object
Superinterface : interface java.lang.Cloneable
Superinterface : interface java.io.Serializable

 

 

번외) ArrayList

- 기본적으로 배열은 항상 배열의 길이를 정하고 시작한다. 처음 만들어질때부터 정해진 길이가 존재하는 정적인 자료구조이다.

- 그렇기 때문에 중간에 데이터가 더 필요하거나 중간에 데이터가 삭제되더라도 배열의 길이를 변경할 수는 없기 때문에 그에 맞는 길이를 가지고 있는 배열을 새로 선언해야 한다.

- 이러한 단점을 보완하기 위해 자바에서는 객체 배열을 좀 더 쉽게 사용할 수 있도록 ArrayList 를 제공한다.

- ArrayList 외에도 배열을 쉽게 사용할 수 있도록 제공되는 클래스들이 있지만 ArrayList 가 가장 효율이 높기 때문에 많이 사용된다.

 

* 주요 메서드

  • boolean add(E e) : 요소 하나를 배열에 추가한다. E는 리스트 요소의 자료형을 의미한다.
    • add() 메서드를 이용하면 배열 길이와 상관없이 객체를 추가할 수 있다.
  • int size() : 배열에 추가된 요소 전체 갯수를 반환한다.
  • E get(int index) : 배열의 index 위치에 있는 요소 값을 반환한다.
  • E remove(int index) : 배열의 index 위치에 있는 요소 값을 제거하고 그 값을 반환한다.
    • remove() 메서드를 통해 배열 중간의 어떤 요소가 제거되더라도 그 다음 요소 값을 하나씩 앞으로 이동하는 코드가 이미 내부적으로 구현되어 있다.
  • boolean isEmpty() : 배열이 비어있는지 확인한다. 

사용 예시

- Book.java

public class Book {
    private String bookName;
    private String author;
    
    public Book() {}
    
    public Book(String bookName, String author) {
        this.bookName = bookName;
        this.author = author;
    }
    
    public String getBookName(){
        return bookName;
    }
    
    public void setBookName(String bookName){
        this.bookName = bookName;
    }
    
    public String getAuthor(){
        return author;
    }
    
    public void setAuthor(String author){
        this.author = author;
    }
    
    public void showBookInfo(){
        System.out.println(bookName + "," + author);
    }
}

 

- ArraysListTest.java

import java.util.ArrayList;

public class ArrayListTest{
    public static void main(String[] args){
        ArrayList<Book> library = new ArrayList<Book>();
        
        library.add(new Book("태백산맥", "조정래"));
        library.add(new Book("데미안", "헤르만 헤세"));
        library.add(new Book("토지", "박경민"));
        library.add(new Book("어린왕자", "생텍쥐페리"));
        
        for(int i = 0; i < library.size(); i++){
            Book book = library.get(i);
            book.showBookInfo();
        }
        
        System.out.println();
        
        System.out.println("===향상된 for문 사용===");
        for(Book book : library){
            book.showBookInfo();
        }
    }
}