되자!백엔드개발자
JAVA(자바) - static / final 본문
static은 메모리와 연관이 깊기 때문에 먼저 읽고 오는걸 추천한다.
https://hyun-jng.tistory.com/72?category=1020266
JAVA(자바) - 메모리 정리
static공부하다가 책에 설명이 부실한 것 같아 검색하다보니 메모리와 크게 연관이 있어보여 메모리 먼저 글을 써본다. 도움이 된 블로그는 아래와 같다 https://tape22.tistory.com/28 https://m.blog.naver.com/
hyun-jng.tistory.com
static멤버 생성 방법
class Book {
static int makeYear; // static변수
String title, author;
...
}
static멤버(클래스 멤버) vs non-static멤버(인스턴스 멤버)
static멤버는 객체를 생성하지 않고도 사용할 수 있는 멤버이다.
클래스 당 하나만 생성되는 멤버로, 동일한 클래스의 모든 객체들이 공유한다. 예를들면 Circle클래스의 객체 c1, c2를 생성했어도 static변수는 이 둘의 객체가 공유하는 것이다. 그렇기에 클래스 이름으로 바로 접근할 수 있다.
Book.year = 2022; // 클래스이름으로 접근
클래스 로딩 시에 멤버가 생성되므로 객체가 생성되기 전에 이미 생성되고, 객체가 사라져도 static멤버는 사라지지 않고 프로그램이 종료될 때까지 존재한다.
반면 non-static멤버는 객체마다 별도로 존재한다. 그렇기에 객체가 생성될 때 non -static멤버 또한 생성되고 객체가 사라질 때 같이 사라진다.
<static의 활용>
캡슐화 법칙에 의해 C++과 달리 어떤 변수나 함수도 클래스 바깥에 존재할 수 없다. 그러므로 전역 변수나 전역 함수를 만들 때 static을 이용한다.
그 예로 java.lang.Math클래스가 있다. 이 클래스는 객체를 생성하지 않고도 바로 호출하는 static타입의 멤버를 제공한다.
public class Math {
public static int abs(int a);
public static double cos(double a);
}
그러므로 우리가 클래스 이름 Math로 메소드를 직접 호출할 수 있는 것이다.
int n = Math.abs(5);
static메소드(클래스메서드) vs non-static메소드(인스턴스 메서드)
변수에서와 마찬가지로 메서드 앞에 static이 붙어 있으면 클래스 메서드이고 아니면 인스턴스 메서드이다.
- 인스턴스 메서드: 메서드 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드이다.
- 클래스 메서드: 인스턴스와 관계없는(인스턴스 변수나 인스턴스 메서드를 사용하지 않는)메서드이다.
인스턴스 변수를 필요로 하지 않는다면 static을 붙여주자. 메서드 호출 시간이 짧아지므로 성능이 향상된다.
static 메소드의 제약 조건
- static메소드는 static멤버만 접근할 수 있다.
객체 없이도 존재하기 때문에 객체와 함께 생성되는 non-static멤버는 사용할 수 없다. - static 메소드는 this를 사용할 수 없다.
this레퍼런스는 지금 실행하는 객체를 가리키는 레퍼런스 이므로 객체 없이 존재하는 static 메소드는 사용할 수 없다.
final 키워드
public static final double PI = 3.14; // public static과 같이 사용하면
// 프로그램 전체에서 사용할 수 있는 상수가 된다.
더이상 변경이 불가능하다는 것을 선언하는 키워드이다.
fina 클래스는 상속을 받을 수 없고, final 메소드는 오버라이딩을 하지 못하며, final필드는 한번 초기화 되면 값을 변경할 수 없는 상수가 된다.
static final 같이 사용하는 경우: 상수(constant)
public static final PI = 3.1415;
상수는 한개만 필요한데, 만약 final만 사용한는 경우 인스턴스마다 상수가 반복 생성되고 항상 인스턴스 생성 후에 상수를 사용해야만 하는 문제가 발생한다.
따라서 상수는 메모리에 오직 1개만 생성이 되면 되기 때문에 static final로 쓰는 것을 권장한다.
'개발공부 > JAVA' 카테고리의 다른 글
JAVA(자바) - 상속 / 상속에서의 생산자와 super() (0) | 2022.07.26 |
---|---|
JAVA(자바) - 환경변수를 설정하는 이유 (0) | 2022.07.25 |
JAVA(자바) - JVM 실행 순서와 메모리 구조 (0) | 2022.07.24 |
Java(자바) - 접근지정자 (0) | 2022.07.24 |
JAVA(자바) - Class와 객체/생성자/this.와 this()/객체배열 (0) | 2022.07.24 |