TIL / JAVA 2주차(4) / String 클래스

병아리코더 아카이브·2023년 8월 24일

JAVA

목록 보기
8/20
post-thumbnail

String 클래스

  • 프로그래밍에서 문자열를 다루는 것은 byte 와 char 뿐이다.

  • 그래서 본래 문자열(String) 은 char의 배열이다.

    ( char 은 2byte이다 )

  • String 클래스는 내용을 변경할 수 없는 불변 클래스이다.
    그래서 문자열끼리 결합 시 새로운 String 객체를 생성하게 된다.

  • 이 때, 덧셈 연산자끼리의 결합은 매번 새 객체를 생성하기 때문에 성능이 떨어져 문자열 결합 및 변경이 잦으면 내용변경이 가능한 StringBuffer 를 이용하는 것이 좋다.

String 리터럴

  • String 리터럴(상수)는 프로그램 실행 시 자동으로 생성되어
    constant pool(상수 저장소) 에 저장된다.

리터럴

변수에 넣는 변하지 않는 데이터값을 의미한다.
보통은 기본형의 데이터 를 의미하지만, 특정 객체(Immutable class , VO class)에 한에서는 리터럴이 될 수 있다.
여기서 String 은 불변클래스라 string 리터럴 이 가능하다.

empty 문자열 ("")

길이가 0인 char형 배열을 저장하는 문자열
char 과 String 의 초기화 시 null 보다는 "" 를 해주는 것이 좋다.

String 클래스의 초기화 방법

Stringchar[] 는 결국에 같은 문자배열이다.

  1. "" 사용 :
    String str = "Hello String";

  2. 객체 생성하여 사용 :
    String str = new String("Hello String");

  3. char[] 배열 생성하여 그 값을 객체 생성 매개변수로 사용 :
    char[] ch = new char[] {'H','e','l','l','o','','S','t','r','i','n','g','3'};
    String str = new STring(ch);

String 클래스의 생성자

  • String(char[] value) 를 통해 char[] -> String 전환
    반대로 toCharArray() 를 통해 String -> char[] 로 전환

String 클래스의 메서드

  • 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() 을 호출한 결과를 반환한다.

toString 메서드

객체를 문자열로 변환하기 위한 메서드.

Object 클래스의 toString( ) 메서드는 Card@19e0bfd 와 같이 반환해준다.
그래서 오버라이드하여 본인의 입맛대로 사용하는 경우가 많다.
이때 객체는 인스턴스 변수의 집합이기 때문에 인스턴스 변수를 문자열로 반환한 것을 오버라이드 하는게 일반적이다.

참고 : 자바의 정석 기초편 강의 https://www.youtube.com/watch?v=3cqJz9hIPD8&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=107

String 클래스 메서드 응용

로그인 -> 메인화면을 거쳐 파일명 검사를 해주는 페이지를 만들어보자.

  1. 로그인 페이지 제작

  • 만약 Controller 로부터 전송받은 msg 값이 빈문자열이 아니면 경고창을 띄워서 로그인 실패를 알려준다.
    (변수 초기화부터 "아이디 또는 비밀번호를 확인하세요." 여서 경고창이 뜬다.)

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

  • Controller 에서는 form 의 post 방식으로 전송받은 파라미터를 doPost() 메소드로 받는다.
  • 이때 post 방식으로 받은 데이터가 한글이면 깨져오기 때문에
    req.setCharacterEncoding("UTF-8") 로 깨짐을 방지한다.
  • id 와 pw 입력 시 실수로 앞뒤로 공백을 넣을 때, 앞뒤 공백을 제거해주는 String 클래스의 메서드 trim() 을 이용한다.
  • 아이디와 패스워드가 맞으면 메인 페이지로 넘어간다.
  • 자바에서는 JSP 와 달리 내장객체의 개념이 없어
    HttpServletRequest 클래스로부터 getSession()메서드를 이용하여 session 객체를 생성해야 한다.
  • 만들어진 session 객체를 HttpSession 타입의 변수에 저장한다.
  • 그 다음 setAttribute(key,value) 메서드를 통해 세션에 값을 저장한다.
  1. 메인 페이지 제작

  • 전달받은 msg 값이 빈문자열이 아니면 경고창이 뜬다.
  • 편의를 위해 입력태그의 기본값에 [image]test@image.jpeg 를 집어넣었다.

메인 페이지 컨트롤러 제작

  • 실질적인 일처리를 할 model 클래스 StringUtils 의 객체를 가져와
    check() 메서드 를 실행 시 결과값을 msg에 담아 main 페이지로 전달한다.

컨트롤러의 실질적 처리 모델 제작

  • String 클래스의 메서드 length() 을 이용해 입력태그의 값이 20자를 넘으면 경고문구를 반환하도록 하였다.
  • String 클래스의 메서드 contain() 을 이용해 @$#%& 가 있으면 경고문구를 반환하도록 하였다.
  • String 클래스의 메서드 startWith() 을 이용해 [img] 파일로 시작하지 않으면 경고문구를 반환하도록 하였다.
  • String 클래스의 메서드 endsWith() 을 이용해 확장자가 잘못되면 경고문구를 반환하도록 하였다.
  • String 클래스의 메서드 replace() 를 이용해 .jpeg 확장자를 .jpg 로 변환하게 하였다.
  • 이때 contain() , startWith() , endsWith() 은 존재여부에 따라 true/false 를 반환한다.
  • 허용되는 확장자를 썼는지 확인하기 위해 배열에 확장자를 담아 for 문을 사용한다. 이때 들어있으면 true 를 반환하고 반복문에서 탈출한다.
  • 만약 탈출하지 못하면 false 를 pass 변수에 저장하고 경고문구를 반환한다.

String 클래스 메서드 응용2

로그인 -> 메인화면에서 다른 문자열 기능을 추가해보자.

  1. 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 을 반환 하기 때문에 반복문이 종료된다.

etc

return 과 break

break 를 사용하면 해당 반복문 탈출한다.
마찬가지로 return 를 사용하면 반환값을 남기고 해당 메서드를 탈출한다.

@WebServlet("/")

@WebServlet("/") 의 슬래시는 전송시킨 요청을 다 받아들이라는 의미다.

0개의 댓글