접근제한자
- 자바는 클래스, 메소드, 필드 등에 사용하여 외부에서의 접근을 제한하는 접근제한자가 있다!
- 자바의 접근제한자는 public, protected, default, private가 있다.
- 접근제한자에 대해서 알아보자!
접근제한자의 종류
- public : 모든 접근을 허용
- protected : 같은 패키지에 있는 클래스와 자식의 클래스들만 허용
- default : 같은 패키지에 있는 클래스들만 허용
- private : 현재 클래스 내에서만 허용
- 접근제한자의 적용 대상과 접근 가능 대상을 표로 알아보자.
접근 제한자 | 적용 대상 | 접근 가능 대상 |
---|
public | 클래스, 메소드, 생성자, 필드 | 모든 접근 |
protected | 메소드, 생성자, 필드 | 같은 패키지에 있는 클래스 |
자식의 클래스 | | |
default | 클래스, 메소드, 생성자, 필드 | 같은 패키지에 있는 클래스 |
private | 메소드, 생성자, 필드 | private이 선언된 클래스 내부 |
- 기본적으로 아무 선언을 해주지 않으면 default 선언이 된다.
클래스 사용 접근제한자
- 다른 메소드, 생성자, 필드는 모든 접근제한자를 사용할 수 있지만 클래스에는 public 접근 제한자와 default 접근 제한자만 사용할 수 있다.
- public을 선언해주면 다른 패키지에서도 아무런 제한 없이 사용할 수 있기 때문에 다른 개발자가 사용하도록 라이브러리 클래스로 개발 시 주로 이용한다.
- default 선언을 해주거나 아무 선언도 하지않으면 default 클래스가 된다. default 클래스는 같은 패키지 내에서만 사용 가능하다.
- 클래스에서 필드를 private로 선언해주면 죽어도 클래스 외부에서 접근이 불가능한걸까,,,
- 아니다! 놀랍게도 필드를 외부에서 직접 접근이나 변경은 못하게 하고 메소드를 통해 접근, 변경을 할 수 있는 방법이 있다!
getter,setter 메소드
- 객체 지향 프로그래밍에서는 객체의 데이터를 외부에서 읽고 변경 시 객체의 무결성이 깨질 수도 있기 때문에 메소드를 통해 데이터를 변경하는 방법을 선호한다.
- 데이터는 외부에서 접근하지 않도록 막고 메소드는 공개하여 외부에서 메소드를 통해 데이터에 접근할 수 있도록 유도한다.
- 메소드는 매개변수의 타입을 검증하여 유효한 값만 데이터에 저장할 수 있다는 장점도 있다.
- 이 때 값을 저장해주는 메소드가 setter메소드이고, 값을 반환해주는 메소드가 getter메소드이다.
- 우선 객체의 데이터를 외부에서 접근할 수 있는 아주아주아주 안좋은 방식을 한번 알아보자.
public class Book {
public int price = 50;
private int i ;
}
public class BookExam {
public static void main(String[] args) {
Book b1 = new Book();
b1.price=100;
System.out.println(b1.price);
b1.i=50;
}
}
- 위와 같이 price 값이 public으로 선언되어 있기 때문에 외부에서 마음대로 수정이 가능하다.
- 그래서 클래스 외부에서 접근하지 못하도록 i와 같이 private로 선언해주고 사용해야 한다.
- private한 필드는 외부에서 접근하지 못하기 때문에 setter,getter를 사용하여 값을 저장하고 꺼내온다.
- 한번 예시를 통해 setter 메소드와 getter 메소드를 사용해보자
public class Book {
private int price = 50;
public int getPrice() {
return this.price;
}
public void setPrice(int price) {
this.price = price;
}
}
public class BookExam {
public static void main(String[] args) {
Book b1 = new Book();
System.out.println(b1.getPrice());
b1.setPrice(500);
System.out.println(b1.getPrice());
}
}
- 위의 코드를 보면 b1객체를 생성해주고 setPrice라는 setter 메소드를 통해 b1 객체의 price값을 변경하고 getPrice라는 getter 메소드를 통해 b1 객체의 price값을 반환해주고 있다.
- 메소드가 길어지면 메소드에서 선언된 지역 변수인지, 필드인지 착각할 수도 있기 때문에 인스턴스 필드를 사용할 때는 this.price라고 적어줄 수도 있다. this는 자신 인스턴스를 참조하는 예약어 키워드이다.
- 인스턴스가 생성되지 않아도 사용가능한 클래스 메소드(static 메소드)에서는 this 키워드를 사용할 수 없다. → 메모리에 생성되는 시점이 다르기 때문에
- setPrice
- price : 지역 변수
- this.price : 인스턴스 변수
- 매개 변수로 받은 지역 변수 price로 this.price를 초기화한다.
- getPrice
- setter, getter 메소드를 프로퍼티라고 한다.
- mac에서는 crtl+enter를 통해서 getter,setter 메소드를 자동으로 만들어줄 수 있다.(진짜 편함..)