본문 바로가기
Java

220112 혼자공부하는자바 Ch6-5~ 모르는 부분 리마인드

by 행인데어 2022. 1. 12.

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] 메뉴 선택하면 자동생성됨