개발/JAVA

자바의 this와 생성자 활용: 상품 관리 프로그램 심화 학습

예니03 2025. 1. 31. 09:54
반응형

이번 글에서는 자바의 this 키워드와 생성자 활용법을 배워 보겠습니다. 클래스의 설계도를 개선하고, 코드를 더 간결하게 작성하는 방법을 알아봅니다. 이를 위해, 상품 정보를 관리하는 프로그램을 개선하여 작성합니다.

1. this란 무엇인가?

this는 현재 객체를 참조하는 특별한 키워드입니다.

  • 필드와 매개변수 구분: 메서드나 생성자의 매개변수 이름이 필드와 동일할 때, this를 사용하여 필드를 명확히 구분합니다.
  • 생성자 호출: 하나의 생성자에서 다른 생성자를 호출할 때 this()를 사용합니다.

 

2. 프로그램 설계: Goods 클래스

Goods 클래스는 상품 정보를 저장하는 클래스입니다.
기존 버전에서는 모든 필드를 초기화하기 위해 일일이 값을 설정해야 했습니다. 이번에는 생성자와 this를 활용해 더 간결하고 효율적으로 작성합니다.

(1) Goods 클래스 코드

Goods.java

package com.javaex.oop.goods.v4;

// v4. this와 생성자 활용
public class Goods {
    // 필드 선언
    private String name;   // 상품명
    private int price;     // 가격

    // (1) 단일 필드 초기화 생성자
    public Goods(String name) {
        this.name = name;  // this로 필드와 매개변수 구분
        System.out.println("name 필드 초기화 생성자");
    }

    // (2) 전체 필드 초기화 생성자
    public Goods(String name, int price) {
        this(name);        // name 필드를 초기화하는 생성자 호출
        this.price = price;
        System.out.println("전체 필드 초기화 생성자");
    }

    // (3) Getter와 Setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    // (4) 일반 메서드: 상품 정보 출력
    public void showInfo() {
        System.out.printf("상품 이름: %s%n가격: %,d원%n", name, price);
    }
}

 

3. 클래스 코드 설명

(1) 생성자와 this()

public Goods(String name, int price) {
    this(name);  // 단일 필드 초기화 생성자를 호출
    this.price = price;
    System.out.println("전체 필드 초기화 생성자");
}
  • 단일 필드 초기화 생성자: Goods(String name)은 name 필드만 초기화합니다.
  • 전체 필드 초기화 생성자: Goods(String name, int price)는 this(name)로 다른 생성자를 호출하고, price 필드를 추가로 초기화합니다.
  • this()를 사용하면 중복 코드를 줄이고, 생성자 간 초기화 로직을 공유할 수 있습니다.

(2) Getter와 Setter

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
  • Getter: 필드 값을 읽어옵니다.
  • Setter: 필드 값을 설정합니다. 필요 시 데이터 무결성 검사를 추가할 수 있습니다.

(3) 일반 메서드

public void showInfo() {
    System.out.printf("상품 이름: %s%n가격: %,d원%n", name, price);
}
  • 상품 정보를 출력하는 메서드입니다. 이렇게 출력 관련 코드를 따로 작성하면, 재사용성이 높아지고 코드가 더 간결해집니다.

4. GoodsApp 클래스: 실행 코드

이제 Goods 클래스를 활용해 실행 코드를 작성해 보겠습니다.

GoodsApp.java

package com.javaex.oop.goods.v4;

public class GoodsApp {
    public static void main(String[] args) {
        // 생성자 활용
        Goods camera = new Goods("Nikon", 400_000);
        Goods pc = new Goods("LG그램", 900_000);
        Goods mug = new Goods("머그컵", 2_000);

        // Getter를 활용해 출력
        System.out.printf("%s, %,d원%n", camera.getName(), camera.getPrice());
        System.out.printf("%s, %,d원%n", pc.getName(), pc.getPrice());
        System.out.printf("%s, %,d원%n", mug.getName(), mug.getPrice());

        // showInfo() 메서드를 활용해 출력
        camera.showInfo();
        pc.showInfo();
        mug.showInfo();
    }
}

 

5. 실행 결과

코드를 실행하면 다음과 같은 결과가 출력됩니다:

name 필드 초기화 생성자
전체 필드 초기화 생성자
name 필드 초기화 생성자
전체 필드 초기화 생성자
name 필드 초기화 생성자
전체 필드 초기화 생성자
Nikon, 400,000원
LG그램, 900,000원
머그컵, 2,000원
상품 이름: Nikon
가격: 400,000원
상품 이름: LG그램
가격: 900,000원
상품 이름: 머그컵
가격: 2,000원

 

6. 주요 학습 포인트

(1) this의 활용

  • 필드와 매개변수 구분: this.name = name;
  • 생성자 호출: this(name);

(2) 생성자의 역할

  • 객체를 생성할 때 필요한 데이터를 초기화합니다.
  • 생성자 간 중복 로직을 줄이기 위해 this()를 활용할 수 있습니다.

(3) Getter와 Setter

  • 데이터를 안전하게 읽고 쓰기 위해 사용합니다.
  • Setter에 데이터 무결성 검사나 인증 로직을 추가할 수 있습니다.

(4) 재사용 가능한 메서드

  • 출력 관련 로직은 showInfo() 같은 메서드로 따로 작성하면 코드 재사용성과 가독성이 높아집니다.

7. 코드 개선 효과

기존 코드와 비교해보면:

  • 생성자를 활용하여 필드 초기화를 간결하게 작성했습니다.
  • showInfo()를 추가해 출력 로직을 깔끔하게 정리했습니다.
  • this를 활용해 중복 코드를 제거했습니다.

8. 결론

이번 글에서는 자바의 this와 생성자를 활용해 객체를 더 효율적으로 초기화하고, 코드의 가독성과 유지보수성을 높이는 방법을 배웠습니다. 객체 지향 프로그래밍(OOP)의 장점을 점점 더 체감할 수 있는 부분이니, 직접 다양한 예제를 만들어 보며 익혀 보세요.🚀

반응형