분류 전체보기 294

PrintStream 객체

전체 구조 요약PrintStream fout = new PrintStream(fos);fout: PrintStream 객체 (문자 출력용)fos: FileOutputStream 객체 (바이트 출력용)fout은 내부적으로 fos를 감싸고 있습니다. 즉, PrintStream이 바깥쪽에 있고, 최종적으로 FileOutputStream이 파일로 출력합니다. 입력 데이터fout.print(70); fout.printf("%d %d", 70, 80);70과 80이라는 숫자를 fout을 통해 출력합니다.하지만 PrintStream은 숫자를 그대로 70, 80 바이트 값으로 저장하지 않고,👉 "문자 '7', 문자 '0'"처럼 문자열로 바꿔서 저장합니다. 버퍼 내부 모습 (이미지 왼쪽 박스)'7' '0' ' ' '8..

Java 2025.07.19

문자열과 문자열 객체

문자열 저장 방식: C 언어 vs Java"Hello"는 문자 'H', 'e', 'l', 'l', 'o', 그리고 마지막에 널 종료 문자 '\0'를 포함하여 저장됩니다."World!"도 마찬가지입니다.이 방식은 C언어 스타일 문자열로, 널 문자 \0를 만나면 문자열이 끝난다는 규칙을 따릅니다.정리C언어 스타일 문자열: 문자 배열 + 종료 문자 \0자바의 String은 이와 다름 → 객체로 관리 Java에서의 문자열 객체 구조new String("Hello")를 통해 생성된 문자열 객체는 객체 내부에 char 배열을 갖고 있습니다.이 객체는 다양한 메서드(length(), substring(), charAt() 등)를 통해 문자열을 다룰 수 있습니다.정리자바의 문자열은 객체로 다루며, 내부에 문자 배열을 ..

Java 2025.07.18

자바의 참조 변수에 주소가 들어있는가?

정확히는, 주소 그 자체가 들어있는 것은 아니지만, 주소처럼 동작하는 참조(reference)가 들어있다"즉, 주소를 직접 다루지는 않지만, 주소 기반으로 작동하는 참조값이 저장됩니다. 자바에는 포인터(pointer)가 없다C나 C++에서는 변수에 실제 주소값을 저장할 수 있습니다.예: int* p = &x; → p는 x의 메모리 주소를 가짐자바는 보안성과 안정성을 위해 메모리 주소를 직접 노출하거나 조작하는 기능을 제거했습니다.그래서 자바에는 &, *, malloc, free 같은 키워드가 없습니다. 그럼 자바의 참조 변수는 뭔가?String s = new String("hi");이때 s에는 문자열 "hi" 객체가 저장된 Heap 영역의 위치를 가리키는 내부적인 참조값이 저장됩니다.하지만 그 실제 ..

Java 2025.07.18

값 형식과 참조형식

값 형식(Value Type)과 참조 형식(Reference Type)이란?값 형식 (Value Type)int x = 7;변수 x는 값 그 자체(7) 를 직접 저장합니다.메모리 공간 안에 7이라는 숫자가 실제로 존재합니다.즉, 변수 이름이 값이 저장된 주소 공간을 직접 가리킵니다.기본형(primitive type): int, float, double, char, boolean 등 참조 형식 (Reference Type)FileOutputStream fos = new FileOutputStream("data.txt");변수 fos는 실제 파일 출력 스트림 객체를 가리키는 주소(참조값)만 저장합니다.fos 자체에는 객체가 있는 게 아니라, 객체가 있는 곳의 주소가 저장됨.객체는 new 연산자를 통해 Hea..

Java 2025.07.18

OutputStream 대신 사용하는 응용 스트림 (보조 스트림)

Java에서 파일에 데이터를 저장할 때는 보통 FileOutputStream을 기본 스트림으로 사용합니다. 하지만 이 스트림만으로는 문자 인코딩 처리나 숫자 저장을 효율적으로 하기 어렵습니다.그래서 자바에서는 OutputStream을 기반으로 하여 특화된 기능을 제공하는 응용 스트림(보조 스트림)을 제공합니다. 그 대표적인 예가 바로 PrintStream과 DataOutputStream입니다. 기본 스트림: FileOutputStreamFileOutputStream fos = new FileOutputStream("score.txt");FileOutputStream은 바이트 단위로 데이터를 파일에 출력하는 기본 스트림입니다.단점: 숫자든 문자든 바이트 배열로 직접 처리해야 하기 때문에 불편하고 비효율적일..

Java 2025.07.18

문자 인코딩 방식

