public class HomeController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//문자열 만드는 방식 1
String str = "Hello String";
//문자열 만드는 방식 2
str = new String("Hello String2");
//문자열 만드는 방식 3
char[] alphabet = {'H','e','l','l','o',' ','S','t','r','i','n','g','3'};
str = new String(alphabet);
}
}
문자열(String) 의 기능들
equals()
두 문자가 같은지 비교
contains()
해당 문자를 포함하는지 비교(boolean)
replace()
특정 문자를 변경함
trim()
문자의 앞뒤 공백을 제거
startWith()
특정 문자열로 시작하는지 여부 확인
endWith()
특정 문자열로 끝나는지 여부 확인
length()
문자열 길이 확인
charAt()
특정 인덱스의 문자 확인
indexOf()
특정 문자가 있는 인덱스 확인(1개)
substring()
문자열 특정 부분 잘라 냄
toCharArray()
문자열을 캐릭터 배열로 변환
split()
문자열을 특정 구분자로 나눠 줌
String
용량이 고정되기 때문에 문자열 추가 시(+=) 새로운 객체를 계속 생성함
StringBuffer VS StringBuilder
StringBuffer와 StringBuilder는 용량이 고정되어 있지 않으므로 새로운 객체를 생성하지 않음
StringBuffer 와 StringBuilder 의 차이점
String
StringBuffer
StringBuilder
용량
초기화 시 지정한 값
가변적
가변적
문자열 추가 시
새로운 객체 생성
새로운 객체 생성하지 않음
새로운 객체 생성하지 않음
다수유저 동시 접근
허용하지 않음
허용함
StringUtils(model역할)(코드리뷰)
package kr.co.web.model;
public class StringUtils {
public String check(String fileName) {
//파일명은 20자가 넘으면 안됩니다.
//매개변수로 들어온 fileName의 길이를 len 변수를 선언해 담아주었습니다.
int len = fileName.length();
//System.out.println("글자수 : " + len);
//len의 값이 20이상일 경우 아래의 리턴값을 반환하고 넘지 않을 경우 다음 함수로 넘어갑니다.
if(len>20) {
return fileName + "은 20자가 넘습니다.";
}
//파일명에 다음 문자가 있어서는 안됩니다.(@,$,#,%,&)
//String타입의 arr배열을 선언하여 다음과 같이 담아주었고
String[] arr = {"@","$","#","%","&"};
//향상된 for문을 사용하여 arr배열의 값을 하나씩 꺼내 str에 담아줍니다.
for(String str : arr) {
//특정 문자가 포함되었는지 true|false로 나타냄
//boolean타입의 contains 변수를 선언하여 fileName에 str의 값을 담고 있으면 true,
없으면 false를 담도록 해줍니다.
boolean contains = fileName.contains(str);
//contains변수가 true값이면 다음 내용을 리턴하고, false이면 다음 함수로 넘어갑니다.
if(contains == true) {
return "파일명에 (@,$,#,%,&)이 포함되어서는 안됩니다.";
}
}
//파일명 앞에 [img]를 붙여야합니다.
//startsWith() : 대상 문자 앞에 특정 문자로 시작되는지 true|false로 나타냄
//fileName이 [img]로 시작하지 않을 경우 다음 내용을 리턴하고, true이면 다음 함수로 넘어갑니다.
if(fileName.startsWith("[img]") == false) {
return "파일명 앞에 [img]를 붙이세요";
}
//허용되는 확장자는 .png .jpg .gif (jpeg)입니다.
//exts라는 배열을 선언해 다음 값들을 넣어주고
String[] exts = {".png",".jpg",".gif",".jpeg"};
//boolean 변수 pass를 선언하여 false값을 넣어주었습니다.
boolean pass = false;
//향상된 for문을 사용하여 exts의 값을 하나씩 꺼내 ext변수에 담아주고
for(String ext : exts) {
//fileName의 ext변수의 담긴 문자열로 끝나는지 비교해주어 true|false 값을 pass변수에 담았고
pass = fileName.endsWith(ext);
//pass값이 true이면 다음 함수로 넘어가도록 break문을 걸어주었습니다.
//pass가 true값이 나오면 더이상 비교를 진행하지 않도록 break문을 걸어주었습니다.
if(pass) {
break;
}
}
//false가 나오면 다음 내용을 리턴합니다.
if(!pass) {
return "허용된 확장자는 (.png .jpg .gif .jpeg) 입니다.";
}
//.jpeg확장자의 경우는 강제로 .jpg로 변환됩니다.
//fileName이 .jpeg 문자열로 끝날 경우
if(fileName.endsWith(".jpeg") == true) {
//fileName의 ".jpeg" 값을 ".jpg"으로 변경해준 후
fileName = fileName.replace(".jpeg", ".jpg");
} //다음 내용을 리턴합니다.
return fileName + "는 정상적인 파일명입니다.";
}
public Object search(String text, String val) {
//전체 text를 소문자로 변경
String lowerText = text.toLowerCase();
//indexOf를 통해 a의 위치 반환
//1개만 찾아줌(원하는 인덱스 번호를 반환, 못 찾으면 -1 반환)
//StringBuffer 사용
int idx = lowerText.indexOf(val);
//String result = "a의 인덱스["+idx+"] ";
StringBuffer buffer = new StringBuffer("a의 인덱스 ["+idx+"] ");
while(idx > -1) {
idx = lowerText.indexOf(val, idx+1);
if(idx < 0) {
break;
}
//result += "["+idx+"] ";
buffer.append("["+idx+"] ");
}
return buffer;
}
}