[Java] static, final, abstract의 정의
제어자
제어자(modifier)는 클래스, 메서드, 변수의 선언부에 함께 사용되어 부가적인 의미를 부여한다.
제어자의 종류는 크게 2가지이다.
접근제어자와 그 외의 제어자로 나뉜다.
접근 제어자 | public, protected, (default), private |
그 외 | static, final, abstract, native, transient, synchronized, volatile, stricffp |
하나의 대상에 제어자를 여러개 사용할 수 도 있다. (단, 접근 제어자는 반드시 하나여야 한다.)
public static final int value=5;
위 코드는 제어자를 3개 사용했다. (접근 제어자 1+ 그 외 제어자 2)
이처럼 하나의 대상에 꼭 하나의 제어자만 사용할 수 있는 게 아니다.
위 제어자들의 순서는 꼭 저렇게 안해두 된다. static이 맨 앞으로 갈 수 있다. final도 마찬가지이다.
(대부분 접근 제어자를 제일 앞에 쓴다.)
static
static은 자주 사용한 제어자이다. static의 정의는 클래스의, 공통적인 이라고 볼 수 있다.
static을 사용한 변수, 메서드는 인스턴스를 생성하지 않고도 사용할 수 있다는 특징을 지닌다.
인스턴스메서드와 static메서드의 차이는 메서드 내에서 인스턴스 멤버를 사용 가능한가의 여부 차이이다.
static이 사용될 수 있는 곳- 멤버 변수, 메서드, 초기화 블럭
제어자 | 대상 | 의미 |
static | 맴버변수 | - 모든 인스턴스에 공통적으로 사용되는 클래스 변수이다. - 클래스 변수는 인스턴스를 생성하지 않고 사용할 수 있다. - 클래스가 메모리에 로드될 때 생성된다. |
메서드 | - 인스턴스를 생성하지 않고 호출이 가능해진다. - static메서드 내에서는 인스턴스맴버들을 직접 사용하지 못한다. |
class ClassEx{
static int width=150; //cv(class variable)
static int height=300; //cv(class variable)
static {
/*
* static 초기화 블럭
*/
}
static int size(int x, int y) {
return 0; //cm(class method)
}
}
다시 정리하면 위에 멤버들은 객체 생성 없이 사용이 가능하다.
단, 인스턴스 변수와 instance메서드를 사용하지 못한다.
final
final의 정의는 마지막의, 변경될 수 없는이다. final 제어자는 거의 모든 대상에 사용할 수 있다.
final의 정의처럼 final이 사용된 대상은 변경이 불가능해진다.
변수에 사용되면 값을 변경할 수 없는 상수가 된다. 메서드에 사용하면 오버라이딩을 할 수 없는 메서드가 된다.
클래스에 사용되면 자신을 확장하는 자손 클래스를 정의하지 못하게 된다.
final이 사용될 수 있는 곳- 클래스, 메서드, 맴버변수, 지역변수
제어자 | 대상 | 의미 |
final | 클래스 | 변경될 수 없는 클래스, 확장될 수 없다. 즉, 조상이 될 수 없는 클래스 |
메서드 | 변경될 수 없는 메서드, 오버라이딩이 불가능해진다. | |
맴버변수 | 변수 앞에 final을 붙이면, 값을 변경할 수 없게 된다. | |
지역변수 |
final class FinalClass{ //조상이 될 수 없는 클래스
final int f_num=500; //값을 변경할 수 없는 맴버변수
final void setNum() { // 오버라이딩 불가능한 메서드
final int lv=f_num; // 값을 변경할 수 없는 지역변수
return;
}
}
다시 정리하면 final을 사용한 대상들은 내용과 값이 변경될 수 없다.
abstract
abstract의 정의는 '미완성'이다.
abstract는 나중에 더 자세히 알아보겠다.
제어자 | 대상 | 의미 |
abstract | 클래스 | 클래스 내에 추상 메서드가 선언되어 있음을 의미 |
메서드 | 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드 |
abstract class AbstractC{ //추상클래스
abstract void loop(); //추상메서드
}
abstract 클래스 추상 클래스는 인스턴스 생성이 불가능하다. (객체 생성 불가)
즉 미완성 클래스라고 볼 수 있다.
그러면 추상 클래스는 언제 사용할 수 있는가?
추상 클래스를 상속받아서 완전한 클래스(구상 클래스)를 만든 후 객체를 생성할 수 있다.