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 키워드로 선언한다.
※ 이 내용은 책 [혼자 공부하는 자바]를 보고 정리한 내용입니다.
'🌎 Web > Java' 카테고리의 다른 글
[Java] 상속(inheritance) (0) | 2022.12.05 |
---|---|
[Java] 패키지와 접근 제한자 (0) | 2022.11.30 |
[Java] 메소드(method) (2) | 2022.11.28 |
[Java] 필드(Field)와 생성자(Constructor) (4) | 2022.11.25 |
[Java] 객체 지향 프로그래밍 (0) | 2022.11.22 |