객체 생성의 원리, 생성자, 자료형, Data Type이란 무엇인가?

labbiel·2025년 4월 12일

자바

목록 보기
2/9
post-thumbnail

목차

  1. 객체 생성의 원리는 무엇인가?
  2. 객체 생성의 과정 (6단계)
  3. Book클래스로 객체 생성 원리를 이해
  4. Memory Allocation (메모리 할당)
  5. DataType (자료형)
  6. Scanner 사용법
  7. 주요 메서드
  8. Constructor (생성자)

📌 객체 생성의 원리는 무엇인가?

자바에서 객체(Object)를 생성한다는 것은 클래스를 메모리에 올려 실제로 사용할 수 있는 "실체(instance)"를 만든다는 뜻입니다.

Shirt s = new Shirt("white", 100, true);

📌 객체 생성의 메모리 구조 (도식 요약)

[Stack 영역]
s  ─────────────┐
                │
                ▼
[Heap 영역]   ← Shirt 인스턴스(new Shirt())의 주소
┌─────────────┐
│ color: "white"
│ price: 100
│ isOnSale: true
└─────────────┘

📌 객체 생성의 과정 (6단계)

1단계: 스택(stack) 영역에 s라는 참조 변수가 생성됩니다. (아직 아무 값도 없음)
2단계: new 연산자에 의해 힙(heap) 메모리에 Shirt 클래스에 해당하는 공간이 확보됩니다.
3단계: 묵시적 초기화가 진행됩니다. (기본값으로 자동 초기화: null, 0, false 등)
4단계: 명시적 초기화 또는 생성자(constructor) 실행으로 원하는 값들로 필드가 초기화됩니다.
5단계: 생성된 객체의 주소값이 s에 저장됩니다.
6단계: 이제 s를 통해 객체의 필드 및 메서드에 접근 가능해집니다. (s.color, s.getPrice() 등)


Book클래스로 객체 생성 원리를 이해

  1. 📌 클래스 정의
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;
    }
}
  1. 📌 객체 생성 코드
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              │
└─────────────────────────┘

📌 Memory Allocation (메모리 할당)

  • 자바에서 객체를 생성하는 원리는, 클래스를 기반으로 인스턴스를 생성하는 것. 즉, 클래스는 객체의 설계도 역할을 하고, 객체는 이 설계도를 바탕으로 생성된 실체를 의미합니다.
  • 메모리 할당(Memory Allocation)은 프로그램 실행 중에 필요한 메모리를 확보하는 과정입니다.
  • 자바에서는 자동 메모리 관리(가비지 콜렉션)을 제공하여 개발자가 직접 메모리를 해제할 필요가 없습니다.
  • 주로 StackHeap이라는 메모리 영역이 중요합니다.
영역설명
Stack메서드 호출 시 생성되는 지역 변수, 매개변수 저장. 빠르고 자동으로 메모리 해제됩니다.
Heapnew 키워드로 생성된 객체 저장. 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;
    }
}

DataType (자료형)

자바는 정적 타입 언어로, 변수 선언 시 데이터 타입을 명시해야 합니다.

✅ 기본형(Primitive)

타입크기설명
int4바이트정수형 (기본)
double8바이트실수형 (정밀도 높음)
char2바이트유니코드 문자
boolean1비트true / false

✅ 참조형(Reference)

  • 배열, 클래스, 인터페이스 등
  • 실제 데이터는 Heap에 저장되고, 참조 변수는 Stack에 저장됩니다.

📌 코드 예시

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 사용법

  • 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 입력

Constructor (생성자)

  • 생성자(Constructor)는 객체가 생성될 때 자동 호출되는 메서드입니다.
  • 클래스 이름과 동일하며, 리턴 타입이 없습니다.
  • 기본 생성자매개변수 생성자로 나뉩니다.

📌 코드 예시

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) 가능합니다. (매개변수 수나 타입 다르게 정의)
  • 생성자가 없으면 컴파일러가 기본 생성자 자동 생성

0개의 댓글