BlueNyang
[멀티캠퍼스] 풀스택 개발자 아카데미 (9) - Java(3)
Java 풀스택 아카데미
· 멀티캠퍼스 JAVA 풀스택 개발자 아카데미 6회차 (9편)

[멀티캠퍼스] 풀스택 개발자 아카데미 (9) - Java(3)

BlueNyangBlueNyang
·
·
약 3분
·
# 부트캠프후기# 멀티캠퍼스it부트캠프# [현대이지웰] JAVA 풀스택 개발자 아카데미 6회차# multi-thread# immutability# regex# date-time
시리즈·멀티캠퍼스 JAVA 풀스택 개발자 아카데미 6회차(30개의 글)
  • ···
  • 8.[멀티캠퍼스] 풀스택 개발자 아카데미 (8) - Java(2)
  • 9.[멀티캠퍼스] 풀스택 개발자 아카데미 (9) - Java(3)현재
  • 10.[멀티캠퍼스] 풀스택 개발자 아카데미 (10) - SQL
  • ···

1.Thread - 동시에 처리하기

현대의 SW는 여러 작업을 동시에 처리하는 것이 기본이다. 동영상을 재생하면서 채팅을 할 수 있는 것 처럼 말이다.

Java에서는 이를 멀티쓰레딩(Multi-Threading) 을 통해 동시성을 구현할 수 있다.

1.1.Process와 Thread

  • Process: OS(운영체제;Operating System)에서 실행 중인 하나의 애플리케이션(프로그램)을 의미한다. 각 프로세스는 자신만의 독립된 메모리 공간을 가진다.
  • Thread: 프로세스 내에서 실제 작업을 수행하는 가장 작은 단위를 말한다. 하나의 프로세스는 여러 개의 쓰레드를 가질 수 있으며, 같은 프로세스 내의 쓰레드들은 메모리 자원을 공유한다.

즉, Process가 하나의 '식당'이고, Thread는 그 안에서 각자 업무를 담당하는 직원(요리사, 카운터 직원, 웨이터 등)과 같다. 여러 직원이 협력하여 식당의 작업을 효율적으로 처리하는 것이다.

멀티-프로세스와-멀티-쓰레드-개념-비교
멀티-프로세스와-멀티-쓰레드-개념-비교

1.2.Java의 Thread 생성

모든 자바 프로그램은 main() 메소드를 실행하는 Main Thread와 함께 시작된다. 우리는 이 메인 쓰레드 외에 별도의 작업 쓰레드를 만들고, 여러 작업을 병렬로 실행할 수 있다.

1.2.1.방법1 - Thread 상속

Thread클래스를 직접 상속받고, 쓰레드가 수행할 작업은 run() 메소드 안에 재정의(@Override)하는 방식이다.

