📗 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(){}; // 컴파일 오류, 오바라이딩 불가능
}
'Java' 카테고리의 다른 글
자바 : 상속 (0) | 2024.02.13 |
---|---|
자바 : 객체 배열과 메소드 (0) | 2024.02.09 |
자바 : 생성자 (0) | 2024.02.07 |
자바 : 클래스와 객체 (0) | 2024.02.06 |
자바 : 배열과 예외 처리 (0) | 2024.02.05 |