본문 바로가기

자바(JAVA)
[자바(Java)] 접근 지정자(제어자), Getter Setter

//접근 지정자(제어자), Access Modifier

- 클래스 멤버 변수에 붙여서 사용한다.

- 클래스 멤버 메서드에 붙여서 사용한다.

- 클래스 자체에 붙여서 사용한다.

- 멤버를 외부에 공개할지 말지 결정하는 역할 > 클래스가 경계선 역할
   > 멤버 노출 수위를 조절하는 역할
   > 외부에 멤버 공개 유무 조절하는 역할

   1. public: 어디서든 접근 가능
   2. protected: 동일 패키지나 상속관계의 클래스에서만 접근 가능
   3. 생략 가능 => default private(생략된 것: 패키지 접근은 가능하다.)
   4. private: 같은 클래스 내부에서만 접근 가능(외부, 상속 관계 클래스에서도 접근 불가!)
          - 은닉화(자바의 장점)
          - Getter(get()) 및Setter(set())을 이용하여 멤버 변수의 값을 변경하거나 값을 가져옴.


// 클래스의 멤버 변수 접근 지정자


1. private으로 지정 > 유효하지 않은 값이 들어갈까봐...
2. public 메서드 선언 > private 변수 접근

- Setter : set변수명();
    ~ public void setModel(String model) {
              this.model = model;
       }
    this : 객체 접근(지정) 연산자 > 객체 자신을 가리키는 표현

- Getter : 자료형 get변수명();
    ~ public String getModel(); {
           return this.model;
       }
       ※ 만약 영어로 입력 받고 한글로 값을 돌려줘야 한다면 Getter에서 작업(데이터 가공)

  
- 필드 vs 프로퍼티 (자바에서)
    ~ c1.type > public 변수  > field(필드)
    ~ c1.getType > private 변수 통제  > property(프로퍼티)  
  
    a. 읽기 쓰기 가능한 멤버(읽기 쓰기 가능한 프로퍼티)
        ~ c1.setColor("white");
        ~ System.out.println(c1.getColor());

    b. 쓰기 전용 멤버(쓰기 전용 프로퍼티)
         ~ c1.setWeight(500);

    c. 읽기 전용 멤버(읽기 전용 프로퍼티)
         ~ System.out.println(c1.getPrice());

    d. 계산된 프로퍼티 (사용자 입장에서는 level이라는 변수가 있다고 생각하게끔..)
        ~ System.out.println(c1.getLevel()); 
       

//Setter

public void setFieldName(타입 fieldName) {
    this.fieldName = fieldName;
}

public void setAge(int age) {
    this.age = age;
}

 

// Getter

public 타입 getFieldName() {
    return fieldName;
}

public int getAge() {
    return age;
}

Getter Setter

package exam01.sample01;

public class Car {
	// 필드 선언
	private int speed;
	private boolean stop;
	
	public int getSpeed() {
		return speed;
	}
	public void setSpeed(int speed) {
		if(speed < 0) {
			this.speed = speed;
			return;
		}
		else {
			this.speed = speed;
		}
	}
	
	public boolean isStop() {
		return stop;
	}
	public void setStop(boolean stop) {
		this.stop = stop;
	}
}

 

package exam01.sample01;

public class CarTest {

	public static void main(String[] args) {
		Car myCar = new Car();
		
		myCar.setSpeed(-50);
		System.out.println("현재 속도는 : " + myCar.getSpeed());
		
		myCar.setSpeed(70);
		System.out.println("현재 속도는 : " + myCar.getSpeed());
		
		if(myCar.isStop()) {
			myCar.setStop(true);
		}
		System.out.println("현재 속도는 : " + myCar.getSpeed());
	}
}


** 타입이 boolean인 경우 Getter에서 getFieldName()이 아니라 isFieldName()으로 사용한다.


//접근제어지시자

public class C1 {   //Package p1
	public int x;
	protected int y;
	private int u;
	int z; // private 생략(패키지 접근 가능)
	protected void m() {}
}
	

public class C2 {   //Package p1
	C1 o = new C1();
	can access o.x;
	can access o.y;
	cannot access o.u; //private
	can access o.z;
	can access o.m();
}

public class C3 extends C1 { //상속 관계   //Package p1
	can access x;
	can access y;
	can access z;
	cannot access u;
    
	can invoke m();
}

public class C4 extends C1 {   //Package p2
    can access x;
    can access y;
    cannot access z;
    cannot access u;
    
    can invoke m();
}

public class C5 {   //Package p2
    C1 o = new C1();
    can access o.x;
    cannot access o.y;
    cannot access o.z;
    cannot access o.u;
    
    cannot invoke o.m();
}

// class() 앞에 접근 제어 지시자 private 선언 ==> 싱글 패턴 ==> new 연산자로 생성자를 호출(X)
 
- private class() {}  ==> 외부에서 마음대로 객체를 생성할 수 없다.