Goal
- Mutable한 객체와 Immutable한 객체는 무엇이고 또 그 차이를 알아보자
- 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 제거
- 생성자에서 필드 값을 설정
이렇게하면 객체의 상태를 변경할 수 없으므로 불변성을 보장할수 있다.
불변 객체의 장점
- 스레드 안전성: 여러 스레드가 동시에 접근해도 객체의 상태가 변경되지 않으므로 스레드 안전성을 보장
- 보안성: 불변 객체를 사용하면 객체의 상태가 변경될 수 없으므로 보안성이 높아진다
- 성능: 불변 객체는 객체의 상태가 변경될 수 없으므로 복사본을 만들 필요가 없어서 메모리 사용량이 줄어들고 성능 향상
참고 자료
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
'JAVA > about java' 카테고리의 다른 글
[Interface, abstract, enum] 인터페이스, 추상클래스, enum / 예외처리 (0) | 2023.04.19 |
---|---|
[JVM] JVM 메모리모델 (0) | 2023.04.18 |
[Access Modifier, extends, Object] 접근제어자 / 상속 / Object 클래스 (0) | 2023.04.16 |
[Class, Data Type, Array] 클래스 / 객체 / 변수 / 기본 자료형 / 조건문 / 배열 / 참조 자료형 (0) | 2023.04.11 |
[Map] getOrDefault (0) | 2022.09.26 |