인스턴스 변수 vs 정적 변수
Coddy Java 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 87개 중 15번째.
지금까지 우리가 만든 모든 필드는 특정 객체에 속합니다. 각 BankAccount에는 고유한 balance가 있고, 각 Product에는 고유한 name이 있습니다. 이러한 필드를 인스턴스 변수라고 합니다. 즉, 클래스의 각 인스턴스마다 별도로 존재합니다.
하지만 모든 객체에서 공유되는 데이터가 필요하다면 어떻게 해야 할까요? 바로 이럴 때 정적 변수(클래스 변수라고도 함)를 사용합니다. 정적 변수는 특정 객체가 아니라 클래스 자체에 속합니다.
public class Student {
private String name; // 인스턴스 변수 - 학생마다 고유함
private static int totalCount; // 정적 변수 - 모든 학생이 공유함
public Student(String name) {
this.name = name;
totalCount++; // 공유 카운터를 증가시킴
}
public static int getTotalCount() {
return totalCount;
}
}여러 학생을 생성하면 각 학생은 자신만의 name을 가지지만, 모두 같은 totalCount를 공유합니다:
Student s1 = new Student("Alice");
Student s2 = new Student("Bob");
System.out.println(Student.getTotalCount()); // 출력: 2객체를 통해서가 아니라 클래스 이름(Student.getTotalCount())을 통해 정적 변수에 액세스하는 방식에 주목하세요. 이는 정적 멤버가 인스턴스가 아니라 클래스에 속한다는 점을 강조합니다.
객체마다 달라지는 데이터(학생의 이름 등)에는 인스턴스 변수를 사용하세요. 공유해야 하는 데이터(예를 들어 객체가 몇 개 존재하는지 세는 경우)에는 정적 변수를 사용하세요.
챌린지
쉬움인스턴스 변수와 정적 변수를 사용하여 개별 책의 세부 정보와 전체 컬렉션의 총 책 수를 모두 추적하는 Book 재고 관리 시스템을 만들어 보겠습니다.
코드를 구성하기 위해 두 개의 파일을 만듭니다.
Book.java: 개별 책 정보를 추적하는 동시에 지금까지 생성된 모든 책의 수를 유지하는 Book 클래스를 만듭니다.- 인스턴스 변수
title(String) - 각 책마다 고유함 - 인스턴스 변수
price(double) - 각 책마다 고유함 - 정적 변수
totalBooks(int) - 모든 Book 객체가 공유하며, 생성된 책의 수를 추적함 - 제목과 가격을 전달받고 총 책 수를 증가시키는 생성자
- 제목을 위한 getter
getTitle() - 가격을 위한 getter
getPrice() - 생성된 총 책 수를 반환하는 정적 메서드
getTotalBooks()
- 인스턴스 변수
Main.java: 여러 Book 객체를 만들고 정적 카운터가 모든 인스턴스를 어떻게 추적하는지 보여 줍니다. 세 권의 책 제목과 세 개의 가격을 입력으로 받습니다. 세 권의 책을 모두 만든 후 네 줄을 출력합니다.- 각 책의 제목과 가격을 다음 형식으로 출력:
[title]: $[price](가격은 소수점 이하 2자리로 형식 지정) - 정적 메서드를 사용하여 총 책 수를 출력:
Total books: [count]
- 각 책의 제목과 가격을 다음 형식으로 출력:
입력은 다음 순서로 6개를 받습니다: title1, price1, title2, price2, title3, price3.
정적 메서드는 객체 인스턴스를 통해서가 아니라 클래스 이름을 통해 호출해야 합니다(Book.getTotalBooks()). 가격을 형식 지정하려면 String.format("%.2f", price)를 사용합니다.
직접 해보기
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 세 권의 책에 대한 입력을 읽습니다
String title1 = scanner.nextLine();
double price1 = Double.parseDouble(scanner.nextLine());
String title2 = scanner.nextLine();
double price2 = Double.parseDouble(scanner.nextLine());
String title3 = scanner.nextLine();
double price3 = Double.parseDouble(scanner.nextLine());
// TODO: 위의 입력을 사용하여 세 개의 Book 객체를 생성하세요
// TODO: 각 책의 제목과 가격을 다음 형식으로 출력하세요: [title]: $[price]
// 가격을 소수점 이하 2자리로 포맷하려면 String.format("%.2f", price)를 사용하세요
// TODO: 정적 메서드를 사용하여 책의 총 개수를 출력하세요
// Format: Total books: [count]
// 정적 메서드는 클래스 이름을 통해 접근하세요: Book.getTotalBooks()
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
4상속
상속의 기초 (extends)super 키워드메서드 오버라이딩 (@Override)생성자 체이닝Object 클래스단일 및 다중 레벨 상속다중 클래스 상속이 불가능한 이유요약 - 직원 계층 구조직접 연습해 보세요: 온라인 Java 컴파일러