2025.03.08 - [Core Java/Chapter 4] - 코어자바(Core Java) 12판 Chapter 4 리뷰 : 4.3 자신만의 클래스 정의하기
코어자바(Core Java) 12판 Chapter 4 리뷰 : 4.3 자신만의 클래스 정의하기
2025.03.08 - [Core Java/Chapter 4] - 코어자바(Core Java) 12판 Chapter 4 리뷰 : 4.2 표준 라이브러리 클래스 사용하기 4.2 표준 라이브러리 클래스 사용하기4.2 표준 라이브러리 클래스 사용하기(Using Predefined Cla
choosla.tistory.com
[ 정적 필드와 메서드(Static): Math 예제부터 main 메서드까지 ]
4.4 정적 필드와 메소드(Static Fields and Methods)
Employee 클래스에서 보듯이, 자바 프로그램의 진입점인 main 메소드는 static 수정자로 선언된다. 이 장에서는 static 수정자가 붙은 필드와 메소드에 대해 자세히 알아본다. static 구성요소는 객체에 속하지 않고 클래스 자체에 속하므로, 해당 클래스의 모든 인스턴스가 공유하는 단 하나의 복사본만 존재한다는 점이 핵심이다.
4.4.1 정적(Static) 필드
정적 필드(static field)는 클래스에 소속되며, 해당 클래스의 모든 객체가 공유하는 단일 변수를 의미한다. 예를 들어, 각 Employee 객체는 고유의 id 값을 가져야 하지만, 새로운 id를 생성하기 위한 기준 값은 모든 객체가 공유하는 static 필드로 관리할 수 있다.
// Employee 클래스 예제
class Employee {
// 모든 Employee 객체가 공유하는 정적 필드 (초기값 1)
private static int nextId = 1;
// 각 Employee 객체마다 개별적으로 존재하는 인스턴스 필드
private int id;
// 생성자에서 새로운 id를 할당하고, 다음 id 값을 증가시킴
public Employee() {
id = nextId;
nextId++; // 다음 Employee 객체를 위해 nextId를 증가시킴
}
// id 값을 반환하는 메소드
public int getId() {
return id;
}
}
위 예제에서 모든 Employee 객체는 자신만의 id 인스턴스 필드를 가지지만, nextId는 단 하나만 존재하여 새로운 객체가 생성될 때마다 고유한 id 값을 제공한다.
4.4.2 정적 상수(Static Constants)
정적 변수 중에서도 상수는 변경될 수 없는 값을 의미하며, 자주 사용된다. 대표적인 예가 Math 클래스의 PI 상수이다. 상수를 선언할 때는 한 번 초기화된 이후에는 값이 변경되지 않도록 final 키워드를 함께 사용한다.
public class Math {
// Math 클래스 내에서 유일하게 존재하는 PI 상수 (모든 객체가 공유)
public static final double PI = 3.141592653589793;
}
또 다른 예로, System 클래스의 out 필드는 정적 상수로 선언되어 있다. 이처럼 public 상수(final 필드)는 외부에서 접근은 가능하지만 재할당이 불가능하기 때문에 안전하게 사용할 수 있다.
4.4.3 정적 메소드 (Static Methods)
정적 메소드는 객체에 종속되지 않고 클래스에 소속된 메소드이다. 따라서, 객체를 생성하지 않고도 호출할 수 있으며, 메소드 내에서는 this 키워드를 사용할 수 없다. 예를 들어, Math 클래스의 pow 메소드는 static 메소드로, Math 객체를 생성할 필요 없이 바로 호출할 수 있다.
또한, Employee 클래스에서도 static 메소드를 활용할 수 있다. 다만, static 메소드는 인스턴스 필드에는 접근할 수 없고 오직 static 필드에만 접근할 수 있다.
class Employee {
private static int nextId = 1;
private int id;
public Employee() {
id = nextId;
nextId++;
}
// 정적 메소드로, nextId 값을 증가시키고 반환함
public static int advanceId() {
int r = nextId; // static 필드 nextId에 접근
nextId++;
return r;
}
}
이와 같이 정적 메소드는 다음 두 가지 경우에 주로 사용된다.
- 객체 상태에 의존하지 않는 경우: 메소드의 모든 파라미터가 명시적으로 제공되어 객체의 상태에 접근할 필요가 없을 때 (예:
Math.pow) - 클래스의 정적 필드에만 접근할 필요가 있을 때: 객체 생성 없이 클래스에 소속된 필드만을 사용해야 할 때 (예:
Employee.advanceId)
4.4.4 Factory 메소드
static 메소드는 또한 Factory 메소드로 사용된다. Factory 메소드는 객체 생성과 관련된 로직을 캡슐화하여, 생성자 대신 메소드를 통해 다양한 방식의 객체를 반환할 수 있도록 한다.
// NumberFormat 클래스를 통한 객체 생성 예제
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
NumberFormat percentFormatter = NumberFormat.getPercentInstance();
double x = 0.1;
System.out.println(currencyFormatter.format(x)); // 예: $0.10 출력
System.out.println(percentFormatter.format(x)); // 예: 10% 출력
Factory 메소드를 사용하는 이유는 다음과 같다.
- 생성자의 한계 극복: 생성자의 이름은 항상 클래스 이름과 같기 때문에, 서로 다른 기능을 하는 생성자를 구분하기 어렵다. 그러나 Factory 메소드는 각기 다른 이름을 사용할 수 있어, 생성되는 객체의 역할을 명확하게 표현할 수 있다.
- 반환 타입의 다양성: 생성자를 사용하면 반환되는 객체의 타입이 항상 고정되지만, Factory 메소드는 상속 관계에 있는 다른 타입의 객체를 반환할 수 있다. 예를 들어,
NumberFormat클래스의 Factory 메소드는 내부적으로DecimalFormat객체를 반환할 수 있다.
4.4.5 main 메소드
모든 자바 프로그램의 시작점은 main 메소드이다. main 메소드는 static 메소드로 선언되어 있으며, 객체 생성 없이 호출되므로 프로그램 실행 시 가장 먼저 실행되는 메소드이다. 따라서, main 메소드 내부에서는 다른 객체들을 생성하거나 프로그램의 전반적인 흐름을 제어하는 역할을 수행한다.
public class Application {
// 프로그램의 진입점인 main 메소드 (static 메소드)
public static void main(String[] args) {
// 객체 생성 및 프로그램 실행 로직 시작
// 예: Employee 객체 생성
Employee emp = new Employee();
System.out.println("새로운 직원의 id: " + emp.getId());
// 필요한 추가 로직 작성
// ...
}
}
main 메소드는 프로그램 실행 초기에 어떠한 객체도 생성되지 않은 상태에서 호출되므로, static 메소드의 특성을 잘 활용하여 초기 설정이나 리소스 할당 등을 수행한다.
이와 같이 static 필드와 메소드, 그리고 Factory 메소드와 main 메소드에 대한 개념은 객체 지향 프로그래밍에서 클래스와 객체 간의 관계를 보다 명확하게 이해하는 데 매우 중요한 역할을 한다. 티스토리 블로그에 이 내용을 게시할 때는 각 섹션별로 제목과 코드 예제를 함께 제시하여 독자들이 이론과 실습을 병행하면서 학습할 수 있도록 구성하면 좋다.
위 내용은 노션의 원본 텍스트의 모든 핵심 사항을 그대로 유지하면서도 문맥이 자연스럽게 이어지도록 다듬은 것이다. 추가 설명을 통해 독자들이 static 관련 개념을 보다 명확하게 이해할 수 있도록 구성하였다.
2025.03.08 - [Core Java/Chapter 4] - 4.5 메소드 매개변수
4.5 메소드 매개변수
4.5 메소드 매개변수 (Method Parameters)자바와 같은 프로그래밍 언어에서 메소드(또는 함수)의 매개변수가 호출될 때 어떻게 전달되는지 살펴보자. 이것을 이해하기 위해서는 call by value와 call by refer
choosla.tistory.com
'Core Java > Chapter 4' 카테고리의 다른 글
| 코어자바(Core Java) 12판 Chapter 4 리뷰 : 4.6 객체 생성 (0) | 2025.03.08 |
|---|---|
| 코어자바(Core Java) 12판 Chapter 4 리뷰 : 4.5 메소드 매개변수 (0) | 2025.03.08 |
| 코어자바(Core Java) 12판 Chapter 4 리뷰 : 4.3 자신만의 클래스 정의하기 (0) | 2025.03.08 |
| 코어자바(Core Java) 12판 Chapter 4 리뷰 : 4.2 표준 라이브러리 클래스 사용하기 (0) | 2025.03.08 |
| 코어자바(Core Java) 12판 Chapter 4 리뷰 : 4.1 객체(Object)와 객체 지향 프로그래밍 (0) | 2025.03.08 |