그냥 변수형도 뮤터블 / 이뮤터블, 즉 불변 / 가변으로 나눠서 설명 혹은 사용 경험을 물어보면 벙찐다.(내가 그랬다.)

기본이 중요! 라고 생각하다가도 가끔 이런 것도 대답 못할때 스스로 한심 + 와 꼭 생각 안날때 물어보냐 이렇게 비겁하게 생각하곤 한다.

그래서 확실히 정리하고자 글로 남겨본다.

Mutable Object

말 그대로 가변, 즉 내부의 값을 변경할 수 있는 객체다. 기본적으로 객체가 생성이 되기 위해서는 일정 영역의 메모리 할당으로 시작되는데, Mutable 객체는 생성된 메모리 안에서 값이 변경 가능함을 의미한다.

보통 function / array / object? 이 정도가 Mutable 객체라고 한다.

StringBuilder / StringBuffer 둘다 직접적인(literal) 할당은 안 되며 new 를 이용해서 만들어야 한다.

StringBuffer s2 = new StringBuffer("test");
StringBuilder s3 = new StringBuilder("test");

StringBuilder / StringBuffer 의 공통점은 가변, 즉 내부의 값을 변경할 수 있다는 것이다.

값을 추가할 수 있는 수많은 append 함수를 통해 이미 할당 된 메모리 공간에서의 값 변경이 가능하다.

StringBuilder / StringBuffer 의 차이점은 StringBuffer은 멀티스레드 위해 동기화 필요, StringBuilder은 동기화 불 필요하다는 점?

Immutable Object

불변 객체, 즉 메모리 한번 할당 되면 내부의 값이 변하지 않는 객체라는 것을 뜻한다. String / Boolean / Float / Long / Integer 정도가 있다.

이것들은 모두 = "" or = 숫자 형태로 만들 수 있는데 이 경우 해당 인스턴스에 값을 + 를 통해 변형하면 기존에 참조하던 값에서 새로운 값을 바라보게끔 메모리가 새로 할당이 되고, 기존의 값은 그냥 버려지게 된다. 이 경우 버려진 값은 GC (Garbage Collector) 가 가져가는데 문제는 언제 가져갈지 모른다.

그래서 String을 계속 생성하는 함수 혹은 클래스파일의 경우 퍼포먼스가 StringBuilder/Buffer 를 적절히 사용한 것보다 떨어질 수 밖에 없다. 메모리를 계속 생성 할테니까.

* new 로 생성하거나 = "" 로 생성하는 것들 둘 다 heap 메모리에 저장되긴 함. 그러나 ="" 로 만들어진 값은 heap 내에 String pool 이란 메모리영역이 생성되고, 그 안에서 메모리를 만든다고 한다. 그리고 그 안의 값은 불변.

하지만 장점은 한번 생성해두고 단순 읽기 작업에서는 당연히 가장 빠름. 그리고 멀티스레드 시 동기화 걱정을 할 필요가 없다.

 

'프로그래밍 > Java' 카테고리의 다른 글

Spring - JWT 연동  (0) 2022.05.05
Call By Referance / Call By Value  (0) 2022.05.05
접근제어자 정리  (0) 2022.05.05
Java 특징 및 장점  (0) 2022.05.05
JAVA encoding 예제  (0) 2022.05.05

Public -> 어디서든 쓸 수 있음.

Protected -> 패키지 내, 혹은 상속 받은 것 들에서 사용 가능.

Default(Package) -> 따로 지정하지 않으면 나오는 접근제어자, Package 내에서 사용 가능.

Private -> 해당 클래스 내에서만 쓸 수 있음.

Java는...

1. 운영체제 독립적 -> JVM 위에서 돌아가기 때문에 각 운영체제에 JVM이 설치되어 있으면 자바 프로젝트를 실행 시킬 수 있다.

2. 객체지향 -> 맨날나옴. OOP / 1.캡슐화 2.다형성 3.상속 4.추상

-> 캡슐과 : 구현부 숨김 (Controller로 api 명시하는부분 - 서비스로 가는데 서비스를 인터페이스형태로 두고 실제 로직은 impl 이라는 형태로 구현했던 경험)

-> 다형성 / 상속: 코드의 재사용성을 높이고 중복을 제거 ( 다양한 도메인클래스가 BaseDomain을 상속 받아서 만들어짐 )

-> 추상화 : abstract class를 만들어 어떤 것을 만들지 모르는 상태에서 특징들을 모아놓은 class 생성(Push를 보낼때 MQ를 안 쓰고 디비 방식으로 사용할 때, FCM / APNS 별로 따로 구현한 적 있음. )

(

- 상속을 통해 중복 코드를 줄일 수 있다

- 자식 클래스를 그룹화할 수 있다

- 비 실존 객체의 직접 생성 차단하여 실수를 사전에 방지한다.

)

3. GC(Garbage Collector) -> 메모리 관리의 편리함

4. 이건 개인적으로... 자바 개발자가 많음 -> 수 많은 레퍼런스

+ Recent posts