일지이기 때문에 일기의 성격이 더 강합니다.

React가 완전히 종료되고 java를 시작한다. 서비스 프로그래밍 언어 java, 한국은 왜 파이썬을 안 쓰는지 아직도 의문이다.
React:useState 이용 CRUD
useState를 이용하여 Create, Read, Update, Delete를 해보았다. 실제로는 Create와 Read만 했지만, 다음과 같은 방식이라고 할 수 있다. 대략적으로 이야기하면 이런 느낌이다.
부모 컴포넌트:
import { useState } from 'react';
import FormBlock from './FormBlock';
function Parent() {
const [items, setItems] = useState([
{ id: 1, name: '첫 번째' },
{ id: 2, name: '두 번째' },
]);
const [nextId, setNextId] = useState(3);
const handleAdd = (name) => {
const newItem = { id: nextId, name };
setItems([...items, newItem]);
setNextId(nextId + 1);
};
return (
<div>
<ul>
{items.map((item) => (
<li key={item.id}>{item.name}</li>
))}
</ul>
<FormBlock onAdd={handleAdd} />
</div>
);
}
export default Parent;
useState를 사용하여 items를 만든다(데이터라고 할 수 있다.) 미리 만들어져 있을 경우(id 1, id 2처럼) 다음 id는 useState를 이용하여 초기값을 3으로 세팅했다(아무것도 없다면 0으로 세팅한다.)
그리고 handleAdd 함수를 만들어 set 함수로 값을 업데이트 한다.
자식 컴포넌트:
import { useState } from 'react';
function FormBlock(props) {
const [inputVal, setInputVal] = useState('');
const handleSubmit = (e) => {
e.preventDefault();
if (inputVal.trim() === '') return;
props.onAdd(inputVal);
setInputVal('');
};
return (
<form onSubmit={handleSubmit}>
<input
type="text"
value={inputVal}
onChange={(e) => setInputVal(e.target.value)}
/>
<button type="submit">추가</button>
</form>
);
}
export default FormBlock;
자식에서는 값을 넘길 form을 만든다. value를 useState로 썼지만 반드시 그러지는 않아도 된다. submit function으로 기존 이벤트를 막고, props.onAdd로 부모 컴포넌트에 업로드한다(부모 컴포넌트에 있는 formBlock onAdd={handleAdd}를 보자). 그렇게 하면 이제 상태가 업데이트가 되고, li 또한 items에 따라서 추가되게 된다.
참고로 React에서는 map이 더 자주 쓰인다. 배열을 돌며 컴포넌트/요소를 반복해서 그리는 용도로서, for보다 자주 쓰인다.
{배열.map((요소) => (
<태그 key={고유값}>{요소.속성}</태그>
))}
java:java의 동작
Java란
java는 고급언어로, 범용, 메모리-안전, 객체지향의 프로그래밍 언어다. 1995년 썬마이크로시스템즈Sun Microsystems에서 최초 발표했다. 이후 2010년에 오라클에서 썬을 인수하면서 Java 개발,관리,배포를 주관 중이다. 현재 백엔드의 대부분은 java와 함께하고 있다 봐도 무방하다.
java의 특징에 대해서는 TIL에 정리해둔 게 있다.
https://bbbbabbbababababa.tistory.com/29
[Java 풀스택 개발자] Java의 용어와 개념: 낯선 Java를 친숙하게 만들어보자!
0. 들어가기에 앞서본래는 특별편인 React 실전으로 먼저 만나려고 했다. 그러나 생각보다 만들려던 것의 규모가 커지면서 다음 기회에 포스팅하게 되었다. 따라서 이번 주는 한국의 백엔드 중심
bbbbabbbababababa.tistory.com
간단히 다시 정리해본다.
1. 플랫폼 독립적
2. 자바 전용 가상머신 JVM이 존재
3. Write Once Run Anywhere라는 철학
4. 컴파일 언어
JVM이 존재하기 때문에 그때그때 실행하여 확인하는 것이 가능하다.
그리고 java는 클래스, 패키지, 프로젝트, API로 이루어져 있다고 할 수 있다.
- 클래스 (Class)
객체의 설계도. 필드와 메서드를 묶어 둔 단위이다.
하나의 .java 파일에는 보통 public 클래스 하나를 둔다. - 패키지 (Package)
클래스들을 묶는 폴더. package com.example.util; 처럼 선언하고, 디렉터리 구조와 맞춘다.
이름 충돌을 줄이고, 관련 클래스를 묶어서 관리할 때 쓰는 편.
참고로 대부분 도메인 명을 사용한다. - 프로젝트 (Project)
한 덩어리로 만드는 작업 단위. 여러 패키지·클래스·설정·리소스를 묶어서 하나의 프로그램(또는 서비스)으로 만든 것이라 할 수 있다. - API (Application Programming Interface)
이렇게 부르면 이렇게 동작한다라고 정해 둔 규칙·인터페이스.
자바 API = JDK가 제공하는 클래스/메서드들 (예: String, ArrayList, Scanner).
외부 API = 다른 서비스(웹 등)가 제공하는 호출 방법을 사용한다.
java:기본 문법
주석 처리의 경우 일반적인 주석처리와 크게 다르지 않다. //으로 한줄, /* */ 으로 여러줄 주석처리가 가능하다.
Literal
java는 정적 타이핑언어이기 때문에 모든 필드에는 형(타입)을 정해줘야 한다. 그리고 값을 저장하는데 이때 코드에 쓴 값을 리터럴이라고 한다. 좁은 의미로 볼 때는 기본형이 아닌 형에서의 저장하는 값은 리터럴이라고 부르지 않는다.
private byte a;
private short b;
private int c;
private long d;
private float e;
private double f;
private char g;
private boolean h;
위 8가지가 java에서 사용되는 기본형이다. 여기에 형에 맞춘 값을 입력하면 이것이 리터럴이 된다. 그리고 그 외에는 전부 참조형이라고 봐도 된다.
Final
상수 예약어이다. 형 앞에 사용된다.
final int A = 0;
이렇게 사용하면 된다. final의 경우 필드명을 대문자로 쓰는 것이 관례이다. 또한 상수이니만큼 수정이 불가능하다.
DataType
위에서 Literal을 말하면서 형도 말해버렸다. 타입에 따른 메모리 할당 크기를 TIL에서 다룬 적이 있어 이미지를 그대로 사용하겠다.

