* 제어자(modifier) 란?
- 클래스, 변수, 매서드의 선어부에 사용되어 부가적인 의미를 부여
- 제어자는 크게 접근 제어자와 그 외의 제어자로 나뉜다.
- 하나의 대상에 여러 개의 제어자를 조합하여 사용가능 하나 접근제어자는 단 하나만 사용할 수 있다.
* 접근 제어자 - public,protected, default, private
* 그 외 - static, final, abstract, nativem transient, synchronized, volatile, strictfp
-> static - 클래스의, 공통적인
static이 사용될 수 있는 곳 - 맴버변수, 매서드, 초기화블럭
제어자 |
대상 |
의미 |
static |
멤버변수 |
- 모든 인스턴에 공통적으로 사용되는 클래스 변수가 된다. - 클래스변수는 인스턴스를 생성하지 않고도 사용가능 - 클래스가 메모리에 로드될 때 생성 |
메서드 |
- 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다. - static매서드 내에서는 인스턴스 맴버들을 직접 사용할 수 없다. (왜? 클래스가 실행될때 생성 되기 때문에 인스턴스 멤버들은 초기화가 되어어야 생성되기 때문에 ) |
class StaticTest {
static int width = 200; //멤버변수에 stactic 제어자를 붙여 공통의 값을 정의한다.
static int height =120;; //멤버변수에 stactic 제어자를 붙여 공통의 값을 정의한다.
static { // 클래스의 초기화 블럭
// static변수의 복잡한 초기화 수행
}
static int max(int a, inb b) { //메서드에 static를 사용할 수 있다.
return a > b ? a: b; // 삼항 연산자
}
}
-> final - 마지막의, 변경될 수 없는 (상수)
final이 사용될 수 있는 곳 - 클래스, 매서드, 맴버변수, 지역변수
- final이 붙은 변수는 상수 이므로 보통 선언과 초기화를 동시에 하지만 인스턴스변수의 경우 생성자에 초기화
할수 있다.
제어자 |
대상 |
의미 |
final |
클래스 |
변경될 수 없는 클래스, 확장될 수 없는 클래스 다른 클래스의 조상이 될 수 없다.(상속 X) |
메서드 |
변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의 불가 (상속이 X 때문) | |
멤버변수 |
변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다 | |
지역변수 |
[참고] 대표적인 final. 클래스로 String과 Math가 있다.
-> abstract - 추상의, 미완성의
abstract가 사용될 수 있는 곳 - 클래스, 메서드
제어자 |
대상 |
의미 |
abstract |
클래스 |
클래스 내에 추상메서드가 선언되어 있음을 의미 |
매서드 |
선언부만 작성하고 구현부는 작성하지 않는 추상메서드임을 알린다. |
[참고] 추상메서드가 없는 클래스도 abstract를 붙여서 추상클래스로 선언 가능 하지만 그렇게 해야할 이유는 없다.
*접근 제어자 (access modifier)
- 맴버 또는 클래스에 사용되어, 외부로부터 접근을 제한한다.
- 외부로부터 데이터를 보호하기 위해서 사용(캡슐화)
- 외부에는 불필요한, 내부적으로 사용되는, 부분을 감추기 위해(캡슐화)
* 접근 제어자가 사용될 수 있는 곳 - 클래스, 맴버변수, 메서드, 생성자
private - 같은 클래스 내에서만 접근 가능
default - 같은 패키지 내에서만 접근 가능
protected - 같은 패지지 내에서, 다른 패키지 자손클래스 접근이 가능
public - 접근 제한이 전혀 없다.
제어자 |
같은 클래스 |
같은 패키지 |
자손클래스 |
전 체 |
public |
|
|
|
|
protected |
|
|
|
|
default |
|
|
|
|
private |
|
|
|
|
-> 생성자의 접근 제어자
- 일반적으로 생성자의 접근 제어자는 클래스의 접근 제어자와 일치
- 생성자에 접근 제어자 사용으로 인스턴스 생성을 제한할 수 있다.
-> 제어자의 조합
대상 |
사용가능한 제어자 |
클래스 |
public, (default),final, abstract |
메서드 |
모든 접근 제어자, final, abstract, static |
멤버변수 |
모든 접근 제어자, final, static |
지역변수 |
final |
1. 메서드에 static과 abstract를 함께 사용할 수 없다.
- static메서드는 몸통(구현부)이 있는 메서드에서 사용가능 하기 때문
2. 클래스에 abstract와 final을 동시에 사용 할 수 없다.
- 클래스에 final을 붙이면 클래스 확장 할수 없다는 의미고, abstract 상속을 통해서 완성 되어야 한다는 의미
이므로 서로 모순 된다.
3. abstract 메서드의 접급제어자가 private일 수 없다.
- abstract 메서드는 상속에 의한 자손클래스에 구현해 주어야 하기 때문
4. 메서드에 private과 final을 같이 사용할 필요는 없다.
- 접근 제어자가 private인 메서드는 오버라이딩될 수 없기 때문 둘중에 하나만 사용해도 충분하다.
* 다형성(polymorphism)
- 여러가지 형태를 가질 수 있는 능력
- 하나의 참조변수로 여러 타입의 객체를 참조할 수 있는것
즉 조상타입의 참조변수로 자손타입의 객체를 다룰 수 있는 것이 다형성이다.
'JAVA' 카테고리의 다른 글
예외처리(Exception handling) (0) | 2015.10.19 |
---|---|
자바의 객체지향개념 2-3 (0) | 2015.10.18 |
자바의 객체지향개념 2-1 (0) | 2015.10.05 |
자바의 객체지향개념 1-3 (0) | 2015.10.05 |
자바의 객체지향개념 1-2 (0) | 2015.10.05 |