각국의 문자코드 확장 방식 (EUC vs Unicode)ASCII 기반 문자코드처음에는 모든 컴퓨터가 ASCII 코드(7비트)만 썼습니다.영어 대소문자, 숫자, 특수기호 등만 표현 가능128개 문자만 표현국가별 문자 확장 (EUC)각 나라는 ASCII를 기반으로 자국어 문자를 확장했습니다. 이걸 EUC (Extended Unix Code)라고 합니다.EUC-KR: ASCII + 한글EUC-JP: ASCII + 일본어EUC-CN: ASCII + 중국어예: C8B00F이라는 바이트는 EUC-KR에서는 "효", EUC-JP에서는 "反", EUC-CN에서는 또 다른 글자.→ 같은 바이트라도 국가별로 의미가 달라지는 문제 발생!Unicode의 등장이 문제를 해결하기 위해 Unicode가 등장합니다.ASCII는 유..

Java 2025.07.18

파일 출력

자바에서 fos.write('A'); 한 줄의 흐름우리가 단순히 fos.write('A')라고 작성하면, 내부적으로는 아래와 같은 복잡한 과정을 거쳐 디스크에 저장됩니다. 1단계: 문자 → 코드 변환 (Encoding)fos.write('A');여기서 'A'는 문자입니다.자바 내부에서는 이 문자를 UTF-8 / UTF-16 / UTF-32 등으로 인코딩합니다.'A'는 UTF-8에서 0x41, 즉 65번입니다.인코딩에 따라 바이트 수가 달라질 수 있습니다:ASCII / UTF-8: 1바이트UTF-16: 2바이트UTF-32: 4바이트2단계: BOM 및 Endian 결정문자를 바이트로 변환할 때, 문자열의 바이트 순서를 정하는 문제가 있습니다.BOM(Byte Order Mark): 인코딩 방식 표시Endian..

Java 2025.07.18

정수와 부동소수

정수 값 표현 방법우리는 숫자 26이라는 정수를 컴퓨터에 저장할 때 여러 가지 방식으로 표현할 수 있습니다. 크게 크기와 진법이라는 두 가지 관점에서 나눌 수 있습니다.정수 크기 (비트 수)26이라는 값은 8비트, 16비트, 32비트, 64비트 중 어떤 크기에서도 표현할 수 있습니다.자바(Java)에서는 다음과 같이 변수형(type)에 따라 비트 크기가 결정됩니다:byte → 8비트short → 16비트int → 32비트 (기본)long → 64비트 (L 또는 l을 붙임)예:26 → 기본적으로 int로 인식 (32비트)26L → long 형으로 인식 (64비트)진법에 따른 표현정수 26은 진법에 따라 아래와 같이 표현됩니다:진법표현 방법접두사2진수0b110100b8진수032010진수26없음16진수0x1A..

Java 2025.07.18

WORA를 위한 자바 프로그래밍

왜 자바는 WORA가 가능한가?WORA는 "한 번 작성한 코드는 어디서나 실행될 수 있어야 한다"는 자바의 철학입니다. 그런데 컴퓨터는 운영체제도 다르고, CPU 구조(Intel, ARM 등)도 다릅니다. 이기종 환경에서 하나의 코드를 동일하게 실행시키기란 쉽지 않습니다. 그런데 자바는 어떻게 그걸 해내는 걸까요?전통적인 언어(C, C++ 등)의 문제점보통 전통적인 언어에서는 아래와 같은 과정을 거칩니다:개발자가 코드 작성 int x = 3 + 4; 컴파일러가 이 코드를 번역컴파일러는 해당 컴퓨터(CPU)에 맞는 기계어로 번역합니다.기계어 코드가 실행됨예: Intel용 기계어는 Intel에서만 실행 가능그래서 Intel CPU에서 컴파일한 프로그램은 Apple M1 같은 ARM 기반에서는 실행이 안 됩니..

Java 2025.07.18

자바 언어의 탄생배경

하드웨어 종속에서 자유로워지기 위한 여정하드웨어마다 다 달라서 생긴 문제옛날에는 C 언어를 사용해 프로그램을 만들었습니다. 그런데 큰 문제가 있었습니다.운영체제(OS) 가 다르면 프로그램이 실행되지 않았습니다.CPU 종류가 다르면 명령어 체계도 달라서 동일한 프로그램도 각각 따로 만들어야 했습니다.예를 들어 한 회사에서 만든 전자기기 A, B, C가 있다고 합시다. 이 각각의 기기마다 CPU가 다르고 운영체제도 다르다면, 프로그램도 각각 따로 만들어야 했던 겁니다.➡️ 매우 비효율적이고, 유지보수도 어려운 구조였습니다. C언어는 강력했지만, 하드웨어에 너무 의존적이었다C 언어는 컴파일하면 바로 기계어로 바뀌기 때문에 속도는 빠릅니다. 하지만 문제는…컴파일된 실행파일은 해당 OS와 CPU에만 동작다른 환경..

Java 2025.07.18