25.03.05 (수) 17일차 Java

허배령·2025년 3월 5일

괴발개발 TIL

목록 보기
18/54

String(불변)

  • 불변성 (Immutable) : String 객체는 한 번 생성되면 그 내용을 변경할 수 없음. 공간이 변하는게 아닌 다른 공간에 새로운 것이 생김.

  • 비동기화 : String은 동기화를 제공하지 않음. 따라서 멀티 스레드 환경에서는 안전하지 않으나, 단일 스레드 환경에서 사용하기 적합함.

String str = "Hello";
String str2 = "Hello";
서로 다름
String str3 = new String("Hello");

String str = "Hello"; // 1234
str2 = str + "world";

StringBuilder(가변)

  • 가변성 (Mutable) : StringBuilder는 문자열을 변경할 수 있다.
    즉, 문자열 연산 시 새로운 객체를 생성하지 않고, 기존 객체의 내용을 변경한다.

  • 비동기화 : StringBuilder는 동기화를 제공하지 않음. 마찬가지로 멀티보다 단일스레드 환경에서 적합.

StringBuffer(가변)

  • 가변성 (Mutable) : StringBuffer는 문자열을 변경할 수 있다.
    즉, 문자열 연산 시 새로운 객체를 생성하지 않고, 기존 객체의 내용을 변경한다.

  • 동기화 (Thread-Safe) : StringBuffer는 모든 메서드가 synchronized 키워드를 사용하여 동기화 되어 있다. 따라서 멀티스레드 환경에서 안전하지만, 동기화로 인한 성능 저하가 발생할 수 있다.

결론적으로 중요한 사실은, StringBuffer와 StringBuilder 는 가변성을 띄기 때문에 기존
문자열에 추가적인 연산이 일어나도 새로운 객체를 생성하지 않고, 기존 객체의 내용을 변
경한다는 점이다.

정리

오버헤드(Overhead)란?
어떤 작업을 수행하는 데 있어서
직접적인 결과를 얻기 위해 필요한 추가적인 시간, 메모리, 또는 자원을 의미.

입출력(IO)

Input : 입력, 외부에서 내부로 값이 들어오는 것. Scanner
Output : 출력, 내부에서 외부로 값이 나가는 것. Println
Stream : 외부와 내부를 이어주는 통로

File 클래스

  • 파일 시스템의 파일을 표현하는 클래스
  • 파일 크기, 파일 속성, 파일 이름 등의 정보와 파일 생성 및 삭제 기능 제공

File 객체 생성

File file = new File("파일 경로");
File file = new File("C:/dev/test.txt");

파일/디렉토리 생성 및 삭제 메서드

파일/디렉토리 정보 리턴 메서드


스트림(Stream) 클래스

  • 데이터를 읽고 쓰기 위해서 자바에서 제공
  • 모든 스트림은 단방향
  • 하나의 스트림으로 입출력을 동시에 할 수 없어 동시에 수행하려면 2개의 스트림 필요

바이트 기반 스트림은 1Byte만 가능

스트림 클래스 종류

InputStream

  • 바이트 기반 입력 스트림의 최상위 클래스로 추상클래스임

FileInputStream

  • 파일을 바이트 단위로 읽을 때 사용
  • 그림, 오디오, 비디오, 텍스트 파일 등 모든 종류의 파일 읽기 가능
  • InputStream의 하위 클래스로 InputStream과 사용 방법 동일

    객체 생성

    • FileInputStream객체가 생성될 때 파일과 직접 연결 됨
    • 만약 파일이 존재하지 않으면 FileNotFoundException이 발생하므로 예외처리 필수
    FileInputStream fis = new FileInputStream("C:/dev/test.txt");

OutputStream

  • 바이트 기반 출력 스트림의 최상위 클래스로 추상클래스임

FileOutputStream

  • 파일을 바이트 단위로 저장할 때 사용
  • 그림, 오디오, 비디오, 텍스트 파일 등 모든 종류의 데이터를 파일로 저장
  • OutputStream의 하위 클래스로 OutputStream과 사용 방법 동일

    객체생성

    • FileOutputStream객체가 생성될 때 파일과 직접 연결 됨
    • 만약 파일이 존재하지 않으면 자동으로 생성하지만
      이미 파일이 존재하는 경우 파일을 덮어쓰는 단점이 있음
    FileOutputStream fos = new FileOutputStream("C:/data/test.txt");

    만일 기존 파일에 이어서 계속 작성하고 싶다면 아래 예제처럼 객체 생성 시 가능

    FileOutputStream fos = new FileOutputStream("C:/data/test.txt", true);

