Let's Talk

Feel free to reach out. I'll get back to you as soon as possible.

Study 4 min

JAVA 키워드 정리

static, final, abstract, interface 등 자바의 핵심 키워드가 각각 무엇을 의미하고 언제 쓰는지 예제 코드로 정리합니다.

JAVA 키워드 정리

자바 코드를 읽다 보면 자주 마주치지만 의미가 헷갈리는 키워드들이 있습니다. 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 - 추상적인

  1. 클래스에 사용
  • 객체를 생성 불가
    • 다형성을 통해 추상클래스를 자료형으로 가지는 객체를 생성할 수 있다
    • 반드시 상속을 받아서 사용해야 한다 => 추상클래스는 상속과 재정의 과정을 거친다
  1. 메서드에 사용
  • 추상 메서드
    • 메서드 구현부분이 없다

추상 클래스인 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 — 기능 명세서. 다중 구현으로 단일 상속의 한계를 보완