
자바에서 객체(Object)를 생성한다는 것은 클래스를 메모리에 올려 실제로 사용할 수 있는 "실체(instance)"를 만든다는 뜻입니다.
Shirt s = new Shirt("white", 100, true);
[Stack 영역]
s ─────────────┐
│
▼
[Heap 영역] ← Shirt 인스턴스(new Shirt())의 주소
┌─────────────┐
│ color: "white"
│ price: 100
│ isOnSale: true
└─────────────┘
1단계: 스택(stack) 영역에 s라는 참조 변수가 생성됩니다. (아직 아무 값도 없음)
2단계: new 연산자에 의해 힙(heap) 메모리에 Shirt 클래스에 해당하는 공간이 확보됩니다.
3단계: 묵시적 초기화가 진행됩니다. (기본값으로 자동 초기화: null, 0, false 등)
4단계: 명시적 초기화 또는 생성자(constructor) 실행으로 원하는 값들로 필드가 초기화됩니다.
5단계: 생성된 객체의 주소값이 s에 저장됩니다.
6단계: 이제 s를 통해 객체의 필드 및 메서드에 접근 가능해집니다. (s.color, s.getPrice() 등)
Book클래스로 객체 생성 원리를 이해public class Book {
String title;
String author;
int pages;
// 생성자
public Book(String title, String author, int pages) {
this.title = title;
this.author = author;
this.pages = pages;
}
}
public class Main {
public static void main(String[] args) {
// 객체 생성
Book b = new Book("자바의 정석", "홍길동", 700);
// 정보 출력
System.out.println("제목: " + b.title); // 자바의 정석
System.out.println("저자: " + b.author); // 홍길동
System.out.println("페이지 수: " + b.author); // 700
}
}
질문. 그럼 이 코드에서 객체 생성의 흐름은 어떻게 되는가?
Book b = new Book("자바의 정석", "홍길동", 700);
1단계: 스택에 b라는 참조 변수가 생성됩니다.
2단계: new Book(...) 실행 시 힙(Heap) 메모리에 Book 객체를 위한 공간이 확보됩니다.
3단계: 해당 공간의 모든 필드가 기본값(null, 0)으로 묵시적 초기화가 됩니다.
4단계: 생성자 Book("자바의 정석", "홍길동", 700)가 호출되어 각 필드가 명시적 초기화가 됩니다.
5단계: 생성된 Book 객체의 주소값이 스택의 b에 저장됩니다.
6단계: 이제 b를 통해 Book객체에 접근 가능해집니다. (b.title, b.author 등)
[Stack 영역]
b ─────────────┐
│
▼
[Heap 영역]
Book 객체
┌─────────────────────────┐
│ title: "자바의 정석" │
│ author: "남궁성" │
│ pages: 850 │
└─────────────────────────┘
Stack과 Heap이라는 메모리 영역이 중요합니다.| 영역 | 설명 |
|---|---|
| Stack | 메서드 호출 시 생성되는 지역 변수, 매개변수 저장. 빠르고 자동으로 메모리 해제됩니다. |
| Heap | new 키워드로 생성된 객체 저장. GC(Garbage Collector)가 관리합니다. |
public class MemoryExample {
public static void main(String[] args) {
int x = 10; // Stack에 저장
Person p = new Person("Alice"); // Person 객체는 Heap에 저장
}
}
class Person {
String name;
public Person(String name) {
this.name = name;
}
}
자바는 정적 타입 언어로, 변수 선언 시 데이터 타입을 명시해야 합니다.
| 타입 | 크기 | 설명 |
|---|---|---|
| int | 4바이트 | 정수형 (기본) |
| double | 8바이트 | 실수형 (정밀도 높음) |
| char | 2바이트 | 유니코드 문자 |
| boolean | 1비트 | true / false |
public class DataTypeExample {
public static void main(String[] args) {
int number = 100;
double pi = 3.14;
char letter = 'A';
boolean isJavaFun = true;
String message = "Hello, Java"; // 참조형
}
}
Scanner는 자바에서 콘솔 입력을 받기 위해 사용되는 클래스입니다.java.util.Scanner 패키지에 포함되어 있고, 다양한 데이터 타입 입력을 지원합니다.import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("이름을 입력하세요: ");
String name = scanner.nextLine();
System.out.print("나이를 입력하세요: ");
int age = scanner.nextInt();
System.out.println("안녕하세요, " + name + "님! 나이는 " + age + "살이군요.");
scanner.close(); // 자원 해제
}
}
| 메서드 | 설명 |
|---|---|
next() | 문자열 한 단어 입력 |
nextLine() | 문자열 한 줄 입력 |
nextInt() | 정수 입력 |
nextDouble() | 실수 입력 |
nextBoolean() | true/false 입력 |
생성될 때 자동 호출되는 메서드입니다.기본 생성자와 매개변수 생성자로 나뉩니다.public class Car {
String brand;
int year;
// 기본 생성자
public Car() {
this.brand = "기본 브랜드";
this.year = 2020;
}
// 매개변수 생성자
public Car(String brand, int year) {
this.brand = brand;
this.year = year;
}
public void displayInfo() {
System.out.println("브랜드: " + brand + ", 출시 연도: " + year);
}
public static void main(String[] args) {
Car defaultCar = new Car();
Car customCar = new Car("Hyundai", 2023);
defaultCar.displayInfo(); // 브랜드: 기본 브랜드, 출시 연도: 2020
customCar.displayInfo(); // 브랜드: Hyundai, 출시 연도: 2023
}
}
오버로딩(Overloading) 가능합니다. (매개변수 수나 타입 다르게 정의)컴파일러가 기본 생성자 자동 생성