
프로그래밍에서 문자열를 다루는 것은 byte 와 char 뿐이다.
그래서 본래 문자열(String) 은 char의 배열이다.

( char 은 2byte이다 )
String 클래스는 내용을 변경할 수 없는 불변 클래스이다.
그래서 문자열끼리 결합 시 새로운 String 객체를 생성하게 된다.
이 때, 덧셈 연산자끼리의 결합은 매번 새 객체를 생성하기 때문에 성능이 떨어져 문자열 결합 및 변경이 잦으면 내용변경이 가능한 StringBuffer 를 이용하는 것이 좋다.
constant pool(상수 저장소) 에 저장된다.변수에 넣는 변하지 않는 데이터값을 의미한다.
보통은 기본형의 데이터 를 의미하지만, 특정 객체(Immutable class , VO class)에 한에서는 리터럴이 될 수 있다.
여기서 String 은 불변클래스라 string 리터럴 이 가능하다.
길이가 0인 char형 배열을 저장하는 문자열
char 과 String 의 초기화 시 null 보다는 "" 를 해주는 것이 좋다.
String 과 char[] 는 결국에 같은 문자배열이다.
"" 사용 :
String str = "Hello String";
객체 생성하여 사용 :
String str = new String("Hello String");
char[] 배열 생성하여 그 값을 객체 생성 매개변수로 사용 :
char[] ch = new char[] {'H','e','l','l','o','','S','t','r','i','n','g','3'};
String str = new STring(ch);

String(char[] value) 를 통해 char[] -> String 전환toCharArray() 를 통해 String -> char[] 로 전환
charAt(int index) : 지정된 인덱스 위치에 있는 문자를 알려준다. 이때 반환값은 char 이다.
compareTo(String str) : 사전순서로 비교하여 int값을 반환한다.
( 같으면 0, 이전순서면 -1, 다음순서면 1 을 반환 )
( 컬렉션프레임워크 정렬에서 많이 사용한다 )

concat(String str) : 문자열 결합.
contain(CharSequence S) : 지정한 문자열 포함 유무에 따라 true/false 반환.
CharSeqence 는
인터페이스이다.
서로 다른 CharBuffer, Segment, String, StringBuffer, StringBuilder 은문자열배열 ( char[] ) 을 다루는 공통점이 있으나 공통 조상이 없기 때문에 CharSeqence 인터페이스를 이용하여공통 조상을 만들어 서로 관계없는 클래스들의 관계를 맺어준 것이다.

endsWith(String suffix) : 지정된 문자열로 끝나는지 true/false 반환
startWith(String suffix) : 지정된 문자열로 시작되는지 true/false 반환
equals(Object o) : 문자열 비교 true/false 반환
equalsIgnoreCase(String str) : 대소문자 구분없이 비교 true/false 반환
indexOf(char ch) : 주어진 문자(int로 표현가능)가 존재하는 인덱스 번호 알려준다.
indexOf 는 못찾으면 -1 반환한다.
indexOf(char ch, int pos) : 주어진 문자(int로 표현가능)가 존재하는지 지정한 위치(pos) 부터 찾아본다.
이때 반환하는 인덱스 번호는 지정된 위치부터 0으로 시작하는건 아니다.
indexOf(String str) : 문자열도 찾아서 인덱스 번호를 알려준다.
이때 문자열의 첫글자의 인덱스 번호를 반환한다.
lastIndexOf(char ch) : 주어진 문자를 끝에서부터 찾아봐준다.
이때 끝에서부터 0으로 시작하는건 아니다.
lastIndexOf(String str) : 문자열도 끝에서부터 찾아봐준다.
이때 문자열의 첫글자의 인덱스 번호를 반환한다.

split(String regex) : 문자열을 지정한 분리자(regex) 로 나누어 배열에 담아 반환한다.
"dog,cat,bear" 의 "," 를 분리자로 하면 dog 와 cat 과 bear 이 각각 String[] 배열로 반환된다.
split(String regex, int limit) : 문자열 전체를 지정한 수(limit) 만큼만 자른다.
2 를 주면 두 부분으로 나뉘어서 dog 와 cat,bear 로 분리되어 배열에 담긴다.

substring(int begin) , substring(int begin, int end) :
주어진 시작위치(begin) 부터 끝위치(end) 이전까지의 문자열을 얻는다.
(begin <= x < end )
이때 시작위치만 주어지면 맨 마지막까지를 범위에 포함하여 반환한다.

toCharArray() : 문자열을 한글자씩 끊어내 배열에 담아 반환
( split 보다 성능이 빠르다 )
toLowerCase() : 모든 문자열을 소문자로 변환
toUpperCase() : 모든 문자열을 대문자로 변환
trim() : 양 옆 끝의 공백을 제거한다. 다만 중간 공백은 제거 X
valueOf(기본형타입) , valueOf(참조형타입) :
지정한 값을 문자열로 변환해준다.
true+""->"true" 도 있지만 valueOf() 가 성능이 더 빠르다.
참조형타입의 경우는 toString() 을 호출한 결과를 반환한다.
객체를 문자열로 변환하기 위한 메서드.

