클래스, 변수, 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.
- 하나의 대상에 대해서 여러 제어자를 조합하여 사용하는 것이 가능하다.
- 접근 제어자는 4가지 중 하나만 선택해서 사용할 수 있다.
- 제어자들 간의 순서는 관계없지만 주로 접근 제어자를 제일 왼쪽에 놓는다.
제어자의 종류
- 접근 제어자: public, protected, (default), private
- 그 외: static, final, abstract, native, transient, synchronized, volatile, stricffp
- static, final, abstract만 보통 자주 사용된다.
static - 클래스의, 공통적인
static이 붙은 멤버변수(클래스 변수)처럼 인스턴스에 관계없이 같은 값을 같는다. → 하나의 변수를 모든 인스턴스가 공유하기 때문이다.
static이 붙은 멤버변수, 메서드 그리고 초기화 블럭은 인스턴스가 아닌 클래스에 관계된 것이라서 인스턴스를 생성하지 않고도 사용할 수 있다.
static이 사용될 수 있는 곳 - 멤버변수, 메서드, 초기화 블럭
[java] static 파헤치다..!
클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 붙이기 생성된 인스턴스는 서로 독립적이기 때문이다. Card c1 = new Card(); //new 연산자를 통해서 독립적으로 만들기 Card
uhanuu.tistory.com
final - 마지막의, 변경될 수 없는
💡 final이 사용될 수 있는 곳 - 클래스, 메서드, 멤버변수, 지역변수
- 변수에 사용되면 값을 변경할 수 없는 상수가 된다.
- 메서드에 사용되면 오버라이딩을 할 수 없게 된다.
- 클래스에 사용되면 자신을 확장하는 자식클래스를 정의하지 못하게 한다. (즉 부모가 될 수 없음)
abstract - 추상의, 미완성의
메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않은 추상 메서드를 선언하는데 사용된다.
- 클래스에 사용되면 클래스 내에 추상메서드가 존재한다는 것을 알 수 있게한다.
💡 abstract가 사용될 수 있는 곳 - 클래스, 메서드
abstract public class Study { //추상 클래스(추상 메서드가 포함한 클래스)
abstract void test1(int j); //추상 메서드(구현부가 없는 메서드)
}
추상 클래스는 아직 완성되지 않은 메서드가 존재하는 상태이기 때문에 인스턴스를 생성할 수 없다.
Study study = new Study() {
@Override
void test1(int j) {
out.println("hihi"); //Override해서 구현부 작성해줘야 된다.
}
};
Override해서 구현부 작성해줘야 된다.
[java] 추상클래스와 추상메서드
추상클래스 클래스가 미완성이다. → 멤버의 개수에 관계된 것이 아니라, 미완성 메서드(추상 메서드)를 포함하고 있다는 의미 💡 추상 클래스로 인스턴스 생성할 수 없다. 추상 클래스는 상속
uhanuu.tistory.com
접근 제어자(Access Modifier)
멤버 또는 클래스에 사용되어, 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역활을 한다.
private
- 접근제어자가 private으로 설정되었다면 private 이 붙은 변수, 메서드는 해당 클래스에서만 접근이 가능하다.
default
접근 제어자를 별도로 설정하지 않는다면?
- 접근 제어자는 default
- 같은 패키지 내에서만 접근이 가능하다.
protected
- 접근제어자가 protected로 설정되었다면 protected가 붙은 변수, 메서드는 같은 패키지의 클래스 또는 해당 클래스를 상속받은 다른 패키지의 클래스에서만 접근이 가능하다.
public
- 접근제어자가 public으로 설정되었다면 접근 제한이 전혀 없기 때문에 어떤 클래스에서라도 접근이 가능하다.
💡 접근 제어자가 사용될 수 있는 곳 - 클래스, 멤버변수, 메서드, 생성자
접근 제어자는 private -> default -> protected -> public 순으로 보다 많은 접근을 허용한다.
제어자 | 같은 클래스 | 같은 패키지 | 자손클래스 | 전체 |
public | O | O | O | O |
protected | O | O | O | |
(default) | O | O | ||
private | O |
접근 제어자가 있는 이유
- 데이터가 유효한 값을 유지하게 하기
- 비밀번호와 같은 데이터를 외부에서 함부로 변경하지 못하도록 외부에서 접근 제한하기
- 데이터 감추기(data hiding)라고 하며 객체지향개념의 캡슐화(encapsulation)에 해당하는 내용
- 클래스 내에서만 사용되는, 내부 작업을 위해 임시로 사용되는 멤버변수나 부분작업을 처리하기 위한 메서드 등의 멤버들을 클래스 내부에서 감추기 위해서 사용
- 외부에서 접근할 필요가 없는 멤버들은 private으로 지정해서 외부에 노출시키지 않는다.(복잡성을 줄일 수 있다.)
- 외부에서 멤버 변수 값을 잘못 변경하는 경우도 존재하기 때문에 멤버 변수를 private로 설정하고 Setter를 통해 값을 대입하고 Getter를 통해 값을 출력하는 안전한 코드 개발 가능
💡 접근제어자 → 외부로부터 데이터를 보호하기 위해서, 외부에는 불필요한, 내부적으로만 사용되는,부분을 감추기 위해서 사용된다. (캡슐화)
public class Time {
private int hour;
private int minute;
private int second;
public int getHour(){return hour;}
public void setHour(int hour){
if(hour < 0 || 23 < hour) return;
this.hour = hour;
}
public int getMinute(){return minute;}
public void setMinute(int minute){
if(minute < 0 || 59 < minute) return;
this.minute = minute;
}public int getSecond(){return second;}
public void setSecond(int i){
if(second < 0 || 59 < second) return;
this.second = second;
}
}
public static void main(String[] args) {
Time time = new Time();
time.setHour(3);
System.out.println(time.getHour());
}
멤버변수를 private 이나 protected로 제한하고 멤버변수의 값을 읽고 변경할 수 있는 public method를 제공해서 setter를 통해서 매개변수에 지정된 값을 검사해서 조건에 맞는 값일 때만 멤버변수의 값을 변경하도록 작성하자
- 만일 상속을 통해 확장될 것이 예상되는 클래스라면 멤버에 접근 제한을 주되 자식클래스에서 접근하는 것이 가능하도록 하기 위해서 private 대신 protected를 사용하기(private은 자식 클래스 접근 못한다.)
링크 참조
[JAVA]접근 제어자(Access modifier) 개념 및 구현
1. 접근 제어자(Access modifier) 란? 1) 개념 접근 제어자를 통해 변수, 메서드, 성생자에 대한 접근 권한을 지정할 수 있다. 종류는 public, private, protected, 아무것도 쓰지 않는 default 접근 제어자가 존재
peemangit.tistory.com
07-02 접근제어자 (Access Modifier)
자바는 접근제어자를 사용하여 변수나 메서드의 사용 권한을 설정할 수 있다. [TOC] ## 접근 제어자 변수나 메서드의 사용 권한은 다음과 같은 접근 제어자를 사용하여 …
wikidocs.net
'책 > Java의 정석' 카테고리의 다른 글
[java] 인터페이스 && default 메서드와 static 메서드 (0) | 2023.02.04 |
---|---|
[java] 추상클래스와 추상메서드 (0) | 2023.02.04 |
[java] import문 (0) | 2023.02.04 |
[java] 패키지(package) (0) | 2023.02.04 |
[java] 참조변수(super) (0) | 2023.02.04 |