java
// MyThread.java
public class MyThread extends Thread {
  @Override
  public void run() {
    for (int i = 0; i < 5; i++) {
      System.out.println(getName() + ": " + i);
      try {
        Thread.sleep(500); // 0.5초 대기
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

// ThreadExtendMain.java
public class ThreadExtendMain {
  public static void main(String[] args) {
    MyThread t1 = new MyThread();
    t1.start(); // run Thread

    System.out.println("Main Thread End");
  }
}

1.2.2.방법2 - Runnable 인터페이스 구현

Runnable Interface를 직접 구현하여 작업 내용을 정의하고, 이객체를 Thread 생성자에 전달하는 방식으로, Java는 다중 상속을 지원하지 않기 때문에, 다른 클래스를 상속해야 할 경우를 상정하여 Runnableimplements하는 것이 더 유연하고 일반적이다.

Thread-상속과-Runnable-구현-방식의-차이점
Thread-상속과-Runnable-구현-방식의-차이점
java
// MyRunnable.java
public class MyRunnable implements Runnable {
  @Override
  public void run() {
    for (int i = 0; i < 5; i++) {
      System.out.println(Thread.currentThread.getName() + ": " + i);
      try {
        Thread.sleep(500); // 0.5초 대기
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}

// RunnableImplementMain.java
public class RunnableImplementMain {
  public static void main(String[] args) {
    Runnanble task = new MyRunnable();
    Thread t2 = new Thread(task);
    t2.start();

    System.out.println("Main Thread End");
  }
}

2.Java 기본 API 클래스

API(Application Programming Interface) 는 개발을 돕기 위해 미리 만들어진 클래스와 기능들의 모음이다. Java는 방대한 양의 기본 API가 있으며, 특히 java.lang 패키지는 import 선언 없이 자동으로 사용할 수 있는 핵심 클래스들을 담고 있다.

2.1.String 클래스 - 문자열

String 은 Java에서 문자열을 다루는 가장 기본적이고 중요한 클래스로, String 객체는 Immutability(불변성) 이라는 중요한 특징을 가진다. 한번 생성된 String 객체의 내용은 변경될 수 없고, 문자열을 수정하는 메소드를 호출하면 항상 새로운 String 객체가 생성된다.

String-객체의-불변성과-메모리-공유
String-객체의-불변성과-메모리-공유
java
public class StringMain {
  public static void main(String[] args) {
    String homepage = "https://www.bluenyang.kr/";

    // equals(): "내용" 비교
    System.out.println(homepage.equals("test")); // false

    // indexOf() + substring() 자르기
    int idx = homepage.indexOf("bluenyang.kr");
    String domain = homepage.substring(idx);
    System.out.println(domain); // "bluenyang.kr/"

    // split(): 특정 문자를 기준으로 분리하여 배열로 만듦
    String[] parts = homepage.split("/");
    System.out.println(parts[0]); // https:
    System.out.println(parts[2]); // bluenyang.kr
  }
}

2.2.Wrapper 클래스

Java의 컬렉션 프레임워크나 제네릭에서는 객체 타입만 다룰 수 있다. 이때, int, double과 같은 기본 타입(Primitive Type) 을 객체처럼 다루기 위해서는 Wrapper Class를 사용해야 한다.

  • Boxing: 기본 타입값을 Wrapper 객체로 감싸는 과정 (int -> Integer)
  • Unboxing: Wrapper 객체에서 기본 타입 값을 추출하는 과정 (Integer -> int)
  • Auto-boxing: Java 5 부터는 컴파일러가 자동으로 Boxing/Unboxing을 처리함
기본타입과-Wrapper-Class-매칭-표
기본타입과-Wrapper-Class-매칭-표
java
import java.util.ArrayList;
import java.util.List;

public class WrapperMain {
    public static void main(String[] args) {
        // 제네릭에는 기본 타입 대신 래퍼 클래스 사용
        List<Integer> numbers = new ArrayList<>();

        // Auto-boxing: 기본 타입 int가 자동으로 Integer 객체로 변환
        numbers.add(10);
        numbers.add(20);

        // Auto-unboxing: Integer 객체가 자동으로 int 타입으로 변환
        int sum = numbers.get(0) + numbers.get(1);

        System.out.println("리스트의 합: " + sum); // 30
    }
}

2.3.Arrays Class - 배열

Arrays는 배열을 정렬, 검색 및 복사 등 배열을 더 쉽게 사용/조작할 수 있도록 static 메소드를 제공하는 유틸리티 클래스이다.

java
import java.util.Arrays;

public class ArraysMain {
    public static void main(String[] args) {
        int[] scores = {99, 85, 92, 76, 88};

        // Arrays.sort(): 오름차순 정렬
        Arrays.sort(scores);

        // Arrays.toString(): 배열의 모든 요소를 문자열로 변환
        System.out.println("정렬된 점수: " + Arrays.toString(scores));
        // output: [76, 85, 88, 92, 99]
    }
}

2.4. Pattern - 정규 표현식

정규표현식(Regular Expression) 은 이메일 형식, 전화번호 형식 처럼 특정한 패턴을 가진 문자열을 검증할 때 유용한 클래스이다. Java에서는 Pattern 클래스의 matches()를 사용하면 문자열이 특정 정규 표현식에 부합하는지 확인할 수 있다.

자주-사용되는-정규-표현식-기호
자주-사용되는-정규-표현식-기호
java
import java.util.regex.Pattern;

public class PatternMain {
    public static void main(String[] args) {
        String emailRegex = "\\w+@\\w+\\.\\w+(\\.\\w+)?";

        String email1 = "test@example.com";
        String email2 = "invalid-email";

        boolean isValid1 = Pattern.matches(emailRegex, email1);
        boolean isValid2 = Pattern.matches(emailRegex, email2);

        System.out.println(email1 + ": " + isValid1); // test@example.com: true
        System.out.println(email2 + ": " + isValid2); // invalid-email: false
    }
}

2.5.날짜와 시간 API

Date 클래스틑 특정 시점의 날짜와 시간 정보를 표현한다. 하지만 Date는 우리가 보기 쉬운 형식(2025-08-18 13:00 ....)이 아니기 때문에, 이를 표현하기 위해 SimpleDateFormat 클래스를 사용한다. 해당 클래스는 원하는 패턴에 맞춰 날짜는 문자열로 변환하거나, 문자열을 날짜 객체로 변환할 수 있다.

SimpleDateFormat의-주요-패턴-기호
SimpleDateFormat의-주요-패턴-기호
java
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateMain {
    public static void main(String[] args) {
        // Date 객체 생성
        Date now = new Date();

        // 날짜 형식 패턴 지정
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        //Date 객체를 지정된 형식의 문자열로 변환
        String formattedDate = sdf.format(now);

        System.out.println("Current Time: " + formattedDate);
        // 출력 예시: 현재 시간: 2025년 08월 18일 14시 16분 51초

        // SDF를 1회성으로 사용하는 짧은 방법
        String dateStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
        System.out.println("Current Time: " + dateStr);
    }
}

3. 향후 공부해야할 내용

  • Thread 심화

    • 멀티캠퍼스 2과목인 이번 과목에서 다룬 Thread는 개념 설명이 부족한 편이다. 필자와 같은 전공자는 문제 없을 수 있지만, 만약 Thread의 개념을 이해하지 못했다면, 따로 조사가 필요할 것이다.
    • 여러 쓰레드가 하나의 자원을 공유하기 때문에, 동기화 기법을 구현하는 방법과 쓰레드 관리를 위한 쓰레드 풀에 대한 조사도 필요하다.
  • API

    • Java 8 이후로 도입된 Stream이나 Lambda도 알아두면 좋을 것이다.
    • 또한 DateSimpleDateFormat를 보완한 java.time도 조사해보면 좋을 듯 하다.
BlueNyang
작성자BlueNyang
라이선스
CC BY NC
BlueNyang

BlueNyang

BlueNyang의 개발 log

카테고리

  • Development
  • Framework
  • Language
  • Dev Tools
  • DevOps & Infra
  • Studies

페이지

© 2026 BlueNyang. All rights reserved.

Made with Nuxt.js and Directus