변수
선언 위치에 따른 변수의 종류
변수 종류는 변수의 선언 위치에 따라 결정된다. 종류로는 인스턴스 변수, 클래스 변수(static 변수, 공유 변수)와 지역 변수가 있다.

| 클래스 변수 | 인스턴스 변수 | 지역 변수 | |
| 선언 위치 | 클래스 영역 static 키워드 붙임 |
클래스 영역 | 클래스 영역 외의 영역 (메서드, 생성자, 초기화 블럭 내부) |
| 생성 시기 | 클래스가 메모리에 올라갈 때 | 인스턴스를 생성할 때 | 변수 선언문이 수행될 때 |
| 메모리 영역 | Method Area | Heap | Call Stack |
| 초기화 | 타입별 기본값으로 초기화 | 타입별 기본값으로 초기화 | 사용 전 명시적 초기화 필요 |
| 접근 방법 | 인스턴스와 무관하게 클래스명으로 접근 Animal.isMortal = true; |
인스턴스 생성 후, 변수명으로 접근 Animal a = new Animal(); a.name = "Sadie"; |
외부에서 접근 불가능 내부에서 변수명으로 접근 |
| 소멸 시점 | 프로그램 종료할 때 | Garbage Collector가 메모리 할당 해제할 때 | 선언된 블럭을 벗어날 때 |
주의할 점
1. 클래스 변수의 경우, 객체 생성 후 객체명으로도 접근 가능하나 원칙적으로는 클래스명으로 접근하는 것이 좋다.
class Animal {
static boolean isMortal = true;
...
}
System.out.println(Animal.isMortal); // 객체 생성하지 않고 클래스 변수에 접근 가능
Animal a = new Animal();
a.isMortal = false; // The static field [클래스명.변수명] should be accessed in a static way
2. 인스턴스 변수는 인스턴스가 생성될 때마다 생성되어 인스턴스마다 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유해 항상 공통된 값을 갖는다. 만약 클래스 변수를 수정한다면, 모든 인스턴스에 영향을 끼치게 된다.
메서드
메서드란 현실의 객체가 하는 동작을 프로그램으로 표현한 것이다. 코드 상으로는 특정 작업을 수행하는 명령문의 집합이다.
메서드를 사용하는 이유
메서드를 사용하는 대표적인 이유 3가지는 다음과 같다.
- 높은 재사용성
- 한번 만든 메서드는 계속 호출할 수 있고, 다른 프로그램에서도 사용할 수 있다.
- 중복 코드 제거
- 중복 코드를 메서드로 분리해 코드를 반복하는 대신 메서드를 호출하게 할 수 있다.
- 소스 코드도 간결해지고, 추후 수정할 때 코드 불일치로 인한 오류 발생을 줄일 수 있다.
- 프로그램의 구조화(모듈화)
- 프로그램의 구조가 커질 때, 실행해야하는 명령문을 작업단위로 나눠서 메서드로 작성한다면 구조를 단순화할 수 있다.
결과적으로 메서드를 사용함으로써 코드의 관리 및 유지보수가 용이해지고, 오류 발생이 감소한다.
클래스 메서드와 인스턴스 메서드
메서드 앞에 static이 붙어있으면 클래스 메서드, 아니면 인스턴스 메서드이다.
인스턴스 메서드는 인스턴스 변수와 관련된 작업을 하거나 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드로, 인스턴스를 생성해야지만 호출할 수 있다. 클래스 메서드는 인스턴스와 관계없는 메서드이다.
클래스 변수와 메서드, 인스턴스 변수와 메서드를 정의할 때 유의할 점은 다음과 같다.
- 클래스 설계 시, 멤버 변수 중 모든 인스턴스에 공통으로 사용하는 것은 클래스 변수(static)으로 정의한다.
- 클래스 변수는 인스턴스를 생성하지 않아도 사용할 수 있다. 클래스가 메모리에 올라갈 때 이미 생성되어있기 때문이다.
- 클래스 메서드는 인스턴스 변수를 사용할 수 없다. 클래스 메서드는 인스턴스 변수 없이 호출 가능하기 때문에, 클래스 메서드 호출 시점에 인스턴스가 생성되어있음을 보장할 수 없기 때문이다.
- 메서드 내 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다. 인스턴스 메서드와 달리 실행 시 호출되어야할 메서드를 찾는 과정이 추가적으로 필요하지 않기 때문에 메서드 호출시간이 빨라진다.
참고 자료
- JAVA의 정석 3판, Chapter 06 객체지향 프로그래밍 1
'Java > 자바의 정석' 카테고리의 다른 글
| [JAVA] 오버로딩(Overloading) (0) | 2023.07.15 |
|---|---|
| [JAVA] 클래스와 객체(인스턴스) (0) | 2023.07.07 |
| [JAVA] 객체지향 프로그래밍이란 (0) | 2023.07.06 |