# JAVA # 형변환(Casting) # 변환(Conversion) # List <-> Array 간 형변환 ### 1. List → Array 형변환
List 타입 | 변환 방법 |
---|---|
`List | `list.toArray(new String[0])` |
`List | `list.toArray(new Integer[0])` |
`List | 반복문으로 수동 변환 필요 |
변환 방법 | |
---|---|
`String[]` | `Arrays.asList(arr)` |
`Integer[]` | `Arrays.asList(arr)` |
`int[]` | `Arrays.stream(arr).boxed.collect(Collectors.toList())` |
항목 | 삼항 연산자 | if-else 구문 |
---|---|---|
반환 가능 여부 | ✅ 값 반환 (표현식) | ❌ 문(statement) |
간결함 | ✅ 매우 간결 | ❌ 구조적으로 길어질 수 있음 |
가독성 | ✅ 단순 조건일 때만 | ✅ 복잡 조건/로직에 적합 |
특징 | 설명 |
장점 | 간결한 조건 처리, 변수 할당 가능 |
단점 | 복잡한 로직에는 가독성 저하 |
사용 추천 | UI 메시지, 단순 조건 분기, 코드 압축 |
사용 주의 | 중첩 사용은 피하고 if-else 대체로 제한 |
비교 방식 | 설명 |
---|---|
`==` | 객체의 주소값 비교 (레퍼런스) |
`.equals()` | 객체가 가진 ****내용값**** 비교 |
항목 | String |
---|---|
불변성 | ✅ 한 번 생성된 값은 변경 불가 |
생성 방식 | 리터럴(권장), 생성자(비권장) |
비교 방식 | `==` 주소 비교 / `.equals()` 값 비교 |
내부 구조 | Java 9 이전: `char[]` |
연결 방식 | `+`, `concat()`, `StringBuilder` 사용 |
사용 시기 | 고정된 문자열, 메시지, 상수 등 |
항목 | 설명 |
---|---|
변경 가능 여부 | ❌ 불가능 – 항상 새로운 객체 생성됨 |
스레드 안전성 | ✅ 동기화 없이 공유 가능 |
공유 가능 여부 | ✅ 문자열 리터럴 풀에서 객체 공유 가능 |
메모리 구조 | Heap 영역 + String Constant Pool 최적화 |
관련 API 특징 | `replace()` , `concat()` 등 모두 새 객체 반환 |
항목 | 설명 |
---|---|
가변성 | ✅ 내부 문자열을 직접 수정 (객체 생성 없음) |
동기화 | ❌ 지원하지 않음 (→ 단일 스레드에서만 안전) |
성능 | `StringBuffer`보다 빠름 |
내부 구조 | `char[]` 배열을 이용한 버퍼 |
기본 크기 | 초기 용량 16 → 필요 시 자동 확장됨 |
메서드 | 설명 |
---|---|
`append(String)` | 문자열 끝에 추가 |
`insert(int, String)` | 특정 위치에 문자열 삽입 |
`delete(int, int)` | 지정 구간 문자 삭제 |
`deleteCharAt(int)` | 지정 인덱스 문자 삭제 |
`replace(int, int, String)` | 지정 구간을 문자열로 대체 |
`reverse()` | 문자열을 뒤집음 |
`toString()` | 최종 문자열로 변환 (`String`으로 반환) |
`length()` | 현재 문자열 길이 반환 |
`capacity()` | 내부 버퍼의 총 용량 반환 |
`ensureCapacity(int)` | 최소 버퍼 크기 확보 |
`setCharAt(int, char)` | 특정 위치 문자 변경 |
`charAt(int)` | 특정 인덱스 문자 반환 |
항목 | StringBuilder |
---|---|
불변성 | ❌ 가변 |
스레드 안전성 | ❌ 비동기 (단일 스레드만 안전) |
성능 | ✅ 매우 빠름 |
용도 | 반복적인 문자열 연결/수정에 최적 |
권장 사용 환경 | 루프 내 문자열 처리, 대용량 로그 조립 등 |
주의 포인트 | 설명 |
---|---|
❌ `null` 값 전달 | `append(null)` 은 문자열 `"null"` 로 처리됨 |
✅ 내부 수정 | 객체 내부 수정 → 참조가 유지됨 |
❌ 멀티스레드 비안전 | 멀티스레드 환경에서는 `StringBuffer` 사용 |
메서드 | 설명 |
---|---|
`append()` | 문자열 끝에 추가 |
`insert()` | 중간에 삽입 |
`delete()` | 구간 삭제 |
`replace()` | 문자열 교체 |
`reverse()` | 문자열 뒤집기 |
`charAt()` | 문자 추출 |
`setCharAt()` | 문자 수정 |
`toString()` | 최종 문자열 반환 |
`capacity()` | 내부 버퍼 용량 확인 |
`ensureCapacity()` | 버퍼 미리 확장 |
특징 | 설명 |
---|---|
기본 구분자 | 공백 ( `" \t\n\r\f"` ) |
성능 | `split()` 보다 빠름 |
정규식 지원 여부 | ❌ 불가능 |
항목 | StringBuffer | StringTokenizer | split() |
---|---|---|---|
용도 | 가변 문자열 조작 | 문자열 구분자 분할 | 정규식 기반 문자열 분할 |
동기화 | ✅ 있음 | ❌ 필요 없음 | ❌ 필요 없음 |
성능 | 중간 | 빠름 | 약간 느림 |
정규표현식 | ✖ | ✖ | ✅ 지원 |
등장 시기 | 오래됨 (JDK 1.0) | 오래됨 (JDK 1.0) | 나중에 도입됨 (JDK 1.4 이후) |
사용 추천 환경 | 멀티스레드 조작 | 빠른 단순 입력 분할 | 복잡한 기준 분할 or 가독성 우선 |
항목 | 설명 |
---|---|
스레드 안전성 | ✅ `synchronized`로 멀티스레드 환경에서 안전 |
성능 | ❌ `StringBuilder`보다 약간 느림 |
내부 수정 | ✅ 같은 객체 내에서 수정 |
메서드 반환값 | 대부분 `this` → 체이닝 가능 |
메서드 | 설명 | 시간복잡도 | 리턴값 |
---|---|---|---|
`append(String)` | 문자열 끝에 추가 | O(1~n) | `StringBuffer` |
`insert(int, str)` | 중간에 삽입 | O(n) | `StringBuffer` |
`delete(start, end)` | 구간 삭제 | O(n) | `StringBuffer` |
`deleteCharAt(idx)` | 문자 하나 삭제 | O(n) | `StringBuffer` |
`replace(s, e, str)` | 구간 대체 | O(n) | `StringBuffer` |
`reverse()` | 문자열 뒤집기 | O(n) | `StringBuffer` |
`charAt(int)` | 문자 조회 | O(1) | `char` |
`setCharAt(i, c)` | 문자 수정 | O(1) | void |
`length()` | 문자열 길이 | O(1) | `int` |
`capacity()` | 버퍼 크기 조회 | O(1) | `int` |
`ensureCapacity(n)` | 최소 용량 확보 | O(n) | void |
`toString()` | 문자열 객체 반환 | O(n) | `String` |
상황 | 추천 도구 | 이유 |
---|---|---|
문자열을 자주 수정/누적할 때 | `StringBuilder` | 가변 객체, 빠른 속도 |
문자열을 뒤집을 때 | `StringBuilder.reverse()` | 메서드 하나로 간단 처리 |
멀티스레드 고려 필요 없음 | `StringBuilder` | 동기화 없음 → 더 빠름 |
문자 | 정규표현식에서 의미 | split에 쓰는 방식 |
---|---|---|
`.` | 모든 문자 | `"\\."` |
` | ` | OR (또는) |
`*` | 반복자 | `"\\*"` |
`(` `)` `[` `]` | 그룹 지정 | `"\\("`, `"\\["` |
패턴 | 의미 | 예시 |
---|---|---|
`\\s` | 공백 문자 (스페이스, 탭 등) | `"\\s+"` → 연속된 공백 |
`\\d` | 숫자 (0~9) | `"\\d+"` → 숫자 1개 이상 |
`\\w` | 문자/숫자/밑줄 | `"\\w+"` |
`.` | 아무 문자 한 개 | `"a.b"` → "acb", "a1b" 가능 |
`[abc]` | a 또는 b 또는 c | `"a[bc]d"` → "abd", "acd" |
`[^abc]` | a,b,c 제외한 문자 | `"[^0-9]"` → 숫자 제외 |
`+` | 앞의 패턴 1번 이상 반복 | `"\\s+"` |
`*` | 0번 이상 반복 | `"a*"` |
` | ` | OR |
항목 | String | StringBuilder |
---|---|---|
메모리 구조 | 불변 객체, 매번 새 객체 생성 | 가변 객체, 하나의 버퍼 사용 |
연결 방식 | `+` 또는 `concat()` 호출마다 새 객체 | `append()` 는 동일 객체에 누적 |
GC 부하 | 심함 | 적음 |
속도 | 느림 | 빠름 |
사용 상황 | 적절한 클래스 | 이유 |
---|---|---|
고정된 문자열 / 변경 없음 | `String` | 불변성으로 안전하고, 메모리 캐싱 가능 |
루프 내 문자열 누적 / 대량 조작 | `StringBuilder` | 메모리 효율 및 성능 우수 |
멀티스레드 환경에서 동기화가 필요한 경우 | `StringBuffer` | 메서드 동기화로 스레드 안전성 확보 |
항목 | String | StringBuilder | StringBuffer |
---|---|---|---|
변경 가능 여부 | ❌ 불변 | ✅ 가변 | ✅ 가변 |
동기화 지원 | ❌ 없음 | ❌ 없음 | ✅ `synchronized` 지원 |
성능 | 느림 (매번 객체 생성) | 빠름 | 중간 (동기화 오버헤드 존재) |
메모리 효율성 | 낮음 | 높음 | 중간 |
적합한 환경 | 상수, 설정값, 로그 ID 등 | 단일 스레드 문자열 조작 | 멀티스레드 문자열 조작 |
항목 | `StringBuilder` | `StringBuffer` |
---|---|---|
****스레드 안전성**** | ❌ 비동기(스레드 안전 아님) | ✅ 동기화(synchronized, 스레드 안전) |
****속도**** | 빠름 | 상대적으로 느림 |
****코딩 테스트/일반 개발**** | ✅ 단일 스레드 환경에서 최적 | ❌ 보통 코테에선 불필요한 오버헤드 발생 |
****멀티스레드 환경**** | ❌ 사용 시 동기화 문제 생길 수 있음 | ✅ 멀티스레드 환경에서 안전하게 사용 가능 |
****사용 예**** | 코딩테스트, 파일 파싱, 로그 누적, 텍스트 생성 | 서버에서 공유 자원 처리, 멀티스레드 로그 등 |
항목 | 기본형 (int 등) | 참조형 (String) |
---|---|---|
저장 위치 | Stack | Stack(참조), Heap(객체) |
대입 방식 | 값 복사 | 참조값 복사 |
수정 시 영향 | 원본과 무관 | 불변 → 새 객체 생성 |
메모리 부담 | 없음 | 반복 수정 시 Heap 객체 증가 가능 |
항목 | 리터럴 방식 ( `"hello"`) | new 방식 ( `new String("hello")`) |
---|---|---|
메모리 위치 | Constant Pool (Method Area) | Heap 영역 |
객체 중복 여부 | 없음 (공유됨) | 항상 새 객체 생성 |
`==` 비교 결과 | true (동일 참조) | false (서로 다른 참조) |
`.equals()` 결과 | true | true |
메모리 효율 | 높음 | 낮음 |
성능 | 빠름 | 느림 (GC 대상 증가) |
GC 부담 | 낮음 | 높음 |
사용 권장 여부 | ✅ 일반적으로 권장 | ❌ 특별한 경우에만 사용 |
비교 항목 | 리터럴 방식 ( `"hello"`) | new 방식 ( `new String("hello")`) |
---|---|---|
저장 위치 | String Constant Pool | Heap 메모리 |
객체 공유 여부 | ✅ 공유됨 (중복 방지) | ❌ 매번 새 객체 생성 |
`==` 비교 결과 | true | false |
`.equals()` 결과 | true | true |
성능 | 빠름 | 느림 |
메모리 효율 | 높음 | 낮음 |
GC 부담 | 낮음 | 높음 |
사용 추천 여부 | ✅ 일반적 상황에서 적극 권장 | ⚠️ 특별한 목적이 없으면 지양 |
리터럴 방식 (`"hello"`) | new 방식 (`new String("hello")`) | |
---|---|---|
메모리 위치 | Constant Pool (Method Area) | Heap 영역 |
객체 중복 여부 | 없음 (공유됨) | 항상 새 객체 생성 |
`== ` 비교 결과 | true (같은 참조) | false (다른 객체) |
`.equals()` 결과 | true | true |
메모리 효율 | 높음 | 낮음 |
성능 | 빠름 | 느림 |
GC 부담 | 낮음 | 높음 |
사용 권장 여부 | 일반적으로 권장 | 특별한 경우에만 사용 |