Object 클래스의 toString( ) 메서드는 Card@19e0bfd 와 같이 반환해준다.
그래서 오버라이드하여 본인의 입맛대로 사용하는 경우가 많다.
이때 객체는 인스턴스 변수의 집합이기 때문에 인스턴스 변수를 문자열로 반환한 것을 오버라이드 하는게 일반적이다.
참고 : 자바의 정석 기초편 강의 https://www.youtube.com/watch?v=3cqJz9hIPD8&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=107
로그인 -> 메인화면을 거쳐 파일명 검사를 해주는 페이지를 만들어보자.
- 로그인 페이지 제작

로그인 페이지 컨트롤러 제작

req.setCharacterEncoding("UTF-8") 로 깨짐을 방지한다.String 클래스의 메서드 trim() 을 이용한다.HttpServletRequest 클래스로부터 getSession()메서드를 이용하여 session 객체를 생성해야 한다.HttpSession 타입의 변수에 저장한다.setAttribute(key,value) 메서드를 통해 세션에 값을 저장한다.
- 메인 페이지 제작

[image]test@image.jpeg 를 집어넣었다.메인 페이지 컨트롤러 제작

StringUtils 의 객체를 가져와check() 메서드 를 실행 시 결과값을 msg에 담아 main 페이지로 전달한다.컨트롤러의 실질적 처리 모델 제작


length() 을 이용해 입력태그의 값이 20자를 넘으면 경고문구를 반환하도록 하였다.contain() 을 이용해 @$#%& 가 있으면 경고문구를 반환하도록 하였다.startWith() 을 이용해 [img] 파일로 시작하지 않으면 경고문구를 반환하도록 하였다.endsWith() 을 이용해 확장자가 잘못되면 경고문구를 반환하도록 하였다.replace() 를 이용해 .jpeg 확장자를 .jpg 로 변환하게 하였다.
로그인 -> 메인화면에서 다른 문자열 기능을 추가해보자.
- util.jsp 페이지 제작

a 태그의 herf = "utils?action=charAt&val=4" 경로는
utils 라는 서브도메인 요청을 넣어 action 파라미터 값 과
val 파라미터 값을 준다는 의미다.
JSTL 의 <c:if test="조건식"> 을 이용하여
${charAt ne null} : 전송받은 charAt 파라미터가 null이 아닐 경우 태그 안의 내용을 실행한다.
JSTL 의
<c:forEach item="array, collection, Map같은 덩어리"> var="담을 변수값"> 을 이용하여
${toCharArray} : 전송받은 toCharArray 파라미터값 (배열로 받음) 덩어리를 하나씩 떼어낸 뒤,
태그안의 ${ch} : var="str" 로 저장하여 값을 출력 을 실행한다.
util.jsp 페이지 컨트롤러 제작

req.setAttribute(String 타입, Object타입) 은 앞은 문자열을 받지만 뒤에는 어떤 타입이든 다 받는다.
String 클래스의 메서드 charAt() 을 이용해 4번째 인덱스의 값을 반환하도록 하였다. 이때 int 값만 넣을 수 있어서 문자열로 받은 val 값을 Integer.parsInt(val) 로 int로 형변환하였다.
String 클래스의 메서드 substring() 을 이용해 text 변수의 Language 문자열만 남기게 하였다.
String 클래스의 메서드 toCharArray() 을 이용해 문자열을 캐릭터 배열로 만들었다.
String 클래스의 메서드 split() 을 이용해 구분자 단위로 문자열을 분리하였다. ( 여기서는 공백을 기준 )
String 클래스의 메서드 indexOf() 을 이용해 a 가 있는 인덱스 번호를 전부 찾게 만들었다.
indexOf 실행할 실질적 처리 모델 제작
메인페이지 컨트롤러의 실질적 처리 모델인 StringUtils 를 활용하였다.
<1번 방법>

charAt() 을 활용하여 입력한 인덱스의 값이 'a' 면 인덱스 번호를 String 변수 result에 누적 하여 입력한 후 반환한다.<2번 방법>

indexOf(문자,어디서부터) 를 활용하여 int타입 변수 index 안에 인덱스 값을 넣고 String 변수 result 에 누적 하여 입력한 후 반환한다.-1 을 반환 하기 때문에 반복문이 종료된다.break 를 사용하면 해당 반복문 탈출한다.
마찬가지로 return 를 사용하면 반환값을 남기고 해당 메서드를 탈출한다.
@WebServlet("/") 의 슬래시는 전송시킨 요청을 다 받아들이라는 의미다.