JAVA/about java

[Muatable and Immutable] 가변 객체와 불변 객체

dev_rosieposie 2023. 4. 17. 17:00

Goal 

  1.  Mutable한 객체와 Immutable한 객체는 무엇이고 또 그 차이를 알아보자
  2. Mutable한 객체를 Immutable한 객체로 만드는 방법은 무엇인지 알아보자

Mutable한 객체란 ?

가변객체로 초기화 후, 값이 변경될 수 있는 객체를 뜻한다. 객체가 생성된 후 필드 및 상태와 같은 객체의 값을 변경할 수 있다. 

기존의 객체를 변경할 경우, 새로운 객체가 생성되지 않고 값이 변경된다.

예로는 Java.util.Date , StringBuilder , StringBuffer 가 있다.

 

특징

1. Getter( get() 메서드), Setter( set() 메서드) 모두 사용할 수 있다.

2. 값을 변경할 수 있기 때문에 스레드로부터 안전할 수도 있고 그렇지 않을 수도 있다.

 

만드는 방법

  • getter 와 setter
  • 값을 변경할 수 있는 메소드
public class MutableClass {
	
	private String name;
	
	public MutableClass(String name){ 
		this.name= name;
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public static void main(String[] args) {
		
		MutableClass mtc = new MutableClass("rose");
		
		System.out.println(mtc.getName());
		mtc.setName("rose2");
		System.out.println(mtc.getName());
	}
}

결과 : 

rose
rose2

Immutable한 객체란 ?

불변 객체로 초기화 후 값을 변경할 수 없는 객체이다. 객체가 생성되면 객체 값과 상태를 변경할 수 없다. 

예로는 int , long , float , double , 모든 legacy 클래스 , Wrapper 클래스 , String 클래스 등과 같은 기본 객체가 있다.

 

특징

1. Getter( get() 메서드)만 사용할 수 있고 Setter( set() 메서드)는 사용할 수 없다.

 

만드는 방법

  • 상속(확장)할 수 없도록 final로 선언된 클래스
  • 필드에 대한 직접 액세스가 차단되도록 모든 필드는 private을 사용해야함
  • setter 없음
  • 변경 가능한 모든 필드는 초기화되면 반복할 수 없도록 final로 선언되어야 함
public class ImmutableClass {
	
	private final String name;
	
	public ImmutableClass(final String name){ 
		this.name= name;
	}
	
	public final String getName() {
		return name;
	}

	public static void main(String[] args) {
		
		ImmutableClass mtc = new ImmutableClass("rose");
		
		System.out.println(mtc.getName());
	}
}

결과 : 

rose

차이점  

Mutable 가변 객체 Immutable 불변 객체
초기화 후 객체 값 변경 가능 초기화 후 객체 값 변경 불가
상태 변경가능 상태 변경 불가
객체의 값이 변경될 시 새로운 객체 형성 X 객체의 값이 변경될 시 새로운 객체 형성
변경메소드 제공 변경메소드 미제공
Getter, Setter Getter
스레드로부터 안전할 수도 있고 그렇지 않을 수도 있다. 스레드로부터 안전

Mutable한 객체를 Immutable로 만드는 방법

  • 모든 필드 접근제어자를 final로 변경 (매개변수가 있는 파라미터의 접근제어자 포함)
  • setter 제거
  • 생성자에서 필드 값을 설정

이렇게하면 객체의 상태를 변경할 수 없으므로 불변성을 보장할수 있다.

불변 객체의 장점

  1. 스레드 안전성: 여러 스레드가 동시에 접근해도 객체의 상태가 변경되지 않으므로 스레드 안전성을 보장
  2. 보안성: 불변 객체를 사용하면 객체의 상태가 변경될 수 없으므로 보안성이 높아진다
  3. 성능: 불변 객체는 객체의 상태가 변경될 수 없으므로 복사본을 만들 필요가 없어서 메모리 사용량이 줄어들고 성능 향상

 

 

참고 자료 

 

Mutable and Immutable in Java - Javatpoint

Mutable and Immutable in Java with java tutorial, features, history, variables, object, programs, operators, oops concept, array, string, map, math, methods, examples etc.

www.javatpoint.com