코드일기장

[Java] static, final, abstract의 정의 본문

Java/OOP

[Java] static, final, abstract의 정의

won_hyeok2 2022. 2. 18. 15:22

 

 

제어자

 

제어자(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 클래스 추상 클래스는 인스턴스 생성이 불가능하다. (객체 생성 불가) 

즉 미완성 클래스라고 볼 수 있다.

 

그러면 추상 클래스는 언제 사용할 수 있는가?

추상 클래스를 상속받아서 완전한 클래스(구상 클래스)를 만든 후 객체를 생성할 수 있다.

 

 

 

Comments