[JAVA] String 클래스 _ "생성자" + "메서드"

DongGyu Jung·2022년 2월 7일
1

자바(JAVA)

목록 보기
25/60
post-thumbnail

🏃‍♂️ 들어가기 앞서..

본 게시물은 스터디 활동 중에 작성한 게시물로 자바의 정석-기초편 교재를 학습하여 정리하는 글입니다.
※ 스터디 Page : 〔투 비 마스터 : 자바〕

*해당 교재의 목차 순서와 구성을 참고하여 작성하며
각 내용마다 부족할 수 있는 내용이나 개인적으로 궁금한 점은
추가적인 검색을 통해 채워나갈 예정입니다.



📋 정리


✨ 생성

메서드 / 설명예시결과
String(String s)
(효율적이지 않아 잘 사용하지 않음)
문자열(s)를 갖는 String 인스턴스 생성
String s = new String("Hello") ;s = "Hello"
String(char[] value)
주어진 문자열(value)을 갖는 String 인스턴스 생성
char[] c = {'H', 'e', 'l', 'l', 'o'};
String s = new String(c);
s = "Hello"
String toCharArray()
지정된 String을 char 배열로 변환
String s = "Hello"
char[] c = s.toCharArray();
c = {'H', 'e', 'l', 'l', 'o'}
String(StringBuffer buf)
StringBuffer인스턴스가 갖고 있는 문자열과 같은 내용의 String인스턴스 생성
StringBuffer sb = new StringBuffer("Hello");
String s = new String(sb);
s = "Hello"



🎏 비교 / 검사

메서드 / 설명예시결과
int compareTo(String str)
문자열(str)과 "사전순서"로 비교
같으면 0, 이전이면 음수, 이후면 양수
int i = "aaa".compareTo("aaa") ;
int i2 = "aaa".compareTo("bbb") ;
int i3 = "bbb".compareTo("aaa") ;
i = 0
i2 = -1
i3 = 1
boolean contains(CharSequence s)
지정된 문자열의 포함 여부
String s = "abcedfg" ;
boolean b = s.contains("bc") ;
b = true
boolean endsWith(String suffix)
지정된 문자열로(suffix)로 끝나는지 검사
String file = "Hello.txt" ;
boolean b = file.endsWith(".txt") ;
b = true
boolean startsWith(String prefix)
지정된 문자열로(prefix)로 시작하는지 검사
String s = "java.lang.Object";
boolean b1 = s.startsWith("java");
boolean b2 = s.startsWith("lang");
b1 = true
b2 = false
boolean equals(Object obj)
매개변수로 입력받은 문자열(obj)와 String 인스턴스 문자열 비교
String s = "Hello";
boolean b = s.equals("Hello");
boolean b2 = s.equals("hello");
b = true
b2 = false
boolean equalsIgnoreCase(String str)
비교 대상은 equals와 같지만 대소문자 구분없이 비교
String s = "Hello";
boolean b = s.equalsIgnoreCase("HELLO");
boolean b2 = s.equalsIgnoreCase("heLLo");
b = true
b2 = true



🚩 조회

메서드 / 설명예시결과
char charAt(int index)
지정된 위치(index)에 있는 문자를 반환 : 0부터 시작
String s= "Hello" ;
String n = "0123456";
char c = s.charAt(1) ;
char c2 = n.charAt(1) ;
c = 'e'
c2 = '1'
int indexOf(int ch)
주어진 문자(ch)가 문자열에 존재하는지 확인하고
그 위치를 반환
( 없으면 -1 반환 )
String s = "Hello" ;
int idx1 = s.index('o') ;
int idx2 = s.index('k') ;
idx1 = 4
idx2 = -1
int indexOf(int ch, int pos)
방법은 위와 동일하지만
어디서부터 찾기 시작할지 지정(pos)
String s = "Hello" ;
int idx1 = s.index('e', 1) ;
int idx2 = s.index('e', 2) ;
idx1 = 0
idx2 = -1
int indexOf(String str)
주어진 문자열에 대해 탐색
String s = "ABCDEFG" ;
int idx = s.indexOf("CD") ;
idx = 2
int lastIndexOf(int ch)
위 indexOf 메서드에서
탐색에서부터 시작
String s = "java.lang.Object" ;
int idx1 = s.indexOf('.') ;
int idx2 = s.lastIndexOf('.') ;
idx1 = 4
idx2 = 9
int lastIndexOf(String str)
String s = "java.lang.java" ;
int idx1 = s.indexOf("java") ;
int idx2 = s.lastIndexOf("java") ;
idx1 = 0
idx2 = 10
String intern()
문자열을 상수 저장소 (constant pool)에 저장
실행 시 문자열이 이미 있으면 주소값을 반환
String s1 = new String("abc") ;
String s2 = new String("abc") ;
boolean b1 = (s1 == s2) ;
boolean b2 = s1.equals(s2) ;
boolean b3 = (s1.intern() == s2.intern()) ;
b1 = false
b2 = true
b3 = true
int length()
길이
String s = "Hello" ;
int length = s.length() ;
length = 5