참고로 메모리가 더 작은 DataType에 큰 DataType을 넣으면 오류가 일어난다. 표현 범위를 벗어나기 때문이다. 이 때문에 강제 형변환을 사용하며, 이 경우 큰 DataType은 앞에서 잘리니 주의하자.
형변환
자동 형변환과 강제 형변환이 있다.
자동의 경우 연산 중 발생한다. 예제는 다음과 같다.
// 정수: 작은 타입 → 큰 타입 (값 손실 없음)
byte b = 10;
int i = b; // byte → int
long l = i; // int → long
// 정수 → 실수
int num = 100;
double d = num; // int → double (100.0)
float f = num; // int → float
// 실수: float → double
float f2 = 3.14f;
double d2 = f2; // float → double
// 연산 시에도 자동 승격
int a = 10;
double b = 3.5;
double result = a + b; // a가 double로 승격 후 연산 → 13.5
강제 형변환의 경우 (변환할 타입) 변환할 필드 형태로 변환이 가능하다. Casting이라고도 한다.
스캐너 이용한 Input
Scanner API를 이용하여 Input을 사용할 수 있다.
Scanner sc = new Scanner(System.in);
처럼 사용하며, import java.util.Scanner; 로 import가 선행되어야 한다. 전체 예제는 다음과 같다.
import java.util.Scanner;
public class ScannerEx {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("정수 입력 : ");
int num = sc.nextInt();
System.out.print("실수 입력 : ");
double d = sc.nextDouble();
System.out.print("단어 입력 : ");
String word = sc.next();
sc.nextLine();
System.out.print("한 줄 입력 : ");
String line = sc.nextLine();
System.out.println("정수: " + num);
System.out.println("실수: " + d);
System.out.println("단어: " + word);
System.out.println("한 줄: " + line);
sc.close();
}
}
보다시피 각 타입에 따라서 입력해야하는 메서드가 다르다. 정수라면 nextInt(), 실수라면 nextDouble(), String이라면 next()이다. 띄어쓰기를 기준으로 구분하기 때문에, nextLine()을 사용하기도 한다. nextInt() / next() 다음에 nextLine() 쓸 때는, 그 앞에 sc.nextLine();를 한 번 넣어 버퍼에 남은 엔터를 비워 주는 게 좋다고 한다.
'부트캠프 일지 > Java 풀스택 과정 강의' 카테고리의 다른 글
| [Java 풀스택 과정 강의] 1월 29일 (0) | 2026.02.05 |
|---|---|
| [Java 풀스택 과정 강의] 1월 28일 (0) | 2026.02.05 |
| [Java 풀스택 과정 강의] 1월 26일 (0) | 2026.02.04 |
| [Java 풀스택 과정 강의] 1월 23일 (0) | 2026.02.04 |
| [Java 풀스택 과정 강의] 1월 22일 (0) | 2026.02.04 |
