Chapter6. 클래스
06-5) 인스턴스 멤버와 정적 멤버
인스턴스 멤버와 this
인스턴스 멤버: 객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드. 객체마다 갖고 있는 멤버
정적 멤버: 클래스에 위치시키고 객체들이 공유하는 멤버
this: 내가 이미 생성한 인스턴스를 가리키는 것. 주로 생성자와 메소드의 매개 변수 이름이 필드와 동일한 경우, 인스턴스 멤버인 필드임을 명시하고자할 때 사용
ex) this.model은 자신이 가지고 있는 model필드라는 뜻. this.model = model;은 자신이 갖고 있는 model필드에 매개변수 model을 저장할 때 사용
class Accounting{
public double valueOfSupply;
public static double vatRate = 0.1;
public Accounting(double valueOfSupply) { //생성자 이름 = 클래스 이름
this.valueOfSupply = valueOfSupply;
} //위에 생성된 valueOfSupply필드(this.valueOfSupply)에 valueOfSupply변수를 저장
public double getVAT() {
return valueOfSupply * vatRate;
}
public double getTotal() {
return valueOfSupply + getVAT();
}
}
public class AccountingApp {
public static void main(String[] args) {
Accounting a1 = new Accounting(10000.0); //생성자 불러오면서, 매개변수 valueOfSupply에 10000.0 넣어줌
Accounting a2 = new Accounting(20000.0);
System.out.println("Value of supply : " + a1.valueOfSupply);
System.out.println("Value of supply : " + a2.valueOfSupply);
System.out.println("VAT : " + a1.getVAT());
System.out.println("VAT : " + a2.getVAT());
System.out.println("Total : " + a1.getTotal());
System.out.println("Total : " + a2.getTotal());
}
}
정적 멤버와 static
정적 멤버: 클래스에 위치시키고 객체들이 공유하는 멤버. 객체를 생성하지 않고 사용할 수 있는 필드, 메소드를 말함
필드, 메소드 선언할 때 static 키워드를 붙임
- 객체 없이 실행되기 때문에 정적 메소드 내부에 인스턴스 필드, 메소드 사용 X
- 객체 자신을 참조하는 this키워드도 사용 X
싱글톤
- 전체 프로그램에서 단 하나의 객체만 만들도록 보장해야하는 경우, 이 객체를 싱글톤singleton이라고 함
- 싱글톤을 만들려면 클래스 외부에서new연산자로 생성자를 호출할 수 없도록 해야함 -> private 접근제한자 붙이기
- 대신 외부에서 객체를 얻기 위해 getInstance() 메소드를 호출:
클래스 변수1 = 클래스.getInstace();
클래스 변수1 = 클래스.getInstace();
--> getInstance()메소드는 단 하나의 객체만 리턴하므로 변수1, 변수2는 동일객체 참조
final필드와 상수
- final필드는 저장된 초기값이 최종값 -> 수정X
- final필드의 초기값을 주는 방법 1) 필드 선언 시, 2)생성자에서 주는 방법
- 상수는 static이면서 final --> static final 필드는 객체마다 존재하지 X, 클래스에만 존재, 한번 저장되면 변경X
06-6) 패키지와 접근제한자
접근제한자
public 접근제한자: 모든 패키지에서 제한없이 필드, 메소드 사용가능
protected 접근제한자: 같은 패키지에 속할 때 사용 가능,default와 차이점은 다른 패키지에 속해도 해당 클래스의 자식클래스면 사용 가능함
default 접근제한자: 접근제한자 생략, 같은 패키지 내에서 사용가능
private 접근제한자: 클래스 내부에서만 사용 가능
Getter와 Setter메소드
- 사용 이유? 객체 지향 프로그래밍에서는 객체 외부에서 마음대로 변경을 할 경우 객체의 무결성이 깨질수 있기 때문에객체 외부에서 객체 필드에 직접적으로 접근하는 것을 막음 (예시: 자동차의 속력을 외부에서 음수로 변경하면 무결성 깨짐
)- setter메소드: 이러한 문제를 해결하기 위해 메소드를 통해 필드를 변경하는 방법을 선호함. 필드는 외부 접근 금지, 메소드는 공개한 후, 메소드가 매개값을 검증하고 유효한 값만 객체의 필드로 저장함
void setSpeed(double speed) {
if(speed < 0 ) {
this.speed = 0;
return; //매개값이 음수일 경우 speed 필드에 0으로 저장하고 메소드 실행 종료
} else {
this.speed = speed;
}
}
- getter메소드:외부에서 객체의 데이터를 읽을 때는 getter메소드로 필드값을 가공한 후, 외부로 전달함
double getSpeed() {
double km = speed*1.6;
return km; //필드값인 마일을 km단위로 환산 후 외부로 리턴
}
- 필드 타입이 boolean인 경우: getter메소드는 get으로 시작하지 않고 is로 시작하는 것이 관례
예제) Car클래스의 speed와 stop필드에 대한 Getter와 Setter를 작성
//Getter와 Setter메소드 선언
public class Car {
//필드
private int speed;
private boolean stop; //boolean의 초기값은 false
//생성자
//메소드
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
if(speed <0) {
this.speed = 0;
return;
} else {
this.speed = speed;
}
}
public boolean isStop() {
return stop;
}
public void setStop(boolean stop) {
this.stop = stop;
this.speed = 0;
}
}
//Getter, Setter메소드 사용
public class CarExample {
public static void main(String[] args) {
Car myCar = new Car();
//잘못된 속도 변경
myCar.setSpeed(-50); //Car클래스의 setter메소드에서 매개값 -50 검사
System.out.println("현재 속도: "+myCar.getSpeed()); //0으로 리턴
//올바른 속도 변경
myCar.setSpeed(60);
//멈춤
if(!myCar.isStop()) { //isStop()은 fasle
myCar.setStop(true); //setStop을 true로 맞춰줌(Setter 호출 -> 필드를true로, speed를 0으로
}
System.out.println("현재 속도: "+myCar.getSpeed());
}
}
출력결과:
현재 속도: 0
현재 속도: 0
** 이클립스에서 Getter/Setter메소드 자동 생성 가능
필드 선언 후, [Source] - [Generate Getters and Setters] 메뉴 선택하면 자동생성됨
'Java' 카테고리의 다른 글
220117 혼자공부하는자바 Ch7 상속, Chp8 인터페이스 (0) | 2022.01.18 |
---|---|
220115 혼자공부하는자바 Ch7 상속 (0) | 2022.01.15 |
220109 혼자공부하는자바 Ch6~ 모르는 부분 리마인드 (0) | 2022.01.11 |
220109 혼자공부하는자바 Ch5 모르는 부분 리마인드 (0) | 2022.01.11 |
220107 혼자공부하는자바 Ch1~Ch5 모르는 부분 리마인드 (0) | 2022.01.11 |