반응형

Java에서는 변수나 메서드, 클래스의 동작 방식을 제어하는 다양한 키워드가 존재합니다. 이 중에서도 volatile, transient, synchronized는 각각 메모리 동기화, 직렬화, 그리고 스레드 동기화와 관련된 중요한 역할을 합니다.


volatile 키워드

volatile은 멀티스레드 환경에서 변수의 값을 메인 메모리에 직접 저장하고, 모든 스레드가 항상 최신 값을 읽도록 보장하는 역할을 합니다.

적용 대상 변수
주요 기능 캐시된 값을 사용하지 않고 항상 메인 메모리의 최신값을 읽음
주로 사용하는 경우 스레드 간 변수 값 공유 시 데이터 일관성 유지
public class SharedData {
    private volatile boolean flag = false;

    public void writer() {
        flag = true; // 값 변경 시 바로 메인 메모리에 반영
    }

    public void reader() {
        if (flag) {
            // flag가 true로 바뀌면 반드시 이 코드가 실행됨
        }
    }
}

 

단, volatile원자적 연산(atomic operation)을 보장하지 않으므로, 복합 연산이 필요하면 synchronized를 함께 사용해야 합니다.


transient 키워드

transient 키워드는 Java 기본 직렬화(ObjectOutputStream 등) 과정에서 특정 필드를 직렬화 대상에서 제외하고자 할 때 사용합니다.
즉, 직렬화 시점에 해당 필드는 저장되지 않으며, 역직렬화 후에는 기본값으로 초기화됩니다.

적용 대상 변수
주요 역할 Java 기본 직렬화 시 필드 제외

 

class User implements Serializable {
    String username;
    transient String password; // Java 직렬화 시 제외
}

transient 키워드 vs @JsonIgnore 어노테이션

구분 transient @JsonIgnore
적용 대상 변수 변수, 메서드
직렬화 대상 Java 기본 직렬화 (ObjectOutputStream) JSON 직렬화/역직렬화 (Jackson, Gson 등)
주요 역할 직렬화 시 필드 제외 JSON 변환 시 필드 제외
사용 시점 Java 직렬화를 직접 사용하는 경우 REST API JSON 응답/요청 시 민감 데이터 숨길 때
사용 예시
transient String password;
@JsonIgnore
private String password;
비고 Java 기본 직렬화에 한함 JSON 변환 제어에 특화

 

실무에서는 REST API 응답 시 민감 정보를 숨기기 위해 @JsonIgnore를 많이 사용하며, Java 기본 직렬화 목적이라면 transient를 사용합니다.


synchronized 키워드

synchronized는 멀티스레드 환경에서 임계 영역(critical section)을 보호하여, 동시에 한 스레드만 접근 가능하도록 하는 동기화 기능을 제공합니다.

적용 대상 메서드, 코드 블록
주요 기능 스레드 간 동시 접근 방지 및 데이터 일관성 유지
사용 목적 공유 자원 접근 시 레이스 컨디션 예방

 

public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++; // 이 메서드는 한번에 한 스레드만 접근 가능
    }

    public int getCount() {
        return count;
    }
}

또는 특정 코드 블록만 동기화할 수도 있습니다.

public void add(int value) {
    synchronized(this) {
        count += value;
    }
}

주의할 점은 동기화 과도 사용 시 성능 저하가 발생할 수 있으므로, 필요한 부분에만 최소한으로 적용하는 것이 좋습니다.


요약 비교표

키워드 적용 대상 주요 역할 사용 시기
volatile 변수 메인 메모리와 변수 값 동기화, 최신 값 보장 멀티스레드 변수 값 공유 시
transient 변수 Java 기본 직렬화 시 필드 제외 객체 직렬화 시 제외 필드 지정
synchronized 메서드, 블록 임계 영역 보호, 동시 접근 방지 멀티스레드 환경에서 데이터 무결성 필요할 때

 


실무 팁

  • volatile는 원자적 연산이 아닌 단순 값 변경 공유에 적합하며, 복합 연산은 synchronized를 병행 사용하세요.
  • transient@JsonIgnore는 각각 직렬화 환경(Java 기본 직렬화 vs JSON)에서 필드 제외를 위해 사용하므로, 목적에 맞게 선택해야 합니다.
  • synchronized는 꼭 필요한 부분에 최소한으로 사용해 성능 저하를 방지하세요.

마무리

Java의 volatile, transient, synchronized 키워드는 모두 멀티스레드 처리, 직렬화, 데이터 일관성 유지 등에서 매우 중요한 역할을 합니다.
각 키워드가 가진 특징과 차이점을 이해하고, 상황에 맞게 적절히 활용하는 것이 안정적이고 효율적인 Java 프로그래밍의 핵심입니다.

반응형
반응형

Java에서는 특정한 예약어(keywords)들을 사용해 클래스/메서드/변수의 속성을 제한하거나 제어할 수 있습니다.
이 글에서는 가장 많이 사용되는 final, static, this, super 키워드에 대해 정리하고, 언제 어떻게 사용하는지 코드 예제와 함께 비교해보겠습니다.


final 키워드

final수정 불가(변경 불가능)를 의미합니다. 변수, 메서드, 클래스 등 다양한 곳에 사용됩니다.

적용 대상 의미
변수 값이 한 번만 할당 가능 (상수처럼 사용)
메서드 오버라이딩 불가
클래스 상속 불가

 

final int MAX_COUNT = 10;
MAX_COUNT = 20; // 컴파일 에러

final class Animal {}
class Dog extends Animal {} // 컴파일 에러 (상속 불가)

