: 기본 자료형 외의 데이터 타입 (클래스, 배열, 열거, 인터페이스 등)
<자료형 종류>
- 기본형
- 객체 생성없이 값 대입
- 변수와 값이 stack 영역에 저장됨
- 참조형
- 객체 생성 → 주소를 통해 데이터에 접근
- 값을 heap 영역에 저장, 그 주소(reference)를 스택 영역에 저장
// 기본 구조
클래스 변수명 = new 클래스();
// String
String str = new String(); // 기본값 null
// 배열 -> 크기 할당해줘야 함
int arr1[] = new int[3]; // 선언 & 초기화
int[] arr2 = {0, 0, 0}; // arr1, arr2 값 같음
: 기본 자료형을 객체로 다루기 위해 사용하는 클래스
primitive type | =boxing⇒ | wrapper class |
---|---|---|
byte | Byte | |
short | Short | |
int | Integer | |
long | Long | |
float | Float | |
double | Double | |
char | Char | |
boolean | Boolean |
// wrapper class도 literal 표기 가능
Integer iobj = 987;
String str = new String("123");
// String -> int 변환
int i = Integer.parseInt(str);
int j = Integer.valueOf(str);
// int -> String 변환
String s1 = i + "";
String s2 = String.valueOf(i);
String s3 = iobj.toString();
JDK 1.5 이후로는 보다 편한 형변환을 위해
auto boxing(자동으로 기본형 데이터를 래퍼 클래스에 담는 것)과
auto unboxing을 지원한다.
int i = 10;
Integer obj = (Integer) i; // i의 auto boxing(기본형 -> 참조형)
int sum = i + obj; // obj의 auto unboxing(참조형 -> 기본형)
문자열은 문자로 구성된 문장으로,
기본 자료형만큼 자주 쓰이는 참조형 데이터.
Java에서 문자열은 class 형태로 java.lang module에 들어있으며,
내부를 보면 char[]
로 이루어짐.
String str1 = "Hello world"; // 문자열도 literal 표기 가능
String str2 = new String("Hello world"); // instance 생성
String str3; // 멤버변수의 기본값 null
String str4 = ""; // 지역변수는 빈 문자열로 초기화
: 기본형 자료처럼 변수에 값만 대입하는 것이 아니라 객체도 생성됨
다만, 값이 같으면 같은 주소를 참조
문자열을 합치는 방법은 대표적으로 아래 3가지가 있다.
concat
메소드
: 메소드 사용 시마다 새로운 인스턴스 생성(주소 재할당)
StringBuffer, StringBuilder의 append
메소드
: 주소 변경없이 값만 변경
StringBuffer sb = new StringBuffer("abc");
System.out.println(System.identityHashCode(sb));
sb.append("123");
System.out.println(System.identityHashCode(sb)); // 위와 같은 해시코드
+
연산자불변 객체(immutable object)
: 초기화 후 상태 변경이 불가능한 객체
→ String class는 불변 객체로, 수정 메소드(replaceAll, trim 등) 사용 시
값이 수정되는 게 아니라 새로운 인스턴스가 생성됨
문자열의 값을 비교할 때는 반드시 equals
를 사용해야 한다 ❗
==
연산자를 사용할 경우 아래와 같이 예상과 다른 결과가 나올 수 있다.
String a = "hello"; // 변수 선언 및 초기화(literal 표기)
String b = new String("hello"); // 인스턴스 생성
System.out.println(a.equals(b)); // true (값이 같음)
System.out.println(a == b); // false (주소가 다름)
System.out.println(a == "hello"); // true (literal 표기로 주소 같음)
a와 b는 값은 같지만, 서로 다른 객체이다.
equals
는 값이 같은지 비교하고, ==
연산자는 주소가 같은지 비교한다.
변수의 값을 형식화하여 대입한 문자열 리턴
int n = 30;
String rain = String.format("비 올 확률: %d%%", n); // 리턴
System.out.printf("비 올 확률: %s%%", n); // 출력
// 공백
System.out.println(String.format("%3sjane.", "hi")); // " hijane."
System.out.println(String.format("%-3sjane.", "hi")); // "hi jane."
// 소수점 표현 (반올림)
System.out.println(String.format("%.3f", 3.4219423)); // "3.422"
📋 포맷 코드
코드 | 설명 |
---|---|
%s | String(자동 변환) |
%c | character |
%d | integer(10진수) |
%f | floating-point |
%o | 8진수 |
%x | 16진수 |
%% | 문자 % 자체 |
%.nf | 소수점 n번째까지 반올림 표현 |
%n$ | n번째 인수 대입 |
기능 | 메소드 | 구조 | 리턴값 자료형 |
---|---|---|---|
탐색 | contains | a.contains("값") | boolean |
인덱스 리턴 | indexOf | a.indexOf("값") | int |
인덱싱 | charAt | a.charAt(인덱스) | char |
길이 | length | a.length() | int |
교체 | replaceAll | a.replaceAll("값", "대체값") | String |
슬라이싱 | substring | a.substring(시작 인덱스, 끝+1) | String |
자르기 | split | a.split("구분자") | String[] |
앞뒤 공백 제거 | trim | a.trim() | String |
대문자 / 소문자 | toUpperCase / toLowerCase | a.toUpperCase() | String |
반복 | repeat | a.repeat(반복횟수) | String |
문자배열 생성 | toCharArray | a.toCharArray() | char[] |