본문 바로가기
👨‍💻 2. 웹개발_Back end/2-1 Java

[JAVA] 02-1 변수

by 달님🌙 2021. 7. 20.
반응형
변수 초기화 에러

 

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

 

반응형

댓글