배움 __IL/TIL 2기

TIL : Extra-3(.class, stringBuilder)

Mo_bi!e 2023. 8. 29. 22:55

I. .class

What (정의) : 클래스타입메타데이터와 속성을 자바 런타임 환경에서 나타내는 역할이다.

Why (존재이유) : Class객체에 접근하는것으로, 클리스의 정보(필드, 메소드, 생성자, 기타 세부정보)를 제공하는것이다. 그리고 동적으로 클래스를 조작하고 사용할 수있다.

When (역사적 등장배경) : 자바 언어 초기부터 존재한 것으로서, 고급 자바기능과 프레임웍의 기초를 형성함

How (방법) : 

Class<?> myClass = MyClass.class;

e.g. (비유) :

.class 를 건축에서 설계도 프린트 라고 생각하자! 건물의 구조와 특성은 건물(클래스)보다는 건물의 설계도(메타데이터)가 더 바람직하다.

 

 

II. .stringBuilder

java에서 문자열에서 일부 문자를 masking 할때 stringBuilder를 이용하더라고 나는 급해서 그냥 썻는데, 이게 뭔지 좀 더 알고싶어

 

What (정의) :

java에서 문자열을 효율적으로 조작하기 위한 클래스이다. 문자열을 더하거나, 수정할 때 메모리를 효율적으로 조작하기 위해서 새로운 문자열 객체를 생성하지 않는다.

 

Why (존재이유) :

기존 String 의 경우 immutable한데, +로 두개의 문자열을 합친다(concat)고 하더라도 이것은 기존 문자열에 합치는것이 아니다. 새로운 문자열 객체를 생성해서 저장한다.

이 경우 기존 String 객체의 참조변수(주소값)은 stack에 쌓이는 한편 객체도 GC에 동작하기 전까지는 Heap메모리에 추가된다.

 

다시말하면 문자열을 수정하거나 연결할 때 마다 새로운 문자열 객체를 생성하는데, 메모리 사용과 성능에 비효율적이다.

이 경우 StringBuilder는 내부버퍼를 이용해서 문자열을 조작하기 때문에 불필요한 객체 생성을 줄일 수있다.

 

When (역사적 등장배경) :

String -> StringBuffer -> StringBuilder  순서로 등장했다.

과거 StringBuffer는 문자열 조작에 사용되지만, 멀티스레드환경에 동기화 되어 있어 스레드 안전성은 있으나, 성능저하가 있었다. 그래서 단일스레드 환경에서 스레드안전성을 고려하지않는 StringBuilder 가 등장했다.

 

즉 String은 문자열연산이 필요없는 싱글스레드에 유리하고,

StringBuilder 는 문자열 연산이 필요한 싱글스레드에서 유리하다

 

How (방법) :

//StringBuilder 객체 생성: 
StringBuilder sb = new StringBuilder();

//문자열 추가: 
sb.append("Hello");

//문자열 삽입: 
sb.insert(5, " World");

//문자열 수정: 
sb.replace(0, 5, "Hi");

//문자열 삭제: 
sb.delete(0, 2);

//문자열 역순: 
sb.reverse();

//StringBuilder 객체를 문자열로 변환: 
String result = sb.toString();

 

e.g. (비유) :

String은 아날로그 사진과 같다. 한번 찍은 사진은 수정이 불가능(immutable)하며, 새롭게 사진을 찍을 때 마다 필름을 사용한다.

StringBuffer은 건축현장과 같다. 여러사람(스레드)가 동시에 작업할 때 함께 조율하는 경우인데, 이런역할을 수행한다. (대량생산)

StringBuilder는 예술가의 아틀리에와 같다. 예술가 한명이 작업환경을 준비하고 작업을 진행하는 경우이다. (가내수공업)