티스토리 뷰
728x90
반응형
불변객체란?
- 생성 이후에 상태를 변경할 수 없는 객체를 말합니다.
Final
- 자바에서 불변으로 만들기 위한 키워드입니다.
Final Class
- 클래스에 final을 붙이면 더이상 상속할 수 없는 클래스가 됩니다.
Final Method
- 메서드에 final을 붙이게 되면 오버라이딩을 할 수 없는 메서드가 됩니다.
Final Variable
- 변수 앞에 final 키워드를 붙이면 값 변경이 불가능한 변수가 됩니다.
Final을 사용하는 이유는 뭘까?
장점
- 객체의 데이터를 참조할 때 데이터가 바뀔 걱정을 하지 않아도 됩니다.
- 멀티스레드 환경에서 동기화처리 없이 사용할 수 있습니다.
- 방어복사를 할 필요성이 없어집니다.
- 이렇게 프로그램의 안전성이 올라가는 코드를 구현할 수 있습니다.
단점
- 새로운 객체를 생성해야 하므로 비용이 발생합니다.
요즘 세상이 좋아서 GC가 잘 관리해줄텐데라는 생각이 들어서 굳이 단점인가 라는 생각이 듭니다.
불변객체를 사용하지 않는 경우
- 아래의 Person 클래스는 불변객체인가요?
- 아닙니다. 왜냐하면 Person 객체가 참조하고 있는 kdg 객체는 불변객체가 아니기 때문입니다.
Person Class
public class Person {
private final KDG kdg;
public Person(KDG kdg) {
this.kdg = kdg;
}
@Override
public String toString() {
return "Person [kdg=" + kdg + "]";
}
}
KDG Class
public class KDG {
private String name;
private int age;
public KDG(String name, int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "KDG [name=" + name + ", age=" + age + "]";
}
}
실행 코드
public static void main(String[] args) {
KDG kdg = new KDG("홍길동", 30);
Person person = new Person(kdg);
kdg.setName("이순신");
kdg.setAge(31);
Person newPerson = new Person(kdg);
System.out.println(person.toString()); // output => Person [kdg=KDG [name=이순신, age=31]]
System.out.println(newPerson.toString()); // output => Person [kdg=KDG [name=이순신, age=31]]
}
문제점
- 처음에 kdg 객체에는 홍길동이라는 이름과 30이라는 나이가 부여되었고 Person 객체의 인자로 전달했습니다.
- 이후 newPerson이라는 객체에서 KDG 객체를 재사용하기 위해 setter 메서드를 이용하여 원하는 데이터로 변경한 뒤 newPerson 객체의 인자로 전달하였습니다.
- 결과는 기존 person 객체에는 변화를 주지 않았음에도 불구하고 데이터가 변경이 되었습니다.
1. person은 KDG("홍길동", 30) 객체를 참조하고 있습니다.
2. newPerson이 나타나 person이 사용하고 있는 객체를 재사용하기 위해 원하는대로 데이터를 변경합니다. 이때 기존에 있던 person 객체는 같은 객체를 참조하고 있기 때문에 데이터가 같이 변경됩니다.
Final 키워드 사용
KDG Class
- 변수들 앞에 final 키워드를 사용합니다.
public class KDG {
private final String name;
private final int age;
public KDG(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "KDG [name=" + name + ", age=" + age + "]";
}
}
실행 코드
public static void main(String[] args) {
KDG kdg1 = new KDG("홍길동", 30);
KDG kdg2 = new KDG("이순신", 31);
Person person = new Person(kdg1);
Person newPerson = new Person(kdg2);
System.out.println(person.toString()); // output => Person [kdg=KDG [name=홍길동, age=30]]
System.out.println(newPerson.toString()); // output => Person [kdg=KDG [name=이순신, age=31]]
}
728x90
반응형
'JAVA > JAVA기본' 카테고리의 다른 글
JAVA - (optional) Java 13, switch 연산자 (0) | 2021.12.14 |
---|---|
JAVA - 연산자란? (0) | 2021.12.13 |
JAVA - Wrapper Class란? (0) | 2021.12.10 |
JAVA - 변수 (feat.스코프와 라이프 타임 & 타입 변환, 캐스팅, 프로모션) (0) | 2021.12.08 |
JAVA - 프리미티브 타입이란? (feat.레퍼런스 타입) (0) | 2021.12.08 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- transactional outbox pattern
- 트랜잭셔널 아웃박스 패턴 스프링 부트 예제
- java userThread와 DaemonThread
- 트랜잭셔널 아웃박스 패턴 스프링부트
- java ThreadLocal
- spring boot excel download paging
- transactional outbox pattern spring boot
- 공간 기반 아키텍처
- pipeline architecture
- 자바 백엔드 개발자 추천 도서
- spring boot redis 대기열 구현
- spring boot excel download oom
- polling publisher spring boot
- redis sorted set으로 대기열 구현
- 람다 표현식
- @ControllerAdvice
- space based architecture
- spring boot 엑셀 다운로드
- spring boot redisson 분산락 구현
- spring boot poi excel download
- microkernel architecture
- redis 대기열 구현
- JDK Dynamic Proxy와 CGLIB의 차이
- 레이어드 아키텍처란
- 서비스 기반 아키텍처
- redis sorted set
- spring boot redisson sorted set
- pipe and filter architecture
- spring boot redisson destributed lock
- service based architecture
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함