일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- spring
- unity 레이아웃
- 요청
- static을 왜사용할까?
- WriteLine
- 데이터베이스
- Database
- c#상속
- java
- JDBC
- @ Builder
- unity 오브젝트
- 메소드 지정자
- ForignKey
- MariaDB
- db
- 메소드 정의
- response
- Create
- http
- 타입이 서로 다른 두 데이터 제네릭
- C#
- 평면좌표상에서 두점 거리 구하기
- request
- unity 간단 설정
- static
- DROP
- final
- select
- 타입 변수 표기법
- Today
- Total
이론을 싫어!
[java] static과 final 본문
static
- 필드나 메소드의 소속을 클래스로 제한하는 키워드 이다.
- static을 사용한 정적 변수나 정적 메소드는 클래스 변수와 클래스 메소드
실습으로 배워보자
Circle.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public class Circle {
double radius; //반 지름 ( 비정적 필드 -> 할당되는 객체마다 저장공간이 할당된다.)
static double PI=3.14; // 파이 ( 정적 필드 - > 클래스에 소속되 저장공간이 하나만 조재하는 변수이다.)
public Circle(double radius){
this.radius=radius;
}
// 원 넓이
public double getArea(){
return radius* radius *PI;
}
// 둘레
public double getPerimeter(){
return 2 *PI*radius;
}
}
|
cs |
CircleTest.java
1
2
3
4
5
6
7
8
9
10
11
12
|
public class CircleTest {
public static void main(String[] args) {
Circle c1=new Circle(10);
System.out.println("원의 넓이: "+c1.getArea());
System.out.println("원의 둘레: "+c1.getPerimeter());
Circle c2=new Circle(100);
System.out.println("원의 넓이: "+c2.getArea());
System.out.println("원의 둘레: "+c2.getPerimeter());
}
}
|
cs |
여기서 PI 같은 경우는 값이다.
그렇기 때문에 PI의 값을 new 라는 생성자로 메모리를 생성할 때마다 PI의 값을 잡히게 되면
메모리 관리를 효율적으로 사용을 하지 못하게 된다.
물론 지금은 하나이기 때문에 딱히 느끼는 것이 없고 실행했을때 아무런 무리가 없지만
100~200 이상 되어버리면 8바이트 만큼 계속 메모리 공간에 쌓이게 된다.
컴퓨터의 자원은 무한정이지 않기 때문에 결국 메모리가 가득 차게 되어서 꺼지는 경우가 발생한다.
그렇기 때문에 이러한 경우에는 "클래스 자체에만 가지고 있자!" 라고 해서
static을 붙여주게 됨녀 클래스 내에 공간만 갖게 된다.
즉, 쉽게 말하면 new로 생성했을 때 PI라는 공간을 각각 개인에게 가지게 되는 것이 아니라
PI가 필요할 때마다 클래스 내에 있는 PI 를 빌려(공유)쓴다는 것이다.
그리고 static 같은 경우는 대문자로 쓴다.
상수
- 키워드는 final로 명시하며 저장된 값을 더 이상 수정 할수 없도록 한다.
- 보통 static도 함께 사용하여 정적으로 하는 것을 선호한다.
Calendar.java
1
2
3
|
public class Calendar {
static final int LAST_MONTH=12;
}
|
cs |
CalendarTest.java
1
2
3
4
5
|
public class CalendarTest {
public static void main(String[] args) {
System.out.println(Calendar.LAST_MONTH);
}
}
|
cs |
위의 코드를 보면 마지막 달월을 12월이다. 즉, 12월 이상은 없기 때문에 final로 12를 상수로 만들어서 바뀌지 않도록 한다는 것이다.
여기서 객체를 만들지 않고 사용할 수 있는 이유는 static 를 붙였기 때문에 클래스에서 바로 사용이 가능하다.
만약에 static이 없다고 하면 객체를 만들어줘서 사용을 해야한다.
물론 static이 필수로 붙는 건 아니다.
만약에 객체만 만들어질때 딱 한번만 값이 설정되고 그 이후에는 값이 바뀌지 않을때는 final을 쓴다.
Calendar.java
1
2
3
4
5
6
7
|
public class Calendar {
final int LAST_MONTH;
public Calendar(int month){
LAST_MONTH=month;
}
}
|
cs |
CalendarTest.java
1
2
3
4
5
6
7
|
public class CalendarTest {
public static void main(String[] args) {
Calendar c1=new Calendar(12);
System.out.println(c1.LAST_MONTH);
//c1.LAST_MONTH=11; 에러
}
}
|
cs |
즉, final은 한번 초기화(할당)는 가능하지만 한번 할당을 하게 되면 값을 바꾸지 못한다.
이럴 때는 final만 써야하고 공통적으로 써야할 때에는 static final를 쓴다.
'java' 카테고리의 다른 글
[java] 생성자 ? (0) | 2023.04.03 |
---|---|
[java] 메소드 구현 / 메소드란? (0) | 2023.04.03 |
[java] 예외처리 해봅시다 (0) | 2023.04.02 |
[java]자바 클래스 및 라이브러리 (import는 뭐야??) (0) | 2023.04.02 |
[java] String Buffer 와 String Builder 언제 쓸까?? (0) | 2023.04.02 |