[첫 번 째 의문점] return
리액트에서는 useState로 상태를 저장하며 컴포넌트에 전달할 때 return 또는 props로 전달하여 사용한다.
데이터 흐름은 단방향, 즉 위-> 아래
그러나 java에서는 필드에 저장하고 private int lastResult
return으로 다른 메서드나 클래스에게 전달하며 getResult()
메서드 호출 or 참조 기반의 데이터 흐름이다
저장: setter(void)
전달: getter(return) => 값을 객체 밖으로 꺼낼 필요가 있을 때만 return
예를들어
const [count, setCount] = useState(0);
// 자식에게 전달하려면
return <Child count={count} />;
count 값을 다른 컴포넌트에 props로 넘겨주는데 return과 비슷한 역할을 한다.
그러나 자바에서는
ResultManager manager = new ResultManager();
manager.saveResult(42); // 저장만 함 (void)
int result = manager.getResult(); // 그걸 꺼내서 써야 함 (return)
값 저장과 전달이 명확하게 분리해서 구현한다.
즉 보관과 전달을 명확히 나누는 게 바로 객체지향
- saveResult()는 값만 보관해두는 행위
- getResult()는 값을 꺼내서 전달하는 행위
객체지향(OOP)의 핵심
데이터는 객체 안에 숨기고 외부에서는 꼭 필요한 기능만 꺼내서 써야 한다.
그래서 값을 저장할땐 setter, 값을 꺼낼 땐 getter 메서드를 이용한다. <= 이 부분이 와닿지 않았던 이유임
객체는 데이터와 행동을 함께 묶고, 외부에는 최소한만 공개한다.
다른 개념으로는 캡슐화 : 데이터를 직접 return하거나 막 건드리는 걸 막고, 제어된 방식으로만 다룰 수 있게 만든 것
객체 지향의 특징 3가지
- 캡슐화
private int lastResult <= 외부에서 직접 접근 못함
- 추상화
saveResult()와 getResult()만 알면 됨<= 내부 구조 몰라도 됨
- 책임 분리
ResultManager는 저장/출력만 담당 <= 계산은 Calculator가 함(SRP)
정리해보자면, 자바의 객체지향은 데이터를 객체 내부에 숨기고, setter로 보관하고 getter로 전달하는 구조를 통해 캡슐화와 책임 분리를 실현한다.
이는 React의 단방향 데이터 흐름과는 다르게, 메서드 호출을 통해 명시적으로 값을 꺼내는 방식이며, 바로 이 점이 객체지향 철학을 반영한 구조라고 할 수 있다.
[두 번 째 의문점] props 개념이 없는 건가?
function Child({ name }) {
return <p>Hello, {name}</p>;
}
<Child name="Hansol" /> // props 전달
props란 컴포넌트가 외부로부터 데이터를 전달 받는 수단인데, 값을 상위에서 하위로 함수 파라미터로 넘겨서 사용하는 것.
리액트의 props가 자바에서는 생성자 인자, 메서드 인자, setter와 비슷한 것 같다.
props처럼 하나로 묶여있지 않지만, 객체지향에서는 필요한 데이터를 객체에게 주입하는 방식으로 처리한다.
신기함..
public class Person {
private String name;
public Person(String name) { // ← props처럼 외부에서 주입
this.name = name;
}
public void sayHello() {
System.out.println("Hello, " + name);
}
}
Person p = new Person("Hansol"); // 마치 props처럼 값을 전달
p.sayHello(); // 출력: Hello, Hansol
Person p = new Person();
p.setName("Hansol"); // 외부에서 상태 전달
public void greet(String name) {
System.out.println("Hello, " + name);
}
-> 이건 일회성 데이터 전달 (props처럼 읽기 전용 성격)
헷갈렸던 부분은 단순히 인스턴스화해서 값을 전달하여 사용하는 것인가였다.
값을 전달하려면 반드시 파라미터로 직접 넘겨줘야 하는데 별도의 넘기는 작업을 하지 않아서 어색했던 거다.
public class Child {
private String name;
public Child(String name) {
this.name = name;
}
public void sayHello() {
System.out.println("Hello, " + name);
}
}
public class App {
public static void main(String[] args) {
Child child = new Child("Hansol"); // ← 여기서 직접 전달
child.sayHello();
}
}
위 코드에서 자바는 값을 직접 전달한다. (이때 값을 안넣어주면 null)
반드시 인스턴스화 이후에 명시적으로 값을 전달해야 한다.
정리하자면, 자바는 리액트와 다르게 값을 전달하려면 생성자, 메서드, setter로 직접 넘겨줘야 하며 props처럼 구조 따라 자동으로 전달되기 않기 때문에 반드시 명시적으로 값을 넣어야 한다.
입력받은 값은 넘겨줘야 되므로 return, 저장한 건 객체 안에서 저장되기 때문에 void
'Spring_부캠' 카테고리의 다른 글
[Spring] Spring! (1) | 2025.07.22 |
---|---|
[Java] 제발 기억해 (0) | 2025.07.18 |
[Java] SSR & Refactoring (0) | 2025.07.15 |
[JAVA] MORE.1 (2) | 2025.07.08 |
[JAVA] Level.1_Calculator (0) | 2025.07.07 |