클래스와 인스턴스, 그리고 복사의 기술

글 정보
카테고리Programming/Java/Starter
작성일2025-12-18
게시 여부true
seriesJava Starter
series-order3
제목클래스와 인스턴스, 그리고 복사의 기술

1. 클래스, 객체, 인스턴스의 정립

우리는 흔히 이 세 용어를 혼용하지만, 메모리 관점에서 명확한 구분이 필요합니다.

2. 생성자 (Constructor): 객체의 탄생

생성자는 객체가 new 키워드를 통해 Heap에 할당되는 순간, 가장 먼저 실행되어 초기화를 담당하는 특수 메서드입니다.

2.1. 생성자의 규칙과 특징

  1. 리턴 타입 없음void조차 적지 않습니다. 리턴 타입이 있다면 그것은 생성자가 아닌 일반 메서드입니다.
  2. 이름 일치: 반드시 클래스명과 동일해야 합니다.
  3. 초기화 우선순위: 필드 선언 시 대입한 값보다 생성자 내부의 코드가 우선합니다. (덮어쓰기)
  4. 기본 생성자: 작성하지 않으면 컴파일러가 빈 생성자(Default Constructor)를 자동으로 추가합니다.

2.2. this와 생성자 연결

생성자는 오버로딩(Overloading)이 가능하며, this()를 통해 다른 생성자를 호출할 수 있습니다. 단, 반드시 첫 줄에 위치해야 합니다.

Java

class Box {
    int size;
    
    // 기본값 설정을 위해 다른 생성자 호출
    Box() { 
        this(10); // 아래의 Box(int size)를 호출
    } 
    
    Box(int size) { 
        this.size = size; 
    }
}

3. 참조자(Reference)와 실체

자바에서 변수(참조자)는 인스턴스 그 자체가 아닙니다. 단순한 포인터(주소값 보관함)일 뿐입니다.

4. 핵심 이슈: 얕은 복사(Shallow) vs 깊은 복사(Deep)

이 파트는 실무에서 데이터 꼬임(Side Effect)을 방지하기 위해 가장 중요합니다.

4.1. 얕은 복사 (Shallow Copy)

4.2. 깊은 복사 (Deep Copy)

Java

// Deep Copy의 정석: 복사 생성자 패턴
class Member {
    String name;
    Address addr; // 참조형 변수

    // 일반 생성자
    Member(String name, Address addr) {
        this.name = name;
        this.addr = addr;
    }

    // 복사 생성자 (Deep Copy)
    Member(Member rhs) {
        this.name = rhs.name; // String은 불변이라 참조 복사도 무관
        
        // [핵심] 참조형은 반드시 new로 새로 생성해서 연결해야 함
        // rhs.addr의 값을 가진 새로운 Address 객체를 만듦
        this.addr = new Address(rhs.addr); 
    }
}

5. 임시 객체 (Temporary Object)와 메모리

참조 변수에 담기지 않고 즉시 사용되고 버려지는 객체를 의미합니다.

6. String의 두 얼굴: Heap vs Constant Pool

String은 클래스이지만 리터럴("") 생성을 지원하는 특수 녀석입니다.

문자열 연결(+)의 함정

Java

String result = "Hello" + "World" + "!!";

위 코드는 실행 과정에서 "HelloWorld"라는 임시 객체를 Heap에 만들고, 최종 결과인 "HelloWorld!!"를 만든 뒤 버려집니다. 반복문 안에서의 문자열 연결이 치명적인 이유가 바로 이 불필요한 임시 객체 생성 때문입니다.