[Java] 데이터 타입, String 특징

2022. 3. 23. 03:27CSE/JAVA

Java의 데이터 타입에 대해 글을 쓴 줄 알았더니, Java script의 데이터 타입에 대해서 쓴 글이랑 착각했었다.

그래서 복습 하는 겸, Java의 데이터 타입에 대해 알아보겠다.

1. Java의 데이터 타입

- Java의 데이터 타입은 크게 두 가지, "기본 타입(primitive type)", "참조 타입(reference type)"으로 나뉘어진다.

데이터 타입 기본 타입(primitive type) 참조 타입(reference type)
종류 정수 타입, 실수 타입, 논리 타입 배열 타입, 열거 타입, 클래스, 인터페이스

2. 기본 타입 (Primitive Type)

- 기본 타입을 이용해서 선언된 변수는 실제 값을 변수 안에 저장한다.

- 위의 표 처럼 기본 타입은 다시 정수 타입, 실수 타입, 논리 타입으로 나뉘어진다.

값의 종류 기본 타입 메모리 사용 크기 저장되는 값의 범위
정수 byte 1 byte -27 ~ (27-1)
char 2 byte 유니코드 : 0~216-1
short 2 byte -215 ~ (215-1)
int 4 byte -231 ~ (231-1)
long 8 byte -263 ~ (263-1)
실수 float 4 byte (+/-)1.4E-45 ~ (+/-)3.4028235E38
double 8 byte (+/-)4.9E-324 ~ (+/-)1.7976931348623157E308
논리 boolean 1 byte true, false

 

3. 참조 타입 (Reference Type)

- 참조 타입을 통해 선언된 변수는 메모리의 번지를 값으로 갖는다.

- 변수가 스택 영역에 생성되고 객체는 힙 영역에 생긴다.

- 종류 : 배열 타입, 열거 타입, 클래스, 인터페이스

 

4. String의 특징

String name1 = "Ella";
String name2 = "Ella";

- String변수는 동일한 문자열을 참조할 경우, 동일한 String 객체를 참조하게 된다.

- 따라서 강제로 다른 값을 참조하게 하기 위해서는 다음과 같이 new 연산자로 생성해야한다.

String name3 = new String("Ella");

 

- name1과 name2는 같은 객체를 참조하므로 == 결과가 true가 나오지만, name1과 name3는 다른 객체를 참조하므로 false가 나온다.

=> String의 == 비교는 같은 객체를 참조하는지 확인한다.

- String 문자열 비교는 equals를 사용해야 한다.

name1.equals(name2); //true
name1.equals(name3); //true

 

- String 객체는 내부의 문자열을 수정할 수 없다. 따라서 수정하려는 시도(+ 연산, replace 메소드 등)를 하게 되면 원래의 객체에 값을 추가하는 것이 아니라 새로운 객체를 만들고 해당 객체를 참조하게 한다. 

String name1 = "Ella";
name1 += "!!!";

=> 이와 같은 단점들 때문에 StringBuilder와 StringBuffer를 사용하는 것이 좋다.

 

5. StringBuilder vs StringBuffer

(1) 공통점

- 둘 다 내부 버퍼에 문자열을 저장해 두고, 그 안에서 추가, 수정, 삭제 작업을 할 수 있도록 설계되어 있다.

- 내부 버퍼가 부족할 경우, 자동으로 버퍼 크기를 늘린다.

- 초기 버퍼 크기를 지정할 수 있다.

StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder(16); //초기 버퍼 크기 지정
StringBuilder sb3 = new StringBuilder("Java");

 

(2) 차이점

- StringBuffer는 멀티 스레드 환경에서 사용할 수 있도록 동기화가 적용되어 있다. => Thread Safe

- StringBuilder는 단일 스레드 환경에서만 사용할 수 있도록 설계되어 있기 때문에, 멀티 스레드 환경에서 사용하면 동기화 문제가 발생할 수 있다.

 

- StringBuilder는 동기화를 고려하지 않기 때문에, 단일 스레드 상황에서는 StringBuffer보다 좋은 성능을 보인다.