클래스에 적용할 수 있는 제한자는 public과 default 단 두가지이다.
// default 접근 제한
class 클래스 { ... }
// public 접근 제한
public class 클래스 { ... }
default 접근 제한
클래스 선언시 public을 생략했다면 클래스는 자동으로 default 접근 제한을 가진다. 이 경우 같은 패키지에서는 아무런 제한 없이 사용할 수 있지만 다른 패키지에서는 사용할 수 없도록 제한된다.
public 접근 제한
클래스 선언시 public 을 붙였다면 public 접근 제한을 가진다. 이 경우 같은 패키지 뿐 아니라 다른 패키지에서도 아무런 제한 없이 사용할 수 있다.
객체를 생성하기 위해서는 new 연산자로 생성자를 호출해야 한다. 하지만 어디에서나 호출할 수 있는 것은 아니다. 생성자가 어떤 접근 제한을 갖느냐에 따라 호출 가능 여부가 결정된다.
필드와 메소드를 선언시 고려해야 할 사항은 클래스 내부에서만 사용할 것인지, 패키지 내에서만 사용할 것인지. 아니면 다른 패키지에서도 사용할 수 있도록 할 것인지를 결정해야한다.
-외부에서 마음대로 읽고 변경할 경우 객체의 무결성이 깨어질 수도 있기 때문에, 일반적으로 객체 지향 프로그래밍에서 객체의 데이터는 객체 외부에서 직접적으로 접근하는 것을 막는다.
-데이터는 외부에서 접근할 수 없도록 막고, 메소드는 공개해 외부에서 메소드를 통해 데이터에 접근하도록 유도한다. 이러한 역할을 하는 메소드가 Setter이다.
private int speed;
// 데이터(변수)는 외부에서 접근할 수 없도록 private 제한자
...
public void setSpeed(double speed) {
if(speed < 0) {
this.speed = 0;
return;
} else {
this.speed = speed;
}
}
// 외부에서 메소드를 통해 접근하도록 public 제한자
// 매개값이 음수일 경우 speed 필드에 0으로 저장하고, 메소 실행 종료
외부에서 객체의 데이터를 읽을 때도 메소드를 사용하는 것이 좋다. 이런 경우 메소드로 필드값을 가공한 후 외부로 전달하면 된다. 이런 메소드가 바로 Getter
double getSpeed() {
double km = speed * 1.6;
return km;
}
// 필드값인 마일을 km 단위로 환산 후
// 계산 결과를 외부로 리턴
이렇게 클래스를 선언할 때 가능하다면 필드는 private로 선언하여 외부로부터 보호하고, 필드에 대한 Setter 와 Getter 메소드를 작성해 필드값을 안전하게 변경/사용하는 것이 좋다.
(1)
private 타입 fieldName;
// Getter
//메소드 이름 : get+필드이름(첫문자는 대문자)
public 리턴 타입 getFieldName() {
return fieldName;
}
// Setter
//메소드 이름 : set+필드이름(첫문자는 대문자)
public void setFieldName(타입 fieldName) {
this.fieldName = fieldName;
}
------------------------------------------------------------
(2) 필드 타입이 boolean일 경우
private boolean stop;
// Getter
public boolean isStop() {
//boolean의 경우 get으로 시작하지 않고 is로 시작한다
return stop;
}
// Setter
public void setStop(boolean stop) {
this.stop = stop;
}
만약 외부에서 필드값을 읽을 수만 있고 변경하지 못하게 하려면 Getter 메소드만 선언해도 좋고, Setter 메소드를 private 제한을 갖도록 선언해도 좋다.
ex
(1)
package getter_setter;
public class Car {
private int speed;
private boolean stop;
// 필드값을 private로 접근제한
// 메소드로 spped 값을 처리할수 있게끔함
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
// 메소드로 stop 처리
public boolean getStop() {
return stop;
}
public void setStop(boolean stop) {
this.stop = stop;
}
}
(2)
package getter_setter;
public class Carbusiness {
public static void main(String[] args) {
Car myCar = new Car();
// myCar.speed = 120;
// 스피드 값은 private이기 때문에 직접 접근 불가
//메소드로 집어넣습니다
myCar.setSpeed(120);
// 직접 값 출력 못함.
//System.out.println(myCar.speed);
// 메소드 통해 접근
System.out.println(myCar.getSpeed());
}
}
//getter setter은 이클립스에서 자동 작성되게 할 수도 있다. (Sourse)부분에 있고, 필요한 필드값만 선택하면 해당 필드값으로 작성이 된다. 당연 메소드 내용 변경은 셀프