class Parent {
    final void speak() {}
}
class Child extends Parent {
    void speak() {} // 에러: final 메서드는 오버라이드 불가
}

static 키워드

static공용(클래스 단위) 개념입니다. 인스턴스 생성 없이 사용 가능하고, 메모리 효율성을 높입니다.

적용 대상 의미
변수 모든 객체가 공유하는 클래스 변수
메서드 객체 없이 클래스명으로 호출 가능
블록 클래스 초기화 시 자동 실행되는 정적 블록

 

class Counter {
    static int count = 0;

    Counter() {
        count++;
        System.out.println(count);
    }
}

Counter c1 = new Counter(); // 1
Counter c2 = new Counter(); // 2

this 키워드

this현재 인스턴스 자신을 참조합니다. 주로 변수 이름 충돌 해결이나 코드의 가독성을 높이기 위해 명시적으로 사용합니다.

class Person {
    String name;

    Person(String name) {
        this.name = name; // 왼쪽: 인스턴스 변수, 오른쪽: 매개변수
    }

    void print() {
        System.out.println(this.name); // 현재 인스턴스의 name
    }
}

super 키워드

super부모 클래스 요소에 접근할 때 사용합니다. 생성자 호출이나 오버라이드 메서드 안에서 사용됩니다.

class Parent {
    String name = "부모";
    void greet() {
        System.out.println("안녕 from 부모");
    }
}

class Child extends Parent {
    String name = "자식";

    void greet() {
        super.greet(); // 부모 메서드 호출
        System.out.println(super.name); // 부모 변수 접근
    }
}

요약 비교표

키워드 사용 위치 주요 기능
final 변수/메서드/클래스 값/상속/오버라이드 불가로 제한
static 변수/메서드/블록 클래스 단위로 공유, 인스턴스 없이 접근
this 인스턴스 내부 현재 객체 참조, 변수 충돌 해결, 코드 가독성을 위한 명시적 사용
super 상속 구조 내부 부모 클래스 요소 참조 (메서드, 변수 등)

 


실무 팁

  • final 변수는 상수처럼 사용하며, static final 조합으로 전역 상수를 선언할 수 있습니다.
  • static 메서드는 공용 기능을 제공하는 유틸성 클래스에서 많이 사용됩니다.
  • this는 주로 생성자 파라미터 명과 멤버변수 이름이 같을 때 사용하거나, 코드 가독성을 위해 명시적으로 사용할 때 사용합니다.
  • super는 오버라이딩한 메서드에서 부모의 로직을 확장할 때 유용합니다.

마무리

Java의 핵심 키워드인 final, static, this, super는 객체 지향 프로그래밍에서 매우 자주 사용됩니다.
각각의 의미와 쓰임을 정확히 이해하고, 상황에 맞게 사용하는 것이 중요합니다.

반응형

'개발새발 > Java' 카테고리의 다른 글

Java의 핵심 키워드: volatile, transient, synchronized  (1) 2025.06.16
Java의 메모리 영역  (0) 2024.05.26
인터페이스 vs 추상클래스  (0) 2024.05.26
반응형

Spring Boot란?

 

기존 스프링 프레임워크 프로젝트들의 복잡한 설정 및 라이브러리 버전 등의 문제를 완화하여, 간단하게 프로젝트를 생성할 수 있는 라이브러리이다.

기본적으로 사용자가 자주 설정하는 기본 설정들을 포함하고 있으며, 기존 web.xml, ServletContext.xml, rootContext.xml 설정 등을 기존처럼 복잡하지 않게 설정 가능하다.

 

Spring Boot 프로젝트 시작

 

 

IDE(개발 툴 - Spring Tools)를 사용하는데, Spring Starter Project를 눌러 새 프로젝트를 생성할 수 있다.

 

 

Name, Type, Packaging, Java Version, Group, Package 등을 설정하고, Next를 눌러 다음 작업으로 넘어갈 수 있다.

  • Name : 프로젝트 명
  • Type : Maven / Gradle 등 라이브러리 관리 도구
  • Packaging : Jar / War
  • Java Version : Project에서 사용할 자바 버전
  • Group : GroupId 자신의 프로젝트를 식별해주는 고유 아이디
  • Artifact : ArtifactId 버전 정보를 생략한 이름으로, 보통 프로젝트 명과 동일

 

프로젝트의 기본 개요를 설정 이후, Spring Starter project Dependencies에서는 pom.xml에서 설정할 의존성 항목 중 자주 쓰는 항목들을 미리 선택하여 설정할 수 있다.

(프로젝트 생성 시에 생략하고 이후 pom.xml에서 직접 추가하여도 차이가 없다.)

각자 개발 환경 및 설정에 맞춰서 해당 의존성은 추가 및 제거가 가능하다.

  • Spring Boot DevTools : 개발의 편의를 위한 도구 지원 (Property 캐싱 설정, 자동 재시작, LiveReload 등)
  • Lombok : Getter/Setter, ToString의 메서드를 자동으로 만들어주는 라이브러리
  • MyBatis Framework : 프로그램 코드와 SQL을 분리하여, 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와주는 프레임워크
  • MariaDB Driver : DB 연결을 위한 드라이버 (MariaDB)
  • Spring Web : Spring MVC를 사용한 RESTful 서비스를 개발

Finish를 클릭하여, 마무리하면 자동적으로 Build가 이루어지며 프로젝트가 생성된다.

반응형

'개발새발 > Spring Boot' 카테고리의 다른 글

Spring Boot에서 JS 사용 및 설정  (0) 2022.09.23
Lombok 설치 및 STS 연동  (0) 2021.05.22

+ Recent posts