[Java] 자료형2 (String/StringBuffer/Array)

이용준·2022년 10월 24일
0

Java

목록 보기
5/29

1. 문자형(String)

문자열은 문장을 의미한다.

<리터럴 표기>
String a = "Be Happy";
String b = "Good job";

String a = new String("Be Happy");
String b = new String("Good job");
두 예제는 같은 의미이다.

new는 키워드 객체를 만들 때 사용한다.

'객체'를 다루기 전까지는 "새로 생성된 자료형" 정도의 의미로 알고 있도록 하자.

리터럴 표기법은 문자열을 intern pool이라는 곳에 저장하고 동일한 문자열이 선언될 경우 cache된 문자열을 리턴한다.
반면에 두번째 방식은 항상 새로운 String 객체를 생성한다.

1. 원시(primitive) 자료형

이전에 살펴본 int, long, double, float, boolean, char등을 자바는 원시(primitive) 자료형이라 한다.
이런 자료형들은 new 키워드로 그 값을 생성할 수 없으며, 아래와 같이 리터럴로만 생성할 수 있다.
(String은 리터럴로 표기가 가능하지만 primitive 자료형은 아니지만 리터럴로 표현식을 사용할 수 있는 특별 자료형이다!)

boolean result = true;
char capitalC = 'C';
int i = 100000;
  • 원시 자료형의 Wrapper 클래스

    원시자료형Wrapper 클래스
    intinteger
    longLong
    doubleDouble
    floatFloat
    booleanBoolean
    charChar
  • 앞으로 배울 ArrayList, HashMap, HashSet 등은 데이터 저장시 원시 자료형 대신 Wrapper 클래스 사용해야 한다.

  • Wrapper 클래스를 사용하면 값 대신 객체를 주고 받을 수 있어 객체 중심적 코드 작성에 유리하다.

  • 멀티스레딩 환경에서 동기화를 지원하기 위해 Wrapper 클래스가 반드시 필요하다.

    ##2. 문자열 내장 메소드
    String 자료형의 내장 메소드 중에 자주 사용되는 것을 알아보자

  • equals

    • 두 개의 문자열이 동일한지 비교해 리턴값 출력
    String a = "hello";
    String b = "java";
    String c = "hello;
    System.out.println(a.equals(b)); // false 출력
    System.out.println(a.equals(c)); // true 출력
    
    > == 연산자는 자료형이 동일한 객체인지 판별할 때 사용되므로 값 비교는 equals를 사용하도록 한다.
  • indexOf

    • 특정 문자가 시작되는 위치(인덱스)를 리턴한다.
    String a = "Hello Java";
    System.out.println(a.indexOf("Java")) // 6 출력
    "Java" 문자열은 일곱번째 문자('J')부터 시작된다.
  • contains

    • 문자열에 특정 문자열이 포함되어 있는지 여부 리턴
    String a = "Hello Java";
    System.out.println(a.contains("Java")); // true 출력
    문자열 a에 "Java"라는 문자열이 포함되었으므로 true 출력
  • charAt

    • 문자열에서 특정 위치의 문자(char)를 리턴한다.
    String a = "Hello Java";
    System.out.println(a.charAt(6)); // J 출력
  • replaceAll

    • 문자열에서 특정 문자열을 다른 문자열로 바꾸고자 할 때 사용한다.
    String a = "Hello Java";
    System.out.println(a.replcaAll("Hello","Bye")) // Bye Java 출력
  • substring

    • 문자열의 특정 부분 추출
    String a = "Hello Java";
    System.out.println(a.substring(0,4)); // Hell 출력 (단, 끝 위치는 포함되지 않음)
  • toUpperCase

    • 문자열 모두 대문자로 변경시 사용()
    String a = "Hello Java";
    System.out.println(a.toUpperCase(a)) // HELLO JAVA 출력
  • split

    • 문자열을 특정 구분자로 분리하는 메소드
    String a = "a:b:c";
    String[] result = a.split(":");  // result는 {"a" "b" "c"}
    ":"로 문자를 나눠 문자열 배열 생성

2. 문자열 포맷팅(Formatting)

2-1. 문자열 포매팅 따라하기

  • String.format
  1. 숫자(%d) 바로 대입하기

    System.out.println(String.format("I eat %d apples." 3)); // "I eat 3 apples" 출력(여기서 %d는 문자열 포맷 코드라 한다.)
  2. 문자열(%s) 바로 대입

    System.out.println(String.format("I eat $s appels.", "five")); // "I eat five apples." 출력
  3. 숫자 값을 나타내는 변수로 대입

    int number = 3;
    System.out.println(String.format("I eat %d apples.",number)); // "I eat 3 apples." 출력
  4. 두 개 이상의 값 넣기

    int number = 10;
    String day = "three";
    
    // "I ate 10 apples. so I was sick for three days." 출력
    System.out.println(String.format("i ate %d apples. so I was sick for %d days.",number, days));

2-2.문자열 포맷 코드

코드설명
%s문자열(String)
%c문자 1개(character)
%d정수(Integer)
%f부동소수(floating-point)
%o8진수
%x16진수
%%Literal % (문자%자체)

