티스토리 뷰
Variable
오늘은 자바의 변수에 대해 포스팅하려 합니다.
변수의 종류, 스코프, 라이프 타임에 대해 알아보겠습니다.
변수의 종류
자바의 변수 종류부터 알아보겠습니다.
1. 인스턴스 변수(not static field)
- static 키워드 없이 클래스 안에 선언된 필드(변수).
- 클래스의 인스턴스마다 변수의 값이 다름.
- stack에 저장된다.(객체는 heap에 저장, 참조 변수는 stack)
2. 클래스 변수(static field)
- static 키워드가 붙은 필드.
- 모든 클래스에서 공용으로 사용가능하다.
- JVM의 메모리 영역에 저장된다.
3. 로컬 변수
- 메서드에서 임시로 상태를 저장하는 변수.
{}안에서만 사용가능하다.- stack에 저장된다.
4. 파라미터 변수
- 메서드의 인자로 사용되는 변수.
- stack에 저장된다.
int a; // 인스턴스 변수
static int b; // 클래스 변수
public void method(){
int c = 0; // 로컬 변수
...
}
public void method(int a){...} //파라미터
참조형 변수
- new 생성자를 사용해 인스턴스를 만들면 heap 메모리에 그 객체를 위한 공간이 할당됩니다.
- 참조 변수는 그 공간에 접근하기 위한 변수이고 stack에 저장됩니다.
Foo foo = new Foo(); // 여기서 foo가 참조 변수가 된다.
- new 키워드를 통해 객체를 생성하면,
1)기본 생성자가 호출되고
2)객체의 참조 값을 리턴하고
3)이 값을 참조 변수(foo)가 가리키게 됩니다. - 참조 변수의 값을 출력하면 변수의 타입과 해시코드(16진법)를 출력합니다.
Foo foo = new Foo();
Foo(타입)@214c265e(해시코드)
- 클래스, 인터페이스, 배열, 열거형, 애노테이션 등이 자바에서 참조 타입으로 사용됩니다.
- 참조 변수는 null값을 저장할 수 있습니다. 기본적으로 참조 변수가 어떤 객체를 가리키고 있지 않다면 null값을 저장합니다.
👉 기본형 타입은 그 값이 변수에 직접 저장되는 반면, 참조 타입은 변수에 객체의 참조 값을 저장합니다.
- 참조 값은 heap에 저장이 되고 그것을 가리키는 참조 변수는 stack에 저장됩니다.
변수의 스코프와 라이프 타임
- 변수가 적용되는 범위와 소멸 시점을 알아보겠습니다.
1. 멤버 변수(인스턴스 변수) : 클래스 레벨 스코프
- 클래스 안, 메서드의 밖에서 선언.
- 클래래스 내에서 어디서 든지 사용할 수 있다.
- 접근 제어자에 따라 클래스 밖에서도 사용할 수 있다.
👉 라이프 타임 : 인스턴스가 생성됐을 때 생성되어 객체가 메모리에 남아있을 때까지 존재한다.
public class Test{
int a; // 멤버 변수
String b;// 멤버 변수
void method1(){};
char method2(){};
char c;// 멤버 변수
}
2. 지역 변수
- 메서드 내에서 선언되고 메서드 안에서만 사용할 수 있다.
👉 라이프 타임 : 메서드 수행이 끝나고 나면 스택에서 제거된다.
public class Test{
int a;
String b;
void method1(){int x = 0;};
char mwthod2(){int y = 1;};
// x,y는 지역 변수 이다.
3. 그 외
{}안에서 선언된 변수는 {}안에서만 사용할 수 있다.
👉 라이프 타임 : {}이 끝나면 사라진다.변수 선언 시 루프 밖의 변수와 루프 안의 변수의 이름이 달라야 한다.
- 만약 루프 내의 변수가 끝나고 나면, 변수가 없어지기 때문에 루프 밖에서 같은 이름을 사용할 수 있다.👉 라이프 타임 : 루프가 끝나면 사라진다.
class Test
{
public static void main(String args[])
{
{
int x = 5; // 블럭 밖에서 선언 후
{
int x = 10; // 같은 이름으로 다시 선언 할 수없다.
System.out.println(x);
}
}
}
}
public static void main(String args[])
{
int a = 5;
for (int a = 0; a < 5; a++) // 오류가 남.
{
System.out.println(a);
}
}
class Test {
public static void main(String args[])
{
for (int i = 1; i <= 10; i++) {
System.out.println(i);
}
int i = 20; // 루프가 끝났기 때문에 같은 변수 이름을 사용가능함.
System.out.println(i);
}
}
Reference
'Java' 카테고리의 다른 글
| Java final 키워드 (0) | 2024.07.18 |
|---|---|
| Java에서 StringBuffer vs StringBuilder 차이에 대해 (0) | 2024.07.07 |
| Java에서 StringBuilder과 String `+`연산 실행 속도 차이 (0) | 2024.06.28 |
| Java String 객체 특징 (0) | 2024.06.24 |
| Java는 call by value이다. (0) | 2024.06.17 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- virtual thread
- 싱글모듈
- kafka
- 벌크헤드
- 정기결제
- 세션
- leetcode
- java
- 항해99
- Http 버전
- redisson
- 외부API
- spring.
- AttributeConverter
- 알고리즘
- 백준
- jpa
- StringBuilder
- TransactionalOutbox
- 커넥션풀문제
- 디자인패턴
- 무상태성
- 분산락
- http메서드
- 네트워크
- rrf
- socket통신
- LLM
- 프로그래머스
- SpringBatch
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
글 보관함