
6-5 인스턴스 멤버와 정적 멤버
- 인스턴스 멤버 - 객체마다 가지고 있는 멤버
- 정적 멤버 - 클래스에 위치시키고 객체들이 공유하는 멤버
인스턴스 멤버와 this
- 인스턴스 멤버란 객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드를 말한다. 인스턴스 필드와 메소드는 객체에 소속된 멤버이기 때문에 객체 없이는 사용할 수 없다.
정적 멤버와 static
- 정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말한다.
- 정적 필드와 메소드를 선언하려면 필드와 메소드 선언 시 static 키워드를 붙이면 된다.
- 필드 선언 시 인스턴스 필드로 선언할지 정적 필드로 선언할지의 판단 기준은?
-> 객체마다 가지고 있어야 할 데이터라면 인스턴스 필드로 선언, 객체마다 가지고 있을 필요가 없는 공용 데이터라면 정적 필드로 선언하는 것이 좋다.
- 메소드 선언시 인스턴스 메소드와 정적 메소드 선언의 판단 기준은?
-> 인스턴스 필드를 포함하고 있다면 인스턴스 메소드로 선언, 인스턴스 필드를 포함하고 있지 않다면 정적 메소드로 선언한다.
public class Calculater {
String color; //인스턴스 필드
void setColor(String color) {this.color = color;} // 인스턴스메소드
static int plus(int x, int y) {return x + y;} // 정적 메소드
static int minus(int x, int y) {return x - y;} // 정적 메소드
정적 멤버 사용
-> p275 참고
싱글톤
- 단 하나만 생성되는 객체
- 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 만들어야 한다.
(클래스 내부에서는 가능하다.)
- 생성자를 외부에서 호출할 수 없도록 하려면 생성자 앞에 private 접근 제한자를 붙여주면 된다.
- 정적 필드도 private 접근 제한자를 붙여 외부에서 필드값을 변경하지 못하도록 한다.
- 대신 외부에서 호출할 수 있는 정적 메소드인 getInstance()를 선언하고 정적 필드에서 참조하고 있는 자신의 객체를 리턴해준다.(외부에서 객체를 얻는 유일한 방법이다. getInstance()메소드는 단 하나의 객체만 리턴한다.)
final 필드와 상수
final
- final 필드는 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없다는 것이다.
(1. 필드 선언시 초기값 주기 or 2. 생성자에서 초기값 주기.)
상수
- 불변의 값을 저장하는 필드를 자바에서 상수라고 부른다.(final 필드는 객체마다 저장되고, 생성자의 매개값을 통해서 여러 가지 값을 가질 수 있기 때문에 상수가 아니다.)
- 상수는 static이면서 final이어야 한다.
static final 타입 상수 = 초기값;
- 상수 이름은 모두 대문자로 작성하는 것이 관례다. 혼합된 단어는 언더바(_)사용.
마무리
- p287 싱글톤 만들기 안보도 다시 해보자! getInstance()!!
*참고 혼자공부하는자바 신용권 지음 한빛미디어.