문자열 매개변수인 ch가 int형으로 되어있는 이유는
문자열로 확장문자가 올 경우를 대비해서이다.
( 확장문자 : char 2개 )




📐 편집

regex : 정규 표현식

메서드 / 설명예시결과
String concat(String str)
문자열(str)을 뒤에 덧붙인다.
String s = "Hello";
String s2 = s.concat(" World") ;
s2 = "Hello World"
String replace(char old, char nw)
문자열 중 원래 있던 문자(old)를 새로운 문자(new)로 교체 및 반환
String s = "Hello" ;
String s1 = s.replace('H','C') ;
s1 = "Cello"
String replace(CharSequence old, CharSequence nw)
문자열 중 원래 있던 문자(old)를 새로운 문자열(new)로 교체 및 반환
String s = "HelloAllo" ;
String s1 = s.replace('ll','LL') ;
s1 = "HeLLoALLo"
String replaceAll(String regex, String replacement)
문자열 중 지정된 문자열(regex)과 일치하는 것을 교체
String s = "AABABBCBB" ;
String s1 = s.replace("BB","bb") ;
s1 = "AABAbbCbb"
String replaceFirst(String regex, String replacement)
문자열 중 지정된 문자열(regex)
" 첫번째 "로 일치하는 것을 교체
String s = "AABABBCBB" ;
String s1 = s.replace("BB","bb") ;
s1 = "AABAbbCBB"
String[] split(String regex)
문자열을 지정한 regex를 기준으로 나눠서
배열에 담아 반환
String animals = "dog,cat,bear" ;
String[] arr = animals.split(",") ;
arr[0] = "dog"
arr[1] = "cat"
arr[2] = "bear"
String[] split(String regex, int limit)
위 split과 동일하지만
문자열 전체를 지정된 수(limit)로 자름
String animals = "dog,cat,bear" ;
String[] arr = animals.split(",", 2)
arr[0] = "dog"
arr[1] = "cat,bear"
String substring(int begin)
String substring(int begin, int end)
주어진 " 시작 위치(begin)부터 끝 위치(end) 범위 "에
포함된 문자열을 얻는다.
단, 끝위치의 문자는 포함되지 않음!!
String s = "java.lang.Object" ;
String c = s.substring(10)
String p = s.substring(5,9)
c = "Object"
p = "lang"
(끝 문자인 .은 포함 안됨)
String trim()
양 끝의 공백을 제거한 결과 반환
단, 중간 위치 공백은 제거되지 않음!!
String s = " Hello World " ;
String s1 = s.trim();
s1 = "Hello World"



💫 변환

메서드 / 설명예시결과
String toLowerCase()
모든 문자 소문자화
String s = "Hello";
String s1 = s.toLowerCase();
s1 = "hello"
String toString()
인스턴스에 저장된 문자열을 반환
String s = "Hello";
String s1 = s.toString();
s1 = "Hello"
String toUpperCase()
모든 문자 대문자화
String s = "Hello";
String s1 = s.toUpperCase();
s1 = "HELLO"
static String valueOf(boolean b)
static String valueOf(char c)
static String valueOf(int i)
static String valueOf(long l)
static String valueOf(float f)
static String valueOf(double d)
static String valueOf(Object o)
String b = String.valueOf(true) ;
String c = String.valueOf('a') ;
String i = String.valueOf(100) ;
String l = String.valueOf(100L) ;
String f = String.valueOf(10f) ;
String d = String.valueOf(10.0) ;

java.util.Date dd = new java.util.Date() ;
String date = String.valueOf(dd) ;
b = "true"
c = "a"
i = "100"
l = "100"
f = "10.0"
d = "10.0"

date = "Mon Feb 07 18:01:31 KST 2022"

※ 《 문자열 - 기본형 》 변환

