자바 코드를 읽다 보면 자주 마주치지만 의미가 헷갈리는 키워드들이 있습니다. static, final, abstract, interface를 각각 무엇을 의미하고 언제 쓰는지 예제로 정리합니다.
Static - 고정된
객체 생성 없이 사용할 수 있는 필드와 메소드를 생성하고자 할 때 활용한다.
필드나 메소드를 객체마다 다르게 가져야 한다면 인스턴스로 생성하면 되고
공용 데이터에 해당하거나 인스턴스 필드를 포함하지 않는 메소드를 선언하고자 할 때 이용한다.
사용하기 위해선 클래스 내에서 필드나 메소드 선언 시 static 키워드를 붙여주기만 하면 된다.
public class Keyword{
static int field1 = 15;
static int keyMethod(int x, int y){ return x+y; }
}
int ans1 = Keyword.keyMethod(15,2);
int ans2 = Keyword.field1 + 2;
또한, 정적 메소드는 객체 참조 없이 바로 사용할 수 있는 특징 때문에 인스턴스 필드나 메소드, 그리고 this 키워드를 사용할 수 없다.
public class Keyword {
static int field1 = 15;
int field2;
void method1(){}
static void method2(){}
static int plusMethod(int x, int y){
this.field2 = 10; // <-- x
this.method1(); // <-- x
field2 = 20; // <-- x
field1 = 10; // <-- o
method1(); // <-- x
method2(); // <-- o
}
}
인스턴스 성질은 객체 생성 후 사용할 수 있으므로 객체 참조 없이 사용하는 정적 메소드에는 사용 불가능하다.
final - 최종적인
해당 변수는 값이 저장되면 최종적인 값이 되므로, 수정이 불가능하다.
final 필드에 값을 저장하는 방법은 다음 두 가지가 있다.
public class Shop{
final int closeTime = 21;
final int openTime;
public Shop(int openTime){
this.openTime = openTime;
}
}
하나는 closeTime과 같이 선언과 동시에 값을 주는 방법
openTime과 같이 생성 후, 객체를 생성할 때 생성자 public Shop에 의해 값을 주는 방법
모든 가게가 오픈 시간은 자유롭지만 한 번 정한 오픈 시간을 바꿀 수 없고, 21시에는 모두 닫아야 할 때
위와 같이 final 키워드를 이용하면, 오픈 시간은 객체마다 다르게 설정이 가능하지만, 닫는 시간은 고정되도록 코딩이 가능하다.
static final - 상수
모든 영역에서 고정된 값으로 사용하는 상수
static final double PI = 3.141592;
abstract - 추상적인
- 클래스에 사용
- 객체를 생성 불가
- 다형성을 통해 추상클래스를 자료형으로 가지는 객체를 생성할 수 있다
- 반드시 상속을 받아서 사용해야 한다 => 추상클래스는 상속과 재정의 과정을 거친다
- 메서드에 사용
- 추상 메서드
- 메서드 구현부분이 없다
추상 클래스인 Shape클래스를 상속받는 Circle 클래스
Shape클래스의 getArea()메서드는 추상메서드이기 때문에 구현X
-> Circle클래스에서 상속받아서 재정의 함
public abstract class Shape {
private int x;
private int y;
public Shape() {}
public Shape(int x,int y) {
this.x = x;
this.y = y;
}
public abstract double getArea(); //구현이 되어있지 않음
public String position() {
return "{x="+x+", y="+y+"}";
}
}
public class Circle extends Shape {
private int radius;
public Circle(int r) {
this(0,0,r);
}
public Circle(int x,int y, int r) {
super(x,y);
radius=r;
}
public double getArea() {
return(Math.PI * radius * radius);
}
}
public class AbstractExample {
public static void main(String[] args) {
Shape circle = new Circle(10);
System.out.println("원의 넓이는: "+circle.getArea());
System.out.println("도형의 위치는: "+circle.position());
}
}
interface
-
기능의 명세서 -> 구현된 메서드가 없음
-
단일 상속의 한계를 극복 -> 다중 상속 가능
-
인터페이스 내의 메서드는 모두 추상메서드, public abstract -> 생략 가능 변수는 항상 public static final -> 생략 가능
-
인터페이스는 implements 라는 키워드로 구현
public interface Inter1 {
void inter1();
}
public interface Inter2 {
void inter2();
}
public class InterImpl implements Inter1,Inter2 {
@Override
public void inter1() {}
@Override
public void inter2() {}
}
한 줄 요약
- static — 객체 생성 없이 클래스 단위로 공유. 인스턴스 멤버·
this사용 불가 - final — 한 번 정해지면 변경 불가(변수·메서드·클래스)
- static final — 모든 영역에서 고정된 상수
- abstract — 미완성(구현 없는) 클래스/메서드. 상속·재정의 전제
- interface — 기능 명세서. 다중 구현으로 단일 상속의 한계를 보완