본문 바로가기

Java

자바 : static, final

728x90

📗 static 멤버와 non-static 멤버

✅ static

static 은 전역 변수나 전역 함수를 만들 때,

그리고 클래스의 여러 객체들이 공유하도록 공유 멤버를 작성할 때 활용한다.

✅ non - static 멤버

class Sample{

    int n;
    void start();

}

✅ static 멤버

class Sample{

    static int n;
    static void start();

}

 

  non-static 멤버 static 멤버
공간적 특성 멤버는 객체마다 별도로 존재
-> 인스턴스 멤버라고도 부름
멤버는 클래스당 하나 생성
멤버는 객체 내부가 아닌 별도의 공간(클래스 코드가 적재되는 공간)에 생성
-> 클래스 멤버라고 부름
시간적 특성 객체 생성 시에 멤버가 생성됨
객체가 생성한 후 멤버를 사용할 수 있음
객체가 사라지면 멤버도 사라짐
클래스 로딩시에 멤버 생성
객체가 생기기 전에 이미 생성되어 있음
객체가 생기기 전에도 사용 가능
객체가 사라져도 멤버는 사라지지 않음
멤버는 프로그램이 종료될 때 사라짐
공유의 특성 공유되지 않음 동일한 클래스의 모든 객체들에 의해 공유됨

 

 

✅ 접근 사례1

class Sample{
    public int n = 1;
    public static int m = 1;
    
    public void add1(){
        n += 2;
    }
    public void add2(){
        m += 2;
    }
}

Sample s1 = new Sample();
Sample s2 = new Sample();

s1.add1();
s1.add2();

System.out.println(s1.n); // n = 3;
System.out.println(s1.m); // m = 3;

s2.add1();
s2.add2();

System.out.println(s2.n); // n = 3;
System.out.println(s2.m); // m = 5;

 

 

Sample 클래스 객체를 생성할 때, 새롭게 생성되는 것은 non - static 변수, 혹은 메소드 뿐이고

static 변수, 메소드는 그대로 존재한다. 

 

따라서 위 코드에서 변수 m은 static 변수이므로

s1객체에서 add2 메소드를 호출하고 s2객체에서도 add2 메소드를 호출했을 때,

변수 m이 공유되어 2를 두번 더하게 된다.

m : 1 -> (s1.add2) -> 3 -> (s2.add2) -> 5

 

하지만 non - static 변수인 n같은 경우 객체가 생성될 때 마다 새롭게 생기므로

m과 다른 결과를 보여준다.

 

n : 1 -> (s1.add2) -> 3

     1 -> (s2.add2) -> 3

 

 

✅ 접근 사례2

class Sample{
    public static int m;
    ...
}

Sample.m = 10;

Sample s1 = new Sample();
System.out.println(s1.m); // m = 10

 

Static 변수 혹은 메소드 같은 경우 new 로 객체 생성을 해주지 않아도

클래스 이름으로 접근 시에 메모리에 동적할당 되어 접근이 가능하다.

 

출력, 입력을 위해 사용하는 System.out 과 System.in 나 최대 최소를 찾는 Math.min, Math.max 메소드 같은 경우도

System과 Math 라는 클래스에서 out과 in, min과 max가 static 메소드 이기 때문에 호출할 수 있는 것이다.

 

 

✅ static 메소드의 제약 조건

1. static 메소드는 non - static 멤버에 접근할 수 없다.

 

static 메소드는 호출시에 객체가 생성되지 않아도 메모리에 동적할당 되어 사용할 수 있지만,

non - static 변수나 메소드는 객체 선언시에 생성되기 때문에 접근할 수 없는 것이다.

 

하지만 반대로 non - static 메소드는 static 멤버를 사용할 수 있다.

 

2. static 메소드는 this를 사용할 수 없다.

 

객체가 생성 됐을 때 this가 해당 객체의 주소를 가리킬 수 있지만

static 메소드는 객체 생성 이전에도 사용할 수 있기 때문에  현재 객체를 가리키는 this를

사용할 수 없는 것이다.

 

 

📗 final

✅ final 필드, 상수 선언

상수를 선언할 때 사용한다.

상수 필드는 선언 시, 초기 값을 지정해야 한다.

상수 필드는 실행 중 값을 변경할 수 없다.

상수를 쓸 때는 대문자로 작성한다.

 

✅ final 클래스

final로 선언된 클래스는 상속이 불가능하다.

final class Sample{
    ....
}

class AnotherClass extends Sample{ // 컴파일 오류, 상속 불가
    ....
}

 

✅ final 메소드

final로 선언된 메소드는 오버라이딩이 불가능하다.

public class SuperClass{
    protected final int finalMethod(){};
}

class SubClass extends SuperClass{
    protected int final finalMethod(){}; // 컴파일 오류, 오바라이딩 불가능
}

 

728x90
반응형

'Java' 카테고리의 다른 글

자바 : 상속  (0) 2024.02.13
자바 : 객체 배열과 메소드  (0) 2024.02.09
자바 : 생성자  (0) 2024.02.07
자바 : 클래스와 객체  (0) 2024.02.06
자바 : 배열과 예외 처리  (0) 2024.02.05