정수
int (-2147483648 ~ 2147483647)
long (-9223372036854775808 ~ 9223372036854775807)int intData = 10; long longData = 2147483648L;
실수
float (-3.4x10^38 ~ 3.4x10^38)
double (-1.7x10^308 ~ 1.7x10^308)float pi = 3.14F; double longPi = 3.1415926535897932384616; double d1 = 123.4; double d2 = 1.234e2;
진수
int octal = 023; // 19 int hex = 0xC; // 12
연산
더하기 +, 빼기 -, 곱하기 *, 나누기 /, 나머지 %
증감연산 i++ / ++i
true or false
boolean isTrue = true;
boolean isTall = height > base;
System.out.println(isTall); // true or false 출력됨
char a1 = 'a';
char a2 = 97; // 아스키코드
char a3 = '\u0061'; // 유니코드
String a = "Hello java";
String 자료형은 또한 다양한 내장 메소드를 갖는다.
equals, indexOf, contains, chatAt, replaceAll...
한편, 내장 메소드에 따라 프로그램 실행 중 NullPointerException의 발생 우려와 같은 고려사항이 존재하므로 별도의 유틸 함수 사용 등이 요구될 수 있다.
C와 같은 다른 언어에서도 그렇듯, System.out.println등을 사용할 때 다른 문자열, 정수를 가져오거나 하는 등의 표현을 위해서는 포매팅이 요구되며 아래와 같이 사용한다.
%s : 문자열
%c : 문자
%d : 정수
%f : 부동소수
%o, %x : 8진수, 16진수
%% : %
%.4f로 소수점 아래 네 자리까지만 표현하는 등의 표현도 가능하다.
또한 String.format 메소드를 이용해 포매팅된 문자열을 리턴받을 수도 있다.
문자열을 추가하거나 변경할 때 사용하는 자료형이다.
StringBuffer sb = new StringBuffer();
sb.append("hello");
sb.append(" java");
sb.insert(0, "yeon: ");
System.out.println(sb.toString()); // yeon: hello java 출력
System.out.println(sb.subString(0, 4)); // yeon 출력
한편 String에도 + 연산으로 문자열을 추가할 수 있는데, 그 경우에는 + 연산이 있을 때마다 새로운 String 객체가 생성된다. String 자료형은 immutable하여 다양한 메소드를 통해 내용을 바꿀 때마다 전부 새로운 String이 생성되는 것이지 값이 변경되는 것이 아니기 때문이다.
StringBuffer 자료형은 mutable하다는 특징을 갖지만, 그냥 String보다 무거운 편이기 때문에 문자열 추가/변경의 작업이 많은 경우에 사용하는 것이 유리하다.
유사한 자료형으로 StringBuilderㅏ가 존재하는데 StringBuffer는 멀티 스레드 환경에서 유리하고 StringBuilder는 보다 성능이 낫다는 장점이 있어 동기화를 고려하지 않을 때는 StringBuilder를 사용하는 것이 좋다.
앞서 살펴본 int, char 등의 자료형은 원시 자료형으로 구분된다.
이런 자료형들은 아래와 같이 리터럴로만 값 세팅이 가능하며, new 키워드로 생성할 수 없다.
int a = 1;
한편 String의 경우에는 아래와 같은 표현이 가능하다.
String str1 = "literal";
String str2 = new String("non-literal!");
String은 리터럴 표현식을 사용할 수 있도록 자바에서 특별히 제공되는 자료형이기에 위와 같은 표현이 가능하지만, 그 외의 원시 자료형들은 new로 생성할 수 없다.
int, long과 같은 원시 자료형들은 아래와 같이 각각 별도의 Wrapper 클래스를 가진다.
int - Integer
long - Long
double - Double
...
ArrayList, HashMap과 같은 형식으로 데이터를 저장하는 경우 원시 자료형 대신 Wrapper 클래스를 사용해야 한다. Wrapper 클래스를 사용하면 값 대신 객체를 주고 받을 수 있어 OOP에 유리하다. 또한 멀티스레딩 환경의 동기화 지원을 위해서는 반드시 Wrapper 클래스를 사용해야 한다.
이 글은 점프 투 자바를 읽고 스터디한 글입니다.