[Java] 자바의 static, final 키워드


♦ 자바의 static, final 키워드
자바 프로그램의 실행과정
소스코드 작성 ⇒ 클래스파일 생성 ⇒ 클래스파일 실행 ⇒ 클래스 로딩 ⇒ main 메소드 실행 ⇒ 인스턴스 생성 ⇒ 메소드 호출 ⇒ 결과 출력

클래스 로딩 – static 키워드를 사용한 변수와 메소드가 자동으로 메모리에 로딩
main 메소드 실행 – 여러 static 메소드들 중에서 시작점(starting point) 기능을 하는 main 메소드가 실행
인스턴스 생성 – 인스턴스 변수와 메소드를 메모리에 로딩
메소드 호출 – 메소드안에 선언된 로컬변수 생성

static 변수는 클래스와 관계가 있으며 인스턴스 변수는 인스턴스와 관계가 있고 로컬 변수는 메소드와 관계가 있다. 프로그램이 실행될 때 인스턴스 생성을 위한 정보를 제공해 주기 위해서 클래스가 먼저 메모리에 로딩된다. 대표적인 메소드가 main 메소드이다. 시작점 역할을 하는 main 메소드가 실행되고 이후 필요에 따라 인스턴스를 생성한다. 인스턴스는 new 키워드를 이용하여 객체 생성을 할 때마다 메모리에 로드되지만 클래스는 한 번만 로드된다.

static 키워드
static 키워드의 특징
클래스, 변수, 메소드의 지정자로 사용할 수 있다. 클래스는 Inner 클래스에서 사용되고, 변수는 공유 데이터를 사용할 목적으로 사용하고, 메소드는 객체생성없이 접근할 목적으로 사용한다.
클래스와 관련된 특징을 가지기 때문에 단 한번 생성된다. 프로그램이 실행할 때 자동생성되고 프로그램이 종료될 때 자동 삭제된다.
생성된 모든 인스턴스에서 공유할 수 있다.
객체생성과 무관하며 클래스명으로 접근할 수 있다.
static 메소드는 오버라이딩이 불가능하다.

static 변수활용 예

class Counter {

	private static int count = 0;
	int num;

	public Counter() {
		count++;
		num = count;
	}

	public int getNum() {
		return num;
	}
}

public class Test {
	public static void main(String[] args) {
		Counter c = new Counter();
		System.out.println("객체생성 횟수 : " + c.getNum());

		Counter c2 = new Counter();
		System.out.println("객체생성 횟수 : " + c2.getNum());
	}
}

 

static 메소드

class Counter {

	private static int count = 0;
	int num;

	public Counter() {
		count++;
		num = count;
	}

	public static int getCount() {  // static 메소드 
		return count; 		// static 메소드는 static 변수에 접근이 가능하다
	}
	
	public int getNum() {
		return num;
	}
}

public class Test {
	public static void main(String[] args) {
		
		int count = Counter.getCount(); // 객체생성 없이 static 메소드에 접근
		System.out.println("객체생성 횟수 : " + count);
		
		Counter c = new Counter();
		System.out.println("객체생성 횟수 : " + c.getNum());

		Counter c2 = new Counter();
		System.out.println("객체생성 횟수 : " + c2.getNum());
	}
}

 

static 블록

public class Test {
	// static 블록
	static {  
		System.out.println("static 블록"); // main 메소드 보다 먼저 실행
	}
	
	public static void main(String[] args) {
		
		System.out.println("main 메소드");		
	}
}

 

싱글톤 디자인 페턴 – 단하나의 인스턴스를 생성하는 방법

static 키워드를 이용한 싱글톤 디자인 패턴

class Student {
	String name;
	
	// 프로그램 실행시 객체 생성 
	private static Student b = new Student("정대만");

	// 외부에서 접근할 수 없도록 생성자를 privat 로 선언
	private Student(String name) { this.name = name; }

	public static Student getStudent() {
		return b;
	}

	public String getName() {
		return name;
	}
}

public class Test01 {
	public static void main(String[] args) {

		Student s = Student.getStudent();
		System.out.println("학생의 이름은 : " + s.getName());

	}
}

 

final 키워드
final 키워드의 특징
클래스에 사용하면 상속이 불가능하다.
변수에 사용하면 값 변경이 불가능하다. 따라서 상수가 되며 변수와 구별하기 위해서 일반적으로 대문자로 표현한다. 상수는 일반적으로 public static 지정자를 사용하여 외부에서 객체생성 없이 클래스로 접근 가능하도록 구현한다.
메소드에 사용하면 오버라이딩이 불가능하다.

final 키워드 활용예

final class A {
}

class B {
	public final void print() {
	}
}

class C {
	public static final int NUM = 10;
}

public class Test01 {
	public static void main(String[] args) {

		System.out.println(C.NUM);
	}
}

 

답글 남기기