🌎 Web/Java

[Java] 인스턴스 멤버와 정적 멤버, 싱글톤, final

오늘 ONEUL 2022. 11. 29. 11:30
Chapter 06 클래스
   06-1 객체 지향 프로그래밍
   06-2 필드
   06-3 생성자
   06-4 메소드
   06-5 인스턴스 멤버와 정적 멤버
   06-6 패키지와 접근 제한자

 

 

06 클래스

06-5 인스턴스 멤버와 정적 멤버

시작하기 전에

  • 인스턴스 멤버: 객체마다 가지고 있는 멤버
    • 인스턴스 필드: 힙 영역의 객체마다 가지고 있는 멤버, 객체마다 다른 데이터를 저장한다.
    • 인스턴스 메소드: 객체가 있어야 호출 가능한 메소드, 클래스 코드(메소드 영역)에 위치하지만, 이해하기 쉽도록 객체마다 가지고 있는 메소드라고 생각해도 된다.
  • 정적 멤버: 객체와 상관없는 멤버, 클래스 코드(메소드 영역)에 위치
    • 정적 필드 및 상수: 객체 없이 클래스만으로도 사용 가능한 필드이다.
    • 정적 메소드: 객체 없이 클래스만으로도 호출 가능한 메소드이다.

 

인스턴스 멤버 선언

public class Car {
	// 필드
	int gas;

	// 메소드
	void setSpeed(int speed) { ... }
}
Car myCar = new Car();
myCar.gas = 10;
myCar.setSpeed(60);

Car yourCar = new Car();
youtCar.gas = 20;
yourCar.setSpeed(80);

 

this

  • 객체 내에서 인스턴스 멤버에 접근하기 위해 사용한다.
  • 생성자와 메소드의 매개 변수 이름이 필드와 동일할 경우, 필드임을 지정하기 위해 주로 사용한다.
Car(String moder) {
	this.model = model;
}

 

정적(static) 멤버 선언

  • 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드
public class 클래스 {
	// 정적 필드
	static 타입 핃드 [= 초기값];

	// 정적 메소드
	static 리턴타입 메소드(매개변수선언, ...) { ... }
}-

 

정적 멤버 사용

  • 클래스 이름과 함께 도트 연산자로 접근
클래스.필드;
클래스.메소드(매개값, ...);

 

인스턴스 멤버와 정적 멤버 선택 기준

  • 객체마다 다를 수 있는 필드 값이라면? 인스턴스 필드로 선언
    객체마다 다를 필요가 없는 공용 데이터라면? 정적 필드로 선언
  • 인스턴스 필드를 포함하고 있다면? 인스턴스 메소드로 선언
    인스턴스 필드를 포함하고 있지 않다면? 정적메소드로 선언

 

정적 메소드 선언 시 주의할 점

  • 정적 메소드 선언 시 그 내부에 인스턴스 필드 및 메소드 사용 불가
  • 정적 메소드 선언 시 그 객체 자신 참조인 this 키워드 사용 불가
  • 정적 메소드에서 인스턴스 멤버를 사용하려면? 객체 우선 생성 후 참조 변수로 접근

 

싱글톤(Singleton)

  • 전체 프로그램에서 단 하나의 객체만 만들도록 보장하는 코딩 기법
  • 싱글톤 작성 방법
    • 클래스 외부에서 new 연산자를 통해 생성자 호출하는 것 불가하도록 private 접근 제한자 사용
    • 자신의 타입인 정적 필드 선언 후 자신의 객체 생성해 초기화
    • 외부에서 호출할 수 있는 getInstance() 선언
    • 정적 필드에서 참조하는 자신의 객체 리턴
public class 클래스 {
	// 정적 필드
	private static 클래스 singleton = new 클래스();
	
	// 생성자
	private 클래스() {}

	// 정적 메소드
	static 클래스 getInstance() {
		return singleton;
	}
}

 

final 필드

  • 초기값이 저장되면 최종적인 값이 되어 프로그램 실행 도중 수정 불가
  • final 필드의 초기값 주는 방법
    • 단순 값일 경우 필드 선언 시 초기화(주로 정적 필드(상수) 일 경우)
    • 객체 생성 시 외부 데이터로 초기화 필요한 경우 생성자에서 초기화(주로 인스턴스 필드일 경우)
  • 인스턴스 final 필드
    • 객체에 한 번 초기화된 데이터를 변경 불가로 만들 경우 ex) 주민번호
final 타입 필드 [= 초기값];
  • 정적 final 필드 (관례적으로 모두 대문자로 작성)
    • 불변의 값인 상수를 만들 경우 ex) PI
static final 타입 상수 = 초기값;

 

인스턴스 final 필드와 정적 final 필드(=상수)의 차이점

  • final 필드란 한 번 초기화되면 수정할 수 없는 필드이다. 그러면 final 필드를 상수라고 불러도 되지 않을까? 놉 불변의 값은 객체마다 저장할 필요가 없는 공용성을 띠고 있으며, 여러 가지 값으로 초기화될 수 없다.

 

마무리 핵심 키워드

  • 인스턴스 멤버: 인스턴스(instance) 멤버란 객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드를 말하는데, 이들 각각 인스턴스 필드, 인스턴스 메소들고 부른다.
  • this: 객체 내부에서도 인스턴스 멤버에 접근하기 위해 this를 사용할 수 있다. 주로 생성자와 매소드의 매개 변수 이름이 필드와 동일한 경우에 사용된다.
  • 정적 멤버: 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 의미한다.
  • static: 정적 멤버를 선언할 때 사용하는 키워드이다.
  • 싱글톤: 전체 프로그램에서 단 한나의 객체만 만들도록 보장해야 하는 경우 사용한다.
  • final 필드: 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없는 필드를 말한다. final 필드는 final 키워드로 선언한다.
  • 상수: 수학에서 사용되는 완주율 파이나 지구의 무게 및 둘레 같은 불변의 값을 저장하는 필드를 자바에서는 상수라고 한다. 상수는 final static 키워드로 선언한다.

 

 

 

※ 이 내용은 책 [혼자 공부하는 자바]를 보고 정리한 내용입니다.