변수의 종류
1. 로컬변수(=지역변수)
- 메서드 내부에서 선언됨. 메서드 수행이 끝나면 소멸되는 변수
- 초기값을 지정한 후 사용할 수 있음 (필수!!수동!!항상 직접!!)
ex) int i = 5;
- 조건문, 반복문 블록 내에서 선언한다면 수행이 끝나면 소멸되므로 계속 사용하기 위해서는 블록 밖에서 선언 필요.
- 접근 지정자를 사용할 수 없음 : 해당 블록 내에서만 유효하기에 어차피 다른 메소드나 클래스에서 접근할 수 없으므로 접근지정자가 무의미하다.
2. 멤버변수( = 필드)
- 종류 : 클래스변수, 인스턴스 변수
- 클래스에 선언됨. 굳이 0을 안써줘도 기본적으로 0으로 초기화됨.
- static이 붙으면 클래스변수, 객체를 생성하면 인스턴스 변수이다.
package class1;
public class Student {
String name;
int age;
int grade;
}
- 위의 코드블럭에서 name, age, grade가 멤버변수이다.
3. 매개변수(=prameter)
- 메서드 호출 시 '전달하는 값'을 가지고 있는 변수(지역변수처럼 선언된 곳부터 수행이 끝날 때까지 유효함)
- 매개변수도 지역변수의 한 종류임
- 자동 초기화가 지원됨.
int sum;
sum = add(1,2); // add 메서드 호출하면서 1,2 값 전달
System.out.println(sum);
static int add(int a, int b){
int c= a+b; // a, b가 매개변수
return c;
}
* 인스턴스(=클래스 객체) : 메모리 상에 생성된 클래스 / 모든 인스턴스는 래퍼런스 변수만을 통해서 사용 가능
4. 클래스 변수
- 클래스 내부에서 static 키워드로 선언된 변수
- 객체와는 별개
- 여러 객체에서 공통으로 사용하고 싶을 때 정의.
- 객체를 생성하지 않아도 클래스명으로 바로 접근 가능
- 방식 : 클래스명.클래스변수명
class Exam{
int age;
...
...
Exam.age = 1; // 이런 식으로 접근 가능
}
5. 인스턴스 변수
- 클래스 내부에서 선언되어 일부 메소드 블록 안과 밖에서 모두 사용가능.(static메소드를 제외한 클래스 전체)
- 개별적인 저장공간으로 객체(인스턴스)마다 다른값 저장 가능
- 객체(인스턴스)를 여러개 생성했다면 각각의 참조변수명으로 접근이 가능하고 각각에 값을 저장할 수 있음.
- 클래스의 객체가 메모리에 존재할 때까지.
-접근 지정자를 사용하여 접근 제어 가능.
- 참조변수를 통해서만 접근 가능
class Exam{
String name;// 인스턴스 변수
...
....
Exem e1 = new Exem();// 클래스명으로 객체(인스턴스) 생성
e1.name = "국어"; // 참조변수 명으로 접근
Exem e2 = new Exem();// 클래스명으로 객체(인스턴스) 생성
e2.name = "영어";// 참조변수 명으로 접근
}
- 객체나 인스턴스를 생성만 하고 참조변수가 없으면 가비지 컬렉터에 의해 자동제거됨.
- 수정 : setter메서드를 통해 수정 가능.
6. 래퍼런스변수(=참조변수)
- 참조변수(메모리 상에 생성된 인스턴스를 가리키는 데(즉, 주소값을 가리키는데 ) 사용되는 변수)
- 인스턴스의 멤버변수와 메서드를 가리킬수 있도록 되어 잇음.
- 선언만 한 경우에는 초기값 null을 가지게된다.
- 컴파일 시점에는 크기를 알 수 없고 실행할 떄 new명령어를 만나면 그제서야 메모리에 할당받게 된다.
> 방식
레퍼런스 변수.멤버변수
레퍼런스 변수.메서드()
< 요약>
클래스 영역(=멤버변수) (클래스 외부 사용가능 여부 - 접근제어자에 따라 다름) |
클래스변수(static) |
인스턴스 변수(=참조변수(reference)) (단, null값만 있는 경우엔 인스턴스 변수가 아님) (클래스명.참조변수명 = new 클래스명();) |
|
메서드 영역 (접근 제어자를 사용하지 않음) |
지역변수 |
매개변수(=parameter) |
7. 카운터 변수
* 반복문 내에서 특정 값을 세기 위해 사용하는 변수
public class CounterExample {
public static void main(String[] args) {
// for 루프를 사용한 카운터 변수
System.out.println("for 루프를 사용한 예제:");
for (int i = 1; i <= 10; i++) {
System.out.println("카운터: " + i);
}
}
}
* 여러 개가 필요할 때 : i ,j, k,.....