제어자(Modifier)
접근제어자 : public, protected, default, private
그 외 : static ,abstract, final, ..
접근제어자는 한번에 하나만 쓸 수 있으며 그 외에는 조합하여 사용할 수 있다.
접근 제어자 (Access Modifier)
외부에서 접근하지 못하도록 제한하는 역할을 하며 접근자가 지정되어 있지 않다면 접근 제어자는 default가 된다
public : 접근제한 X
protected : 같은 패키지 내에서 접근, 다른 패키지의 자손 클래스에서 접근 가능
default : 같은 패키지 내에서만 접근
private : 같은 클래스 내에서만 접근하나의 .java 파일에서는 public 클래스가 단 하나만 존재할 수 있으며 파일의 이름은 반드시 public 클래스명과 같아야함
접근 제어자를 이용한 캡슐화 (Encapsulation)
- 외부로부터 데이터를 보호하기 위해서
- 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서
메서드 하나를 변경해야 한다면 이 메서드의 접근제한자가 public일 경우 메서드 변경후 오류가 없는지 확인해야 할 범위가 넓지만 default일 경우 같은 패키지내만 확인하면 되고, private일 경우 클래스 내부만 확인해보면 된다. 이와 같은 이유로 접근 범위를 최소화하도록 노력하는것이 좋음
생성자의 접근 제어자
보통 생성자의 접근 제어자는 클래스의 접근 제어자와 같지만 접근제어자를 사용함으로써 인스턴스의 생성을 제한 할 수 있다.
생성자의 접근 제어자를 private으로 지정, 외부에서 생성자에 접근할 수 없으므로 인스턴스를 생성할 수 없게 됨, 대신 인스턴스를 생성후 반환하는 public 메서드를 제공함으로써 외부에서 이 클래스의 인스턴스를 사용할 수 있음class Singleton{ private static Singleton s = new Singleton(); private Singleton (){} // 인스턴스를 생성하지 않고도 호출해야함 // public인 동시에 static이어야 한다 public static singleton getInstance(){ return s; } }
생성자가 private인 클래스는 다른 클래스의 조상이 될 수 없음, 자손 클래스의 인스턴스를 생성할 때 조상클래스의 생성자를 호출해야 하는데 생성자의 접근 제어자가 private이므로 자손클래스에서 호출하는것이 불가능 함
그래서 클래스 선언 앞에 final을 추가하여 상속이 불가한 클래스라는것을 명시하는게 좋음
그 외 제어자
static (클래스의, 공통적인)
- 사용 범위 : 멤버변수, 메서드, 초기화 블럭
맴버변수
모든 인스턴스에 공통적으로 사용되는 클래스 변수
클래스 변수는 인스턴스를 생성하지 않고도 사용 가능
클래스가 메모리에 로드될 때 생성됨메서드
인스턴스를 사용하지 않고도 호출이 가능한 메서드
static 메서드 내에서는 인스턴스 맴버들을 직접 사용할 수 없음- 인스턴스 메서드와 static 메서드의 근본적인 차이는 매서드 내에서 인스턴스 맴버를 사용하는가의 여부
인스턴스를 생성하지 않고도 호출이 가능하여 더 편리하고 속도도 빠르기 때문에 인스턴스 맴버를 사용하지 않는 메서드는 static 선언을 고려해보도록
final (마지막의, 변경될 수 없는)
사용 범위 : 클래스, 메서드, 맴버변수, 지역변수
클래스 : 변경될 수 없는 클래스, 자손을 가질 수 없음 (조상이 될 수 없음)
메서드 : 오버라이딩으로 재정의 될 수 없음
맴버변수, 지역변수 : 값을 변경할 수 없는 상수
생성자를 이용한 final 맴버 변수의 초기화
일반적으로 final이 붙은 상수는 선언과 동시에 초기화 해야하지만
인스턴스 변수의 경우 생성자에서 초기화가 가능함매개변수를 갖는 생성자를 선언
그 생성자의 매개변수 값으로 상수를 초기화
이것이 불가능 하다면 클래스에서 선언된 final 인스턴스변수는 모든 인스턴스에서 같은 값을 가져야 함
abstract (추상의, 미완성의)
사용 범위 : 클래스, 메서드
클래스 : 클래스 내에 추상 메서드가 선언되어 있음을 의미
메서드 : 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알림
추상 클래스는 아직 완성되지 않은 메서드가 존재하는 완성 설계도
제어자 조합
- 사용가능한 제어자
- 클래스 : public, default, final, abstract
- 메서드 : 모든 접근 제어자, final, abstract, static
- 맴버변수 : 모든 접근 제어자, final, static
- 지역변수 : final
- 제어자 조합 주의 사항
- 메서드에 static과 abstract를 함께 사용할 수 없다
- static 메서드는 몸통이 있는 메서드에만 사용할 수 있다.
- 클래스에 abstarct와 final을 동시에 사용할 수 없다
- 클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미, abstract는 상속을 통해 완성이 되기 때문에 서로 모순됨
- abstract 메서드의 접근제어자가 private일 수 없다
- 추상 메서드는 자손 클래스에서 구현해주어야 하는데 접근 제어자가 private면 자손 클래스에서 접근이 불가능하다
- 메서드에 private과 final을 같이 사용할 필요는 없다
- 접근제어자가 private일 경우 오버라이딩 될 수 없기 때문에 둘중 하나만 사용해도 의미가 충분하다
- 메서드에 static과 abstract를 함께 사용할 수 없다
- 사용가능한 제어자
'Main > Java' 카테고리의 다른 글
[JAVA] 커스텀 Exception 클래스 만들기 (0) | 2020.08.06 |
---|---|
[JAVA] 파일을 byte 배열로 변환 하는 방법 (0) | 2020.07.30 |
[JAVA] 오버로딩과 오버라이딩 (0) | 2020.01.16 |
[JAVA] 클래스변수 (Static 변수), static (0) | 2020.01.14 |
[JAVA] 생성자 (Constructor) , this(), this (0) | 2020.01.14 |