[Java] static 멤버와 final

static 멤버

객체를 생성하지 않고도 사용할 수 있는 멤버.

클래스당 하나만 생성되는 멤버로 동일한 클래스의 모든 객체들이 공유.

main() 메소드가 실행되기 전에 이미 생성. static 멤버가 포함된 객체를 생성하기 전에 사용 가능.

class Ex{
    static int num;
    static void add(){ ... }
}

static 멤버 생성

클래스가 로딩되는 시점에 static 멤버는 생성되어 사용 가능.

 

static 멤버 접근

  • non-static 멤버와 사용 방법이 동일. ( 객체.static필드 or 객체.static메소드 )
  • 클래스 이름으로 바로 접근 가능( static 멤버는 클래스 당 하나만 생성되기 때문) ( 클래스명.static 멤버 or 클래스명.static메소드 )

※ non-static 메소드는 클래스 이름으로 접근 불가

 

static 활용

 

1. 전역 변수와 전역 함수 만들 때

자바의 캡슐화 원칙으로 인해 어떤 변수나 함수도 클래스 바깥에 존재할 수 없다.

but, static 멤버를 가진 클래스를 작성하여 전역함수처럼 사용 가능.

class Math{
	public static int add(int a, int b){
    	return a + b;
    }
    
public class Result{
	public static void main(String[] args){
    	System.out.println(Math.add(10, 8));
    }
}

※ 클래스 이름으로 static 멤버 직접 호출

 

2. 공유 멤버 만들 때

 

static 메소드 제약 조건

 

1. static 메소드는 static 멤버만 접근 가능.

static 메소드는 객체 없이도 존재하기 때문에, 객체와 함께 생성되는 non-static 멤버를 사용할 수 없다.

※ 반면, non-static 메소드는 static 멤버를 사용할 수 있다.

 

2. static 메소드는 this 사용 불가.

객체 없이도 존재하기 때문에 this를 사용할 수 없다.

 

non-static 멤버

객체가 생길 때 객체마다 생성.

다른 객체들과 공유하지 않고 객체가 사라지면 non-static 멤버도 사라져 접근 불가.

class Ex{
    int num;
    void add(){ ... }
}

 

  non-static 멤버 static 멤버
공간적 특성 멤버는 객체마다 별도 존재
: 인스턴스 멤버(각 객체마다 하나씩 생성)
멤버는 클래스당 하나 생성
: 멤버는 객체 내부가 아닌 별도의 공간(클래스 코드가 적재되는 메모리)에 생성
: 클래스 멤버(클래스당 하나씩 생성)
시간적 특성 객체 생성 시 멤버 생성
: 객체가 생길 때 멤버도 생성
: 객체 생성 후 멤버 사용 가능
: 객체가 사라지면 멤버도 사라진다.
클래스 로딩 시 멤버 생성
: 객체가 생성되기 전 이미 생성
: 객체 생성되기 전부터 사용 가능
: 객체 사라져도 멤버 사라지지 않는다.
: 프로그램이 종료될 때 멤버 사라진다.
공유 특성 공유되지 않는다.
: 객체 내 각각의 공간 유지
동일한 클래스의 모든 객체들에 의해 공유

 

final

final 클래스

final이 클래스 앞에 사용되면 클래스를 상속받을 수 없다는 것을 의미.

 

final 메소드

  • final로 메소드를 선언하면 오버라이딩할 수 없는 메소드임을 선언.
  • 자식 클래스가 부모 클래스의 특정 메소드를 오버라이딩 하지 못하고 무조건 상속받아 사용하도록 할 때 사용.

 

final 필드

  • final로 필드 선언하면 필드는 상수가 된다.
  • 상수 필드는 한 번 초기화되면 값을 변경할 수 없다.
  • final 키워드를 public static과 함께 선언하면 프로그램 전체에서 사용할 수 있는 상수가 된다.

 

반응형

'Back-End > Java' 카테고리의 다른 글

[Java] 상속(2)  (2) 2022.03.02
[Java] 상속(1)  (1) 2022.02.21
[Java] 접근 지정자  (0) 2022.02.18
[Java] 객체  (1) 2022.02.18
[Java] 클래스와 생성자  (0) 2022.02.15