%s 포맷 코드는 어떤 형태의 값이든 변환해 넣을 수 있다.

System.out.println(String.format("I have %s apples.",3));  // "I have 3 apples" 출력
System.out.orintln(String.format("rate is %s", 3.234)); // "rate is 3.234" 출력

코드별 포맷이 있지만, %s를 사용하면 뒤에 오는 값을 문자열로 변경한다.

2-3. 포맷 코드와 숫자 함께 사용하기

  1. 정렬과 공백
    System.out.println(String.format("%10s", "hi")); // "        hi"출력
    전체 길이가 10개인 문자열 공간에서 대입되는 값을 오른쪽 정렬, 나머지는 공백 출력
  2. 소수점 표현하기
    System.out.println(String.format("%.4f",3.141592))' // 3.1415
    소수점(.)nf 번째까지 출력

2-4. System.out.printf

String.format 메소드는 ~.println 메소드를 함께 사용해야 하지만 prtinf 메소드를 사용한다면 String.format 메소드 없이도 동일하게 출력할 수 있다.
전자는 문자열을 리턴하는 메소드이도 후자는 문자열을 출력하는 메소드이다.

2.StringBuffer

StringBuffer는 문자열을 추가하거나 변경할때 주로 사용하는 자료형이다.

  1. append
  • 다음은 StringBuffer 객체와 문자열을 생성하는 예제이다.

    StringBuffer sb = new StringBuffer(); // StringBuffer 객체 sb 생성
    sb.append("hello");
    sb.append(" ");
    sb.append("jump to java");
    String result = sb.toString();
    System.out.println(result);
    
    > hello jump to java

    StringBuffer 자료형은 append 메소드를 사용해 문자열을 계속해 추가할 수 있으며, 위 예제와 같이 toString() 메소드를 이용하면 String 자료형으로 변경할 수 있다.

    String 자료형은 immutable하며, 다른 메소드와 사용시 새로운 String 객체를 생성해 리턴하는 것이다. 하지만 StringBuffer는 이와 반대로 mutable하며 한 번 생성된 값은 언제든지 수정할 수 있다.

    StringBuffer 자료형은 String 자료형보다 무거운 축에 속하며 메모리 사용량이 많고 속도도 느리다. 따라서 문자열의 추가나 변경이 많은 경우에는 StringBuffer를,
    그 외에 경우에는 String을 사용하는 것이 유리하다.

  1. insert
  • 특정 위치에 원하는 문자열 삽입.

    StringBuffer = new StringBuffer();
    sb.append("Jump to java");
    sb.insert(0,"hello")'
    System.out.println(sb.toString());
    
    >hello Jump to java
  1. substring
  • String 자료형의 substring 메소드와 동일하게 사용된다.

  • substring(시작위치, 끝위치)

    StringBuffer sb = new StringBuffer();
    sb.append("Halo jump to java");
    System.out.println(sb.substring(0,4));
    
    > Halo 

3.배열(Array)

출고된 계란판

배열은 크기(length)와 순서(index)가 고정되고 동일한 타입의 데이터 집합이다.
계란판은 크기와 순서, 형태가 고정되어 있으므로 배열과 비슷한 예가 아닐까 싶다

  • 자료형의 집합으로, 자료형 옆에[] 기호를 사용해 표현한다.
  • ex1) 1부터 10까지 홀수 모임의 집합
    int[] odds = {1,3,5,7,9};
  • ex2) 요일의 집합
    String[] weeks = {"월", "화", "수", "목", "금", "토", "일"}
  • 배열의 특징
    • 길이는 고정되어 있다.
    • 배열 값의 접근 방법은
    • 배열의 길이
    • 빈번한 배열의 오류

3-1.길이는 고정되어 있다.

위 요일 집합 예제는 다음과 같이 고쳐쓸 수 있다.

String[] weeks = new String[7]
weeks[0]="월";
weeks[1]="화";
weeks[3]="수";
weeks[4]="목";
weeks[5]="금";
weeks[6]="토";
weeks[7]="일";  

배열은 길이를 먼저 설정해 변수를 생성하고 값은 나중에 대입하는 방식이다. 따라서 초기값이 없는 배열 변수 생성시 반드시 길이가 정의되어야 한다.

(오류)
String[] weeks = new Sting[];  // 길이 정의가 없으므로 컴파일 오류 발생

3-2. 배열 값 접근

  • 요일의 배열중 "목"에 해당하는 값 인덱싱
    String[] weeks = {"월", "화", "수", "목", "금", "토", "일"}
    System.out.println(weeks[3]);

3-3. 배열의 길이(length)

배열의 길이는 다음과 같이 length를 이용해 구한다.

String[] weeks = {"월", "화", "수", "목", "금", "토", "일"}
for (int i=0 ; i<weeks.length ; i++){
  System.out.println(weeks[i]);
}

3-4. 빈번한 배열의 오류

 ArrayIndexOutOfBoundsException

해당 오류는 배열에서 자주 볼 수 있는 오류이다. 이는 배열의 범위를 넘어가는 값을 리턴하려 할 때 발생하는 것임으로,
현재 배열의 길이를 다시 확인해보도록 한다.

profile
뚝딱뚝딱

0개의 댓글