인스턴스 멤버
객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드를 말하는데, 이들을 각각 인스턴스 필드, 인스턴스 메소드라고 부른다.
- 인스턴스 멤버 선언
// Car클래스에 인스턴스 필드 gas와 인스턴스 메소드 setSpeed()를 선언
public class Car {
//필드
int gas;
//메소드
void setSpeed(int speed) { ••• }
}
- this
- 객체 내부에서도 인스턴스 멤버에 접근하기 위해 this를 사용
- 객체는 자신을 this라고 한다.
정적 멤버
클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말하는데, 이들을 각각 정적 필드, 정적 메소드라고 부른다.
- 정적 멤버 선언
- 정적 필드와 정적 메소드를 선언하려면 필드와 메소드 선언 시 static 키워드를 추가적으로 붙이면 된다.
public class 클래스 {
//정적 필드
static 타입 필드 [= 초기값];
//정적 메소드
static 리턴 타입 메소드( 매개변수선언, • • ) { ... }
}
* 객체마다 가지고 있어야 할 데이터라면 인스턴스 필드로 선언하고, 객체마다 가지고 있을 필요가 없는 공용 데이터라면 정적 필드로 선언하는 것이 좋다.
- 정적 멤버 사용
- 클래스 이름과 함께 도트(.) 연산자로 접근
클래스.필드;
클래스.메소드( 매개값, … );
- 정적 메소드 선언 시 주의할 점
- 객체가 없어도 실행된다는 특징 때문에 정적 메소드를 선언할 때는 이들 내부에 인스턴스 필드나 인
스턴스 메소드를 사용할 수 없다. - 객체 자신의 참조인 this 키워드도 사용이 불가능
- 객체가 없어도 실행된다는 특징 때문에 정적 메소드를 선언할 때는 이들 내부에 인스턴스 필드나 인
// 정적 메소드에서 인스턴스 멤버를 사용하고 싶다면 다음과 같이 객체를 먼저 생성하고 참조 변수로 접근
static void method3() {
ClassName obj = new ClassName();
obj.fieldl = 10;
obj.methodl();
}
싱글톤
- 전체 프로그램에서 단 하나의 객체만 만들도록 보장해야 하는 경우가 있습니다. 단 하나만 생성된다고 해서 이 객체를 싱글톤이라고 한다.
- 싱글톤을 만들려면 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 한다.
- 외부에서 생성자 호출을 막기 위해 private를 붙여준다.
// 싱글톤을 만드는 코드
public class 클래스 {
//정적 필드 - private 접근 제한자를 붙여 외부에서 필드값을 변경하지 못하도록 막음
private static 클래스 singleton = new 클래스();
//생성자
private 클래스() {}
//정적 메소드 - getlnstanceO를 선언하고 정적 필드에서 참조하고 있는 자신의 객체를 리턴
static 클래스 getlnstance() {
return singleton;
}
}
final 필드
- 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없다.
- 초기값을 줄 수 있는 방법
- (단순 값인 경우) 필드 선언시에 주기
- (복잡한 초기화 코드, 객체 생성시) 생성자에게 주기
상수
- 불변의 값을 저장하는 필드 (ex) 원주율, 지구의 무게 및 둘레
- 객체마다 저장할 필요가 없는 공용성을 띤다.
- static이면서 final 이어야 한다.
static final double PI = 3.14159;
static final double EARTH_RADIUS = 6400;
static final double EARTH_AREA = 4 * Math.PI * EARTH_RADIUS * EARTH_RADIUS;
확인문제
1. 인스턴스 멤버와 정적 멤버에 대한 설명 중 맞는 것에 O표, 틀린 것에 X표 하세요.
① 정적 멤버는 static으로 선언된 필드와 메소드를 말한다. ( O )
② 인스턴스 필드는 생성자에서 초기화될 수 없다. ( X )
-> 인스턴스 필드는 생성자에서는 초기화될 수 있지만 정적 블록에서 초기화 될 수는 없다.
③ 정적 필드와 메소드는 객체 생성 없이 클래스를 통해 접근할 수 있다.( O )
④ 인스턴스 필드와 메소드는 객체를 생성하고 사용해야 한다. ( O )
2. final 필드와상수(static final)에 대한 설명으로 틀린 것은 무엇입니까?
① final 필드와 상수는 초기값이 저장되면 값을 변경할 수 없다.
② final 필드와 상수는 생성자에서 초기화될 수 있다. (X)
-> final 필드는 생성자에서 초기화될 수 있다. 하지만 상수는 선언 시 값을 주고나 정적 블록에서 초기화가 가능하다.
③ 상수의 이름은 대문자로 작성하는 것이 관례이다.
④ 상수는 객체 생성 없이 클래스를 통해 사용할 수 있다.
3. ShopService 객체를 싱글톤으로 만들고 싶습니다. ShopServiceExample 클래스에서 ShopService의 getlnstance() 메소드로 싱글톤을 얻을 수 있도록 ShopService 클래스를 작성해보세요.
package ch06.exam05;
public class ShopService {
private static ShopService singleton = new ShopService();
private ShopServiceO {}
static ShopService getlnstance() {
return singleton;
}
}
'JAVA' 카테고리의 다른 글
상속 (0) | 2022.10.31 |
---|---|
패키지와 접근 제한자 (0) | 2022.10.13 |
메소드 (0) | 2022.10.13 |
생성자 (0) | 2022.10.12 |
열거 타입 (1) | 2022.09.26 |