본문 바로가기
Programming/JAVA(eclipse)

java 2일차 정리 _ 02. 변수(2)

by yoon9i 2024. 3. 8.

4. 기본형 변수 vs 참조형 변수

1) 기본형 변수
- 기본형 데이터를 저장하는 변수 

ex)
int num; // 실제값이 저장
num = 20;

==> num 변수안에 20이 저장됨 

2) 참조형 변수
- 참조형 데이터를 저장하는 변수

ex)
String name; // 주소값이 저장
name = "홍길동";

==> name 변수안에는 "홍길동" 이 저장된 주소값이 저장됨.

 

기본형 변수와 참조형 변수

 

5. 변수 종류 ( * )
- 변수 선언 위치와 용도에 따른 분류

가. 로컬 변수 ( local variavle )
- 메서드 안에서 선언
- 생성시점: 메서드 호출시 변수생성됨
- 제거시점: 메서드 호출후 작업이 모두 끝났을때
- 생성횟수: 메서드 호출할때마다 매번 생성되고,
메서드 작업이 끝나면 매번 삭제됨.
( 일시적으로 사용할 목적으로 주로 사용됨. )
- 저장메모리: stack 메모리
- 선언만하고 초기화하지 않으면 자동초기화 안됨.
반드시 사용전에 초기화해야 된다( * ).

나. 인스턴스 변수 ( instance variavle )
- 메서드 밖에서 선언
- 생성시점: 클래스 객체 생성( new 키워드 이용 )시 변수생성됨
- 제거시점: 클래스 객체가 제거될 때 변수가 삭제됨.
==> 개발자가 클래스를 사용하기 위해서 new 이용한다.
( new = 클래스 영역 확보 )
사용된 클래스 영역을 제거는 개발자가 하지않고 자바가 자동으로 제거해준다. 제거해주는 프로세스는 GC ( Garbage Collector )가 해준다.
==> C 언어는 영역확보 및 제거를 개발자가 모두 직접 해야된다.
- 생성횟수: new 키워드를 사용할때 마다 생성.
- 저장메모리: heap 메모리
- 선언만하고 초기화하지 않으면 자동으로 기본값으로 초기화된다.
기본형(정수): 0
기본형(실수): 0.0
기본형(문자): \u0000
기본형(논리): false
참조형: null

* Garbage Collector
- 프로그램에서 더 이상 사용하지 않는 메모리 공간을 자동으로 모아서 처리하는 프로세스.
- 시스템이 한가하거나 메모리가 부족한 위급 상황에서 GC 가 동작
- System.gc(); 사용하여 수행권유 가능.

다. 클래스 변수 ( class variable, static variable )
- 메서드 밖에서 선언 + static 키워드 추가
- 생성시점: 프로그램 실행시 변수생성됨.
- 제거시점: 프로그램 종료시 변수가 삭제됨.
- 생성횟수: 1번
- 저장메모리: method area 메모리
- 선언만하고 초기화하지 않으면 자동으로 기본값으로 초기화된다.
기본형(정수): 0
기본형(실수): 0.0
기본형(문자): \u0000
기본형(논리): false
참조형: null

 

package exam02_변수;

public class VariableTest3_변수종류 {// class 영역
	// 메서드 밖
	int size = 20; // -> 인스턴스 변수
	int n; // 선언만하고 초기화하지 않으면 자동으로 기본값으로 초기화된다. -> 0으로 초기화
	
	static int age = 10; // -> 클래스(static) 변수
	static int age2; // -> 기본값인 0으로 초기화
	static double age3; // -> 기본값인 0.0 으로 초기화
	static String name; // -> null 로 초기화
	
	public static void main(String[] args) { // main 메서드영역
		// 메서드 안
		int num = 10; // -> 로컬 변수
		
		int num2; // -> 초기화가 되자않은 로컬 변수
		System.out.println(num);
//		System.out.println(num2); // 로컬변수인데 초기화가 되자않아 오류가 발생
		
		//-> 에러 해결
//		int num2 = 0;
//		System.out.println(num2);
		
		//---------------------------
		
		// 인스턴드 변수: new 이용했을 때 생성됨.
		// 클래스명 변수명 = new 클래스();
		VariableTest3_변수종류 s = new VariableTest3_변수종류();
		System.out.println(s.size);
		
		// 클래스 변수, static 변수: 프로그램 실행시 생성됨.
		System.out.println(age); 
		// -> 로컬변수에 age 가 선언되어잇다면 로컬 변수에 있는 age 를 가져오고 
		//    아니라면 인스턴스 변수를 가져온다.
		System.out.println(VariableTest3_변수종류.age); // -> 더 정확한 접근방법
	}

}

 

변수의 종류와 관련된 코드들이고 변수의 특징은 아래와 같다.

 

6. 변수 특징
1) 변수명이 동일하면 안됨.
2) 로컬변수는 사용전에 반드시 초기화
초기화 안하면 컴파일 에러 발생됨.
3) 변수를 인식하는 범위 ( scope )
==> 블럭( 중괄호 '{ }' )

 

package exam02_변수;

public class VariableTest4_변수특징 {// class 영역 , class 블럭
	
	int num = 200; // 인스턴스변수 -> heap 저장
	// 저장되는 메모리가 달라서 식별가능
	
	public static void main(String[] args) { // main 메서드영역, 메서드블럭
		
		// 변수 특징
		
		// 1. 동일이름 사용 불가
		// 로컬변수 -> stack 저장
		int num = 10;
//		String num = "100";
		
		System.out.println(num); // 어떤 num 을 쓸지 식별이 불가능해서 에러발생
		
		// 2. 로컬변수는 사용전에 반드시 초기화
		
		// 3. 변수는 인식 범위 ( 블럭 scope 라고 부른다. )
		// 참고) 나중에 javascript 는 기본적으로 블럭 scope 아니고 함수 scope 를 따른다.
		// - 블럭 scope
		{
			int k = 2;
			System.out.println(k);
		}
//		System.out.println(k); // 사용x
		// 블럭안에 선언된 변수는 블럭안에서만 사용해야한다.
		
		
		// ex)
//		if(true) {
//			int k = 2;
//			System.out.println(k);
//		}
//		System.out.println(k);
		
		
		
		
	}

}

 

stack & heap & method area 영역