System.out.println()에서
System.out은 PrintStream 객체이고,
그 객체의 println() 메서드를 호출하는 겁니다.
PrintStream객체라면서 왜 System.out인가?
-> out이 선언된 위치가 중요
- out은 System 클래스의 static 변수
- 타입이 PrintStream이라는 뜻이지, PrintStream 클래스 안에 정의된 게 아니다.
그러니까, PrintStream.out는 ❌틀린표현이다
PrintStream 클래스 안에는 out이라는 static 변수가 없음
✅ System 클래스 안에 out이라는 static 변수가 존재 하기때문에 System.out이라고 써야한다
"변수는 그냥 값 담는 건데, 어떻게 뒤에 메서드가 붙어요?"
객체 뒤에 메서드가 붙어야하는거아닌가요?
→ 변수에는 객체가 들어 있을 수 있고,
그 객체는 메서드를 가질 수 있기 때문입니다.
- sc는 변수지만 그 안에 Scanner 객체가 있으므로
- sc.nextLine()이 되는 거예요.
System.out.println()도 같은 원리입니다.
또한ystem.out.println()
System.out은 PrintStream 객체이고,
그 객체의 println() 메서드를 호출하는 겁니다.
PrintStream객체라면서 왜 System.out인가?
-> out이 선언된 위치가 중요
public final class System { public static final PrintStream out = ...; }
out은 System 클래스의 static 변수
타입이 PrintStream이라는 뜻이지, PrintStream 클래스 안에 정의된 게 아니다.
그러니까,
PrintStream.out ❌ PrintStream 클래스 안에는 out이라는 static 변수가 없음
System.out ✅ System 클래스 안에 out이라는 static 변수가 존재
변수 뒤에 .메서드() 붙이는 이유
"변수는 그냥 값 담는 건데, 어떻게 뒤에 메서드가 붙어요?"
객체 뒤에 메서드가 붙어야하는거아닌가요?
→ 변수에는 객체가 들어 있을 수 있고,
그 객체는 메서드를 가질 수 있기 때문입니다.
Scanner sc = new Scanner(System.in); sc.nextLine(); // 변수 sc 안의 객체가 메서드를 실행
sc는 변수지만 그 안에 Scanner 객체가 있으므로
sc.nextLine()이 되는 거예요.
System.out.println()도 같은 원리입니다.
또한
그렇다면 왜 "변수에 객체가 들어 있다"는 표현을 쓸까? 자바에서는 실제 객체는 힙(heap) 메모리에 따로 존재하고,
변수는 그 객체의 위치만 저장하고 있기 때문에 프로그래머 입장에서 흔히 이렇게 말한다.
"변수는 객체를 담고 있다"
(정확히는 객체의 참조값(주소)을 담고 있음)
이 표현은:
- primitive 변수랑 구분하기 쉽고
- 객체는 값이 아니라 참조라는 걸 알려주기 위해 쓴다
'JAVA' 카테고리의 다른 글
| 인스턴스 변수를 private으로 해야하는 이유가 뭘까 (0) | 2025.08.25 |
|---|---|
| Hashmap in java (2) (0) | 2025.07.29 |
| static이란 무엇일까? (0) | 2025.07.14 |
| java에서 . 이란? (0) | 2025.07.11 |
| 스택 메모리 (Stack Memory) (0) | 2025.07.08 |