예약어(reserved word)
클래스에 사용할 수 있는 기타 예약어들에 대한 내용이다.
먼저 필드에 지정할 수 있는 예약어부터 확인한다.
다음 예약어들은 접근 제한자(private, public 등)와 함께 사용이 가능한 구문
static과 transent는 클래스 내부의 멤버에만 사용가능
다음은 메서드에 지정할 수 있는 예약어이다.
synchronized, native는 메서드에만 지정가능
abstract는 상속에서 사용(final도 상속을 이용할 때 사용)
synchronized는 Thread 구현 시 활용
static과 final만 다음 테스트를 통해 확인
static멤버 확인
package exam;
class Point {
private static int x;
private int y;
static { // static멤버 초기화 블록
x = 10;
// y = 20; //접근 불가
}
{ // instance멤버 초기화 블록
x = 30;
y = 40;
}
public void printPoint() {
System.out.println("[" + x + "," + y + "]");
}
}
public class Exam {
public static void main(String[] args) {
Point p = new Point();
p.printPoint();
}
}
실행결과
static은 메모리에 로딩 시 할당(사용가능 멤버)
static멤버는 static멤버에만 접근이 가능
instance멤버는 new를 통해 생성되므로 생성 시점이 무조건 static멤버 생성 이후
따라서 instance멤버는 static멤버를 사용할 수 있음
초기화 블록
static{ … }블록 : static멤버 필드를 초기화 하는 블록
{ … }블록 : 일반필드를 초기화 하는 블록(new를 통해 객체가 생성될 때 동작)
위 예제를 다음과 같이 수정하여 개념 확인
package exam;
class Point {
private static int x;
private int y;
public static void setPoint1(int x, int y) {
// this.x = x; // this없음
// this.y = y; // instance멤버는 접근불가
Point.x = x;
}
public void setPoint2(int x, int y) {
this.x = x; // this있음
Point.x = x; // 클래스이름으로 접근가능
this.y = y; // instance멤버는 접근가능
}
public void printPoint() {
System.out.println("[" + x + "," + y + "]");
}
}
public class Exam {
public static void main(String[] args) {
Point p = new Point();
p.setPoint1(10, 20);
p.printPoint();
p.setPoint2(30, 40);
p.printPoint();
}
}
setPoint2()메서드 같은 경우 static멤버와 instance멤버를 모두 사용하는데
이는 권장하지 않는 방법이다.(static멤버는 static멤버만 사용하도록 권장한다.)
그리고 setPoint2()메서드에서 this.x부분은 Point.x와 같은 필드를 의미한다.
static멤버는 객체가 여러 개라도 클래스를 로드하는 시점에 하나만 만들어지기 때문
실행결과
final예약어 예제 코드(필드)
package exam;
class Point {
private final int x = 10; // 변수를 상수화(값 고정)
private int y = 20;
public void setPoint(int x, int y) {
// this.x = x; //변경 불가
this.y = y;
}
public void printPoint() {
final int b = 20; // 지역 변수를 상수화
// b = 100; //변경 불가
System.out.println("[" + x + "," + y + "]");
}
}
public class Exam {
public static void main(String[] args) {
Point p = new Point();
p.setPoint(10, 20);
p.printPoint();
}
}
필드에 final을 적용하면 초기화한 값을 변경하지 못한다.
지역변수에도 적용 가능
실행결과
final예약어 테스트(메서드)
메서드에 final을 지정하면 상속한 클래스에서 오버라이딩 불가
상속을 이해하고 봐야 함
package exam;
class Point {
private int x = 10;
private int y = 20;
final public void printPoint() {
System.out.println("[" + x + "," + y + "]");
}
}
class Point2 extends Point { // 상속
private int z = 30;
final public void printPoint() { // 오버라이딩 불가
super.printPoint();
System.out.println("z:" + z);
}
}
위 예제에서 Point클래스에 final을 선언하면 상속 자체가 불가함
package exam;
final class Point {
private int x = 10;
private int y = 20;
final public void printPoint() {
System.out.println("[" + x + "," + y + "]");
}
}
class Point2 extends Point { // 상속
private int z = 30;
final public void printPoint() { // 오버라이딩 불가
super.printPoint();
System.out.println("z:" + z);
}
}
static과 final을 함께 사용하면 위에서 확인한 개념이 중복으로 적용된다.
static final
static의 특성과 final의 특성 모두를 가진다.
멤버 필드에 지정 시
상수면서 클래스명으로 접근가능
지역변수에는 static사용 불가능
멤버 메서드에 지정 시
최종, 마지막 메서드라는 의미
상속 시 오버라이드 되지 못하는 메서드(final)
클래스에 지정 시
static은 내부클래스에만 사용가능
클래스 명으로 접근 가능
상속 되지 못하는 클래스(확장 불가)
'교육자료 > Java' 카테고리의 다른 글
Java 클래스 구성 요소 (상속) (0) | 2017.06.23 |
---|---|
Java 클래스 구성 요소 (중첩클래스) (0) | 2017.06.22 |
Java 클래스 구성 요소(Setter, Getter메서드) (0) | 2017.06.18 |
Java 클래스 구성 요소(접근 제어자) (0) | 2017.06.18 |
Java 객체 관리 Garbage Collection (0) | 2017.06.16 |