Reader

  • 문자 기반 입력 스트림의 최상위 클래스로 추상클래스임

FileReader

  • 문자 단위로 텍스트 기반 파일을 읽을 때 사용
  • 텍스트가 아닌 그림, 오디오, 비디오 등의 파일은 읽기 불가능
  • Reader의 하위 클래스로 Reader와 사용 방법 동일

객체생성

  • FileReader객체가 생성될 때 파일과 직접 연결 됨
  • 만약 파일이 존재하지 않으면 FileNotFoundException이 발생하므로 예외처리 필수
FileReader fr = new FileReader("C:/dev/test.txt");
FileReader fr = new FileReader(new File("C:/dev/test.txt"));

Writer

  • 문자 기반 출력 스트림의 최상위 클래스로 추상클래스임

FileWriter

  • 문자 단위로 텍스트 기반 파일을 쓸(저장할) 때 사용
  • 텍스트가 아닌 그림, 오디오, 비디오 등의 파일은 저장 불가능
  • Writer의 하위 클래스로 Writer와 사용 방법 동일

객체생성

  • FileWriter객체가 생성될 때 파일과 직접 연결 됨
  • 만약 파일이 존재하지 않으면 자동으로 생성하지만
    이미 파일이 존재하는 경우 파일을 덮어쓰는 단점이 있음
FileWriter fw = new FileWriter("C:/data/test.txt");

만일 기존 파일에 이어서 계속 작성하고 싶다면 아래 예제처럼 객체 생성 시 가능

FileWriter fw = new FileWriter("C:/data/test.txt", true);

보조 스트림

  • 스트림의 기능을 향상시키거나 새로운 기능을 추가하기 위해 사용
  • 보조 스트림은 실제 데이터를 주고 받는 스트림이 아니기 때문에 입출력 처리 불가능
  • 기반 스트림을 먼저 생성한 후 이를 이용하여 보조 스트림 생성

보조 스트림 종류

  • 문자 변환(InputStreamReader/OutputStreamWriter),
  • 입출력 성능(BufferedInputStream/BufferedOutputStream),
  • 기본 데이터 타입 출력(DataInputStream, DataOutputStream),
  • 객체 입출력(ObjectInputStream/ObjectOutputStream) 등의 기능을 제공하는 보조스트림이 있음
FileInputStream fis = new FileInputStream("sample.txt"); //기반 스트림 생성
BufferedInputStream bis = new BufferedInputStream(fis); //보조스트림 생성
bis.read(); //보조스트림으로부터 데이터 읽어옴

성능 향상 보조 스트림

  • 느린 속도로 인해 입출력 성능에 영향을 미치는 입출력 소스를 이용하는 경우 사용
  • 입출력 소스와 직접 작업하지 않고 버퍼에 데이터를 보아 한꺼번에 작업을 하여 실행 성능 향상
    (입출력 횟수 줄임)

기본타입 입출력 보조 스트림

  • 기본 자료형 별 데이터 읽고 쓰기가 가능하도록 기능 제공
    단, 입력된 자료형의 순서와 출력될 자료형의 순서 일치

객체 입출력 보조 스트림

  • 객체를 파일 또는 네트워크로 입출력 할 수 있는 기능 제공
    단, 객체는 문자가 아니므로 바이트 기반 스트림으로 데이터를 변경해주는 직렬화 필수

직렬화와 역직렬화

직렬화(Serialization)

Serializable 인터페이스를 implements하여 구현
객체 직렬화 시 private 필드를 포함한 모든 필드를 바이트로 변환하지만
transient키워드를 사용한 필드는 직렬화에서 제외

역직렬화(Deserialization)

직렬화된 객체를 역직렬화할 때는 직렬화 했을 때와 같은 클래스 사용
단, 클래스 이름이 같더라도 클래스 내용이 변경된 경우 역직렬화 실패

serialVersionUID 필드

직렬화한 클래스와 같은 클래스임을 알려주는 식별자 역할로 컴파일 시 JVM이 자동으로
serialViersionUID 정적 필드를 추가해줘 별도로 작성하지 않아도 오류는 나지 않지만
자동 생성 시 역직렬화에서 예상하지 못한 InvalidClassException을 유발할 수 있음

private static final long serialVersionUID = -6423919775137290062L;

문자 변환 보조 스트림

  • 소스 스트림이 바이트 기반 스트림이지만 데이터가 문자일 경우 사용
  • Reader와 Writer는 문자 단위로 입출력을 하기 때문에 데이터가 문자인 경우
    바이트 기반 스트림보다 편리하게 사용 가능
profile
인생은 변수

0개의 댓글