꼭 문자열 기준뿐만 아니라
" 모든 기본형들간의 변환 "에서도 아래 메서드들을 활용할 수 있다.

  • 기본형 → 문자열 」 의 경우

사실 기본형을 " 문자열 "로 변경하는 방법은 간단한데

바로
숫자에 빈 문자열 ""더해주는 방법 이나
앞서 알아봤던
valueOf()메서드를 사용하는 방법이다.
( valueOf()메서드가 속도가 더 빠르다. )



  • 문자열 → 기본형 」의 경우

이 경우 또한
valueOf()를 사용하거나
parse{래퍼클래스_Integer = Int}() 를 사용하면 된다.

/* 문자열 "100" 을 기본형 int 100으로 */
int i = Integer.parseInt("100")
int i2 = Integer.valueOf("100") // 문자열을 기본형으로 바꿀 때도 해당 기본형에 대해 적용시키면 된다.

/*
valueOf() 메서드는 
꼭 문자열을 기본형으로 바꿀 때만 사용할 수 있는 것은 아니다
*/
Float f = Float.valueOf(38) ; // 38.0
Integer i = Integer.valueOf(100, 16) ; // 256
// 기본형인 int i 랑 Integer i 둘다 작성해도 상관없음 - "오토박싱" (참조형 Integer를 자동으로 기본형 int 변환
Float f = Float.valueOf("38") ; // 38.0

여기서
Integer에 대한 valueOf()parseInt() 메서드의 두번째 매개변수
"진법(radix)"입력이 된다.
* 생략시 기본값 10진법
( ex. "FF"와 16 입력 ▶ 255 출력 _ 단, FF와 같은 값을 넣고 진법을 생략하게 되면 NumberFormatException발생 )

parse~ 형식의 메서드는
" 문자열기본형으로 변환하는 메서드들의 기본적인 이름 형식 " 이라고 할 수 있다.
(메서드 앞의 클래스를들을 " 래퍼 클래스 "라고 한다.

boolean B = Boolean.parseBoolean(String s)
byte b = Byte.parseByte(String s)
short s = Short.parseShort(String s)
int i = Integer.parseInt(String s)
long l = Long.parseLong(String s)
float f = Float.parseFloat(String s)
double d = Double.parseDouble(String s)

valueOf()메서드가 훨씬 직관적이고 사용성이 좋긴 하지만

그래도 <숫자형으로의 변환>에서는
parse~메서드가 가장 많이 이용되고 있다

// 참조변수 타입 "기본형"도 상관없음. (반환타입이 래퍼 클래스이지만 오토박싱으로 자동 변환)
Boolean B = Boolean.valueOf(String s) 
Byte b = Byte.valueOf(String s)
Short s = Short.valueOf(String s)
Integer i = Integer.valueOf(String s)
Long l = Long.valueOf(String s)
Float f = Float.valueOf(String s)
Double d = Double.valueOf(String s)

( 본래 .valueOf()의 반환타입은 기본형이 아닌 래퍼 클래스이지만 " 오토박싱 (auto-boxing) "에 의해 자동변환 된다. _ .parse{타입}" 기본형 " 반환 )




🧵 join()StringJoiner

" 문자열 결합 방법 "

  • join() : 구분자 를 지정해서 문자열 사이에 넣어 결합 ( 매개변수 : 구분자 / 문자열 배열 )
    " StringBuffer "를 사용하기 때문에 빠르고 효율적임.

  • StringJoiner클래스 : 매개변수로 중간 구분자 / 좌측 시작문자 / 우측 끝문자 를 받아서 구분 후에 양 측 문자로 감싸주어 반환

join()은 " 여러 문자열 사이에 구분자를 넣어서 결합 "하는 메서드인데

" 구분자로 문자열을 자르는 " split()메서드와 반대라고 생각하면 된다.

/*
join() 사용법
*/
String animals = "dog,cat,bear" ;
Strng[] arr = animals.split(",") ; // 구분자로 문자열 "분할" ( {"dog", "cat", "bear"} )

String str = String.join("-", arr) ; // dog-cat-baer 로 반환

/*
StringJoiner 클래스 사용법
*/
StringJoiner sj = new StringJoiner(",", "[", "]") ; // 중간 구분자 ',' & 좌측 시작 '[' & 우측 끝 ']'

for(String s : arr) //for each 문
	sj.add(s.UpperCase()) ;
    
System.out.println(sj.toString()); // [DOG,CAT,BEAR]

0개의 댓글