본문 바로가기
  • Adillete
【Java】

불변성

by 아딜렛 2026. 4. 20.

자바의 pojo:

순수 자바언어만으로 작성된 객체: 순수 자바 객체면 다 POJO다.

  1. 미리 정의된 클래스를 상속받지 않고
  2. 인터페이스를 강제로 구현하지도 않고
  3. 기술 중심의 어노테이션을 포함하지 않는다.
  4. 주로 private로 선언하여 캡슐화를 유지한다.

JavaBean : 일반 제한 javabean api 사양에 따른다.

 

직렬화 serializable을 상속 해야한다.

필드 가시성 private만 가능

필드 접근 getter setter만 가능

기본 생성자 필: 인수가 없는 생성자가 존재해야한다.

public class User {
    private String name;

    public User() {}

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}
코드에 불변성을 도입하는 것은 전략이다. 왜 쓸까?
1. 버그 감소
2. 동시성 안전
3. 예측 가능성

함수형 프로그래밍은 왜 불변성을 강제하나?

함수형 프로그래밍은 '상태 변경'을 금지하려고 불변성을 사용한다.

같은 입력  ➔ 항상 같은 결과 

이거를 방해하는 요소가 상태 변경(side effect)

 

자바에서 사용하는 불변성 특징

1)String : 높은 최적화 (불변성): 한번 생성된 문자열 객체의 내용이 절대 변경 되지 않는다.

새로운 객체 생성 : 문자열 s1+ s2= 새로운 string 객체가 생성

기존 객체는 유지

안전성을 위해서 내용을 바꾸지 못하고 연결할때는 매번 새로운 객체를 만든다.

2)불변 컬렉션: 생성후 상태가 절대 안변함 수정도 삭제도 안된다.

    ①변경 불가능한 컬렉션: 특정 컬렉션 뷰에 대해 수정작업을 실행할수 없도록한다. 변경 불가능한 뷰 기존 컬렉션에 대한 추상화           이다. 원본 컬렉션 자체는 참조를 통해 변경이 가능

    ②불변 컬렉션 팩토리 메서드

    ③불변 복제

3)불변 수학 java.math : 넓은 범위와 높은 정밀도로 사이드 이펙트가 없는 계산을 수행할수 있기때문이다.

BigDecimal a = new BigDecimal("10");
BigDecimal b = a.add(new BigDecimal("5"));

//a 안바뀐다.

4)자바 시간api : 동시환경에서도 안전하게 사용

5)enum: 상수로 구성된 특별 타입

6)final 키워드 하위 클래스화될수 없고 오버라이딩될수도 없고 생성자 내부에 선언될때 한번만 할당되고 재할당 없고 변수 참조는 필드처럼 작동 한번만 할당할수 있다.

 

7)레코드: 기본 데이터의 집합체 getter 동등성 비교 toString hashcode 메서드를 제공

public record User(String name, int age) {}

 

  • 자동 final
  • setter 없음
  • equals/hashCode 자동

 

8) Stream API (대표적인 함수형 스타일)

List<Integer> numbers = List.of(1, 2, 3);

List<Integer> result = numbers.stream()
    .map(n -> n * 2)
    .toList();

//원본 리스트 안 바뀜
//새로운 결과 생성
참조: 함수형 프로그래밍 with 자바(한빛미디어,벤 바이디히,허귀영 번역p.109-131)

https://product.kyobobook.co.kr/detail/S000212762854

 

함수형 프로그래밍 with 자바 | 벤 바이디히 - 교보문고

함수형 프로그래밍 with 자바 | 모던 자바의 새로운 전환점, 함수형 프로그래밍에 집중하라 람다와 스트림을 활용한 자바 함수형 프로그래밍 실전 가이드자바는 전통적으로 객체 지향 프로그래

product.kyobobook.co.kr

 

'【Java】' 카테고리의 다른 글

함수형 예외처리  (1) 2026.04.23
Optional  (0) 2026.04.22
CompletableFuture 생성  (0) 2026.04.08
[코테에서 자주쓰는 기본 메서드 정리5] replace  (0) 2026.04.07
[코테에서 자주쓰는 기본 메서드 정리4] contains  (0) 2026.04.07