프로그래밍 언어/자바(Java)

Java 프로그래밍 04 : 생성자와 소멸자 그리고 this 키워드

플로리페르 2025. 4. 5. 02:24

저번 포스트에서는 자바의 특성인 객체 지향 프로그래밍에 대해서 다뤘다. 이번 포스트에서는 객체가 생성될 때 실행되는 생성자, 객체가 삭제될 때 실행되는 소멸자, 객체 자신을 가리키는 키워드인 this를 알아보자.

 

 

디폴트 생성자

객체가 생성될 때 가장 먼저 호출되는 생성자. 개발자가 명시하지 않아도 컴파일 시점에 자동 생성된다.

 

디폴트 생성자

 

 


 

사용자 정의 생성자

디폴트 생성자 외에 특정 목적에 의해서 개발자가 만든 생성자로, 매개변수에 차이가 있다.

 

사용자 정의 생성자

 

 

 

1. 객체 선언 : 객체를 만들 준비만 한 상태 (메모리에 공간 할당 X). 아직 obj는 null이다.

2. 생성 : new 키워드로 메모리에 ObjClass 객체를 생성. 이제 obj가 실제 객체를 가리킨다.

3. 초기화 : 객체가 생성될 때, 객체 속성(num, str 등)을 원하는 값으로 설정하는 것.

 

위 코드는 선언 + 생성 + 초기화가 한 번에 이루어지는 코드이다.

 


 

 

소멸자

객체가 GC에 의해서 메모리에서 제거될 때 finalize() 메서드가 호출된다. (finalize()는 Java 9부터는 Deprecated 되었다.)

 

// 소멸자
ObjectClass obj4;

obj4 = new ObjClass();

System.gc();

 

 

@Override
protected void finalize() throws Throwable{

	System.out.println(" -- finalize() method --");
	    
	super.finalize();
    
}

 

 

System.gc();를 사용한다고 해서 GC가 바로 작동하는 것은 아니다. 가급적 빨리 작동하도록 요청하는 것 뿐이다.

+ 자바는 기본적으로 메모리를 개발자가 직접 관리하지 않으므로 일반적으로 System.gc();를 사용하는 경우는 드물다.

 

 

Java 9부터 finalize()는 Deprecated되어 사용이 권장되지 않는다고 한다. 그리고 25.04 현재 자바는 24까지 나왔다. 

 

그럼 Java에서 자원을 정리하려면?

소멸자가 없으니, 대신 명시적으로 close() 같은 메서드를 호출해서 자원을 정리해야 한다.

 

✅ 방법 1: try-with-resources (권장)

import java.io.*;

class Example {
    public static void main(String[] args) {
        try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
            System.out.println(br.readLine());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

✔ try-with-resources 구문을 사용하면 자동으로 close()가 호출된다.
파일, 데이터베이스, 네트워크 연결 같은 자원을 안전하게 정리할 수 있다.

 

방법 2: 명시적으로 close() 호출

import java.io.*;

class Example {
    public static void main(String[] args) {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader("test.txt"));
            System.out.println(br.readLine());
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                try {
                    br.close();  // 명시적으로 자원 해제
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 

✔ finally 블록에서 명시적으로 close()를 호출해서 자원 해제한다.

 

 


 

this 키워드

현재 객체를 가리킬 때 this를 사용한다.

 

인프런: 자바 프로그래밍 입문 강좌 16강

 

 

프로그램을 만들다보면 많은 객체를 생성하게 되는데, 그중에 정확히 내가 현재 다루고 있는 객체에 접근해야할 때가 있다. 그럴때 유용하게 사용할 수 있는 게 this 키워드이다. 또한, 같은 이름의 변수(지역 변수, 인스턴스 변수)가 충돌할 때 명확하게 구분하기에도 좋다. 객체 자신이 갖고 있는 메서드를 호출할 때 사용하기도 한다.

 

class Car {
    String brand;
    String color;

    Car(String brand, String color) {
        this.brand = brand;  // this로 클래스 변수와 지역 변수 구분
        this.color = color;
    }
}