변수 초기화 에러
int value;
int result = value + 10;
System.out.println(result);
//오류 내용 : The local variable value may not have been initialized
- value 변수가 선언은 되었지만 초기화되지 않았기 때문에 2라인에서 value 변수는 존재하지 않음
- 컴파일 에러 발생
변수 선언 방법
int a = 0;
int b = 0;
int c = 0;
//int a= 0, b = 0, c = 0; 이렇게 한줄에 선언 가능
변수 사용 예시
int hour = 3;
int minute =5;
System.out.println(hour + "시간 " + minute +"분"); // 3시간 5분
System.out.println(3+3); // 6
System.out.println("3"+3); // 6이 아니라, "3"+"3" = "33"이다
int totalMinute = (hour*60) + minute; // (3 * 60) + 5
System.out.println("총 " + totalMinute + "분"); // 총 185분
변수와 상수
int a = 5; // 변수
int b = 0; // 변수
final double pi = 3.141592; // 상수
a = 10; //변수는 변경가능
pi = 0.01; // 오류발생, 상수는 선언 후 변경 불가
** 상수를 사용하는 경우
- 한번 선언한 후 값을 변경하지 않을때 유용 예)수식계산
- 자주 사용하는 상수는 맨 위에 선언
- 값을변경해야하는 경우, 맨 위에 선언된 코드만 변경해주면 끝 (일일히 바꿔줄 필요없어서 시간낭비X)
//옳지못한 예
int r = 0;
double area = r*r*3.141592; //일일이 변경해야하는 단점
double volume = (4/3)*r*r*r*3.141592;
//옳은예
int r = 0;
int pi = 3.141592; // 여기만 바꿔주면 끝!
double area = r*r*pi;
double volume = (4/3)*r*r*r*pi
변수값 교환 (스와핑)
//스와핑 안되는 코드
int x = 3;
int y = 5;
x = y; // x : 5
y = x; // y : 5
System.out.println("x:" + x + ", y:" + y); // x : 5, y : 5
//둘다 5가 되어버려서 3이 사라짐.
//제3의 변수인 temp가 필요한 이유
//스와핑 가능한 코드
int x = 3;
int y = 5;
int temp = x; // x : 3, temp : 3
x = y; // x : 5
y = temp; // y : 3
System.out.println("x:" + x + ", y:" + y); // x : 5, y : 3
변수 사용 범위
메모리 종류
1. Stack 메모리
- stack 선언하는 순간 메모리가 살아있으니까 내가 선언한 변수가 끝까지 살아있음
2. Heap 메모리
- 참조변수가 걸려있는 이상 가비지컬렉터에 놓아둠
- 메모리 해제 방식이 다름
메모리 관점에서 코드 분석
1. 코드가 돌아가는 과정 (원리)
- If scope에 들어간다.
- var1, var2... 등 변수들이 선언되면서 stack 메모리에 차곡차곡 쌓는다.
- If문이 돌면서 변수가 사용된다.
- If 문을 빠져나오면서 쌓여있던 모든 변수들이 제거된다.
- for 문이나 다른 scope도 마찬가지
2. 특징
- 예를 들면 var1이라는 변수는 해당 비트가 있고 그 변수만의 주소를 할당해주어야함
- static : 지역변수
- stack overflow : 프로그램이 호출 스택에서 이용 가능한 공간 이상을 사용하려고 시도할 때 충돌이 일어남
- 쌓인 데이터들은 위에서부터 하나씩 제거됨
- 블록 관점 보다는 메모리 관점에서 변수를 선언
3. 만약에 scope을 나오면서 변수들을 버리지 않는다면?
- window는 여러 프로그램을 동시에 돌고 있고 메모리도 os에서 다같이 쓰고 있다.
- stack 메모리에 int, double 등 저장된 것들을 다 끌고간다치면 사실 무지막지하게 많은 양임
- 그래서 스콥이 끝나면 깡통이 다 비워지게된다
- 아니 그 깡통마저 사라진다
scope 예제
package ch02_1_variable;
//p.55 변수의 사용범위
public class VariableScopeExample {
public static void main(String[] args) {
int v1 = 15;
if(v1 > 10) {
int v2;
v2 = v1 - 10;
System.out.println(v2);
}
int v3 = v1 + v2 + 5; //에러 발생
}
}
<코드 설명>
- main 메소드 안에서 stack 이 하나 생성됨
- v1이 생김
- If 문 안에서 v2 생성
- If 문 빠져나갈때 v2 제거
- 현재 메모리에 v2가 없는데 호출했으므로 에러 발생
<해결법>
1) main 문 안에서 v2 선언을 해준다 (코드가 끝날 때까지 변수가 사라지지 않음)
2) int v2; 앞에 static 붙이기
변수 이름 조건
1. 예약어 사용 불가
class, int 등이미 있는 이름 쓸 수 없음
예) int(타입) int(변수명) (X) -> 이클립스의 스마트센서기능에 의해 오류 발생
2. 숫자로 시작할 수 없음
예) int 6hour; (X)
3. 될 수 있으면 소문자로 시작
이유 : 클래스 이름이 대문자로 시작이기 때문에 혼동을 피하기 위해
21.07.20
'👨💻 2. 웹개발_Back end > 2-1 Java' 카테고리의 다른 글
[JAVA] 02-3 타입변환 (0) | 2021.07.21 |
---|---|
[JAVA] 02-2 기본 타입 (0) | 2021.07.21 |
[JAVA] 01-3 자바 프로그램 개발 과정 (0) | 2021.07.20 |
[JAVA] 01-2 이클립스 개발 환경 구축 (0) | 2021.07.20 |
[JAVA] 01-1 프로그래밍 언어와 자바 (명령어 및 단축키 정리) (0) | 2021.07.20 |
댓글