[JAVA] JAVA 메모장

Updated:

BufferedReader

  • 키보드로 부터의 입력이 있을 때마다 한 문자씩 버퍼로 전송 > 버퍼가 가득 차거나, 개행 문자가 나타나면 버퍼의 내용을 프로그램에 한 번에 전송

  • 임시 메모리 영역에 데이터를 모아뒀다가 한 번에 전송하여 효율적!

  • Enter만 경계로 인식

  • 데이터가 String으로 고정되기 때문에 다른 자료형으로 입력을 받기 위해서는 형변환 필수

[사용법]

import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        // 콘솔에서 입력 받을 경우
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String s = br.readLine();

        // 파일에서 입력 받을 경우 
        FileReader fr = new FileReader("파일 이름");
        BufferedReader br_f = new BufferedReader(fr);

        // 형 변환 입력 
        // 정수
        int n = Integer.parseInt(br.readLine());

        // char 배열 toCharArray() 메소드 사용
        char c[] = br.readLine().toCharArray();

        // 입출력 후 답아주기
        br.close();
    }
}


StringTokenizer

  • 지정한 구분자로 문자열을 쪼개주는 클래스

  • public StringTokenizer(String str); : 절달된 매개변수 str을 기본(default) delim으로 분리, 기본 delimiter는 공백 문자들인 “ \t\n\r\t”

  • public StringTokenizer(String str,String delim); - 특정 delim으로 문자열을 분리

  • public StringTokenizer(String str,String delim,boolean returnDelims); - str을 특정 delim으로 분리시키는데 그 delim까지 token으로 포함할지를 결정, 그 매개변수가 returnDelims로 true일시 포함, false일땐 포함하지 않음

[사용법]

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();

StringTokenizer st = new StringTokenizer(s);

int H = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());

int H = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int S = Integer.parseInt(st.nextToken());


String

String은 문자열 객체의 인스턴스 주소를 담고있는 참조형 변수

문자열 리터럴 생성 방식

String str = "Hi";

위와 같이 생성하면 str 변수는 stack 메모리에 “Hi”는 Heap 메모리 내의 String Constant pool영역에 저장되고 그 주소가 str 변수에 저장

String Constant pool은 HashMap 형태이기 때문에 중복된 데이터 저장 X => 따라서 동일한 문자열의 경우 같은 메모리 주소를 가짐

값이 같을 경우 기존 값의 메모리 주소를 리턴, 다른 값일 경우 새로운 객체를 생성해 값을 저장하고 그 메모리 주소를 리턴

new 연산자를 이용한 생성 방식

String str = new String("Hi");

new 연산자를 사용하여 생성하면 “Hi” 값이 일반 Heap 메모리 영역에 저장

new 연산자로 String 객체를 생성한 경우 각각의 인스턴스가 생성되고 변수는 각각의 문자열을 참조

String은 char형의 배열 형태로 저장되기 때문에 아래와 같이 생성 가능

// String 객체는 내부적으로 char 배열에 데이터를 저장하여 보관
String str = new String(new char[n]);

// char 배열 초기값 = "\u0000", "\0"
str = str.replace("\u0000", "수박");


== 연산, equals()

equals() 메소드는 단순하게 문자열의 값을 비교

== 연산은 객체의 주소값을 비교

String a = "수박";
String b = "수박";
String c = new String("수박");

boolean check1 = a == b; // true
boolean check2 = a == c; // false

System.out.println("a == b " + check1); // a == b true
System.out.println("a == c " + check2); // a == c false

System.out.println(a.equals(c));  // true

리터럴로 생성한 String을 비교할 경우 true

리터럴로 생성한 String과 new 연산자를 사용하여 생성한 String을 비교할 경우 false

문자열 리터럴의 경우 내부적으로 String의 intern() 메소드 호출

intern() 메소드는 해당 문자열이 String Constant Pool에 이미 있는 경우에는 그 문자열의 주소값을 반환하고 없다면 새로 집어넣고 그 주소값을 반환


문자열 결합 방법

  • ’+’ 연산자
  • concat()메소드

java 1.5 버전 이전 > 두 방식 다 문자열끼리 더한 후 새로운 인스턴스를 생성하여 결과 값을 저장, 새로운 메모리 주소를 리턴


StringBuilder, StringBuffer

java 1.5버전 이후 > 효율적인 문자열 결합을 위해 등장

append() 메소드를 사용하여 문자열을 결합하면 하나의 메모리 주소만을 가짐

StringBuilder sb = new StringBuffer();

for (int i = 0; i < n; i++) {
    sb.append("수박");
}

’+’ 연산자를 사용한 문자열 결합 방식이 내부적으로는 StringBuilder를 생성해 append()로 문자열을 결합하도록 변경

equals() 메소드로 값 비교 불가

toString().equals() String 인스턴스를 얻은 후 비교해줘야함

  • StringBuilder 동기화 제공 x > 속도가 빠름
  • StringBuffer 동기화 제공 o > 속도가 느림 > 멀티스레드 환경에서 동시에 객체에 접근하는 경우 사용


참고 Java String 에 대해 깊게 파고들어 보자~!

참고 자바의 String 객체와 String 리터럴

Tags:

Categories:

Updated:

Leave a comment