외부에서 객체 생성을 막기 위해 생성자를 호출하지 못하게 하거나, 객체의 특정 데이터를 보호하기 위해 해당 필드(field)에 접근하지 못하도록 막는것.
1) public
: 다른 패키지에 접근 가능 .
2) protected
: 동일한 패키지 혹은 다른 패키지의 클래스가 해당 클래스의 자식 클래스일 경우에 접근가능. (이때 자식클래스 내에서 부모클래스의 인스턴스 변수로 접근 할 수는 없다)
3) default
: 동일한 패키지에서만 접근 가능. (클래스를 선언할 때 접근 제어자가 없다면 자동으로 default 접근 제한을 가진다)
4) private
: 동일한 클래스에서만 접근 가능.
클래스에 생성자를 선언하지 않으면 컴파일러에 의해 자동적으로 기본 생성자가 추가된다. 클래스가 갖는 접근 제한에 따라서 기본 생성자도 똑같은 접근 제한을 갖는다.
public class 클래스이름 {
// public 접근 제한
public 클래스이름(...) {...}
// protected 접근 제한
protected 클래스이름(...) {...}
// default 접근 제한
클래스이름(...) {...}
// private 접근 제한
private 클래스이름(...) {...}
}
필드와 메서드를 클래스 내부에서만 사용할 것인지, 동일 패키지 내에서 사용할 것인지, 다른 패키지에서도 사용할 수 있도록 할 것인지에 대하여 접근 제한을 걸어서 결정.
// 필드 접근 제한 선언
[ public | protected | private ] [static] 타입 필드이름;
// 메서드 접근 제한 선언
[ public | protected | private ] [static] 리턴타입 메서드이름(...) {...}
자기 자신의 heap 공간을 가르키는 참조변수.
void setColor(String color) {
this.color = color;
}
// 인스턴스 변수와 지역변수 구분
Car(String color, int size) {
this.color = c;
this.size = s;
}
// this 생략
Car(String c, int s) {
color = c;
size = s;
}
생성자내에서 다른 생성자를 호출 할 때 사용한다.
다른 생성자를 호출시 반드시 첫 줄에서만 사용해야 한다. (첫 줄을 제외한 다른 줄에서는 에러 발생)
클래스 (매개변수 선언, ...) {
this(매개변수, ... , 값, ...);
실행문;
}
1. 생성자 간 중복된 코드가 많은 문제가 발생
public class Car {
String company = "현대자동차";
String model;
String color;
int maxSpeed;
Car() {
}
Car(String model) {
this.model = model;
this.color = "은색";
this.maxSpeed = 250;
}
Car(String model, String color) {
this.model = model;
this.color = color;
this.maxSpeed = 250;
}
Car(String model, String color, int maxSpeed) {
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
}
2. 생성자 this( )를 활용하여 중복된 코드를 줄여서 개선
public class Car {
String company = "현대자동차";
String model;
String color;
int maxSpeed;
Car() {
}
Car(String model) {
this(model, "은색", 250);
}
Car(String model, String color) {
this(model, color, 250);
}
Car(String model, String color, int maxSpeed) {
this.model = model;
this.color = color;
this.maxSpeed = maxSpeed;
}
}
public class CarExample {
public static void main(String[] args) {
Car car1 = new Car("소나타");
showField(car1);
Car car2 = new Car("그랜저", "빨간색");
showField(car2);
}
static void showField(Car myCar) {
System.out.println("myCar.company = " + myCar.company);
System.out.println("myCar.model = " + myCar.model);
System.out.println("myCar.color = " + myCar.color);
System.out.println("myCar.maxSpeed = " + myCar.maxSpeed);
System.out.println("======================================================");
}
}
출처
- 이지업 컨텐츠 내의 데어프로그래밍 자바강의
- 이것이 자바다 (책)