1. 변수의 종류
- 멤버변수: 클래스에 선언
- 지역변수: 메서드에 선언, 매개변수도 지역변수의 한 종류
1) 멤버변수
public class Student {
String name;
int age;
int grade;
}
- name, age, grade는 멤버변수이다.
2) 지역변수
public class Var {
public static void main(String[] args) {
Student student1;
student1 = new Student();
Student student2 = new Student();
}
}
(1) 변수 초기화
- 인스턴스 멤버 변수는 인스턴스를 생성할 때 자동으로 초기화한다.
- int, boolean, 참조형을 예를 들 수 있다.
- 지역변수는 항상 직접 초기화
package ref;
public class InitData {
int value1;
int value2 = 10;
}
package ref;
public class InitMain {
public static void main(String[] args) {
InitData data = new InitData();
System.out.println("value1 = " + data.value1);
System.out.println("value2 = " + data.value2);
}
}
2. Null
- 참조형 변수는 항상 객체가 있는 위치를 가리키는 참조값이 들어간다.
- 하지만 가리키는 대상이 없다면 null이라는 특별한 값을 넣어야 함.
package ref;
public class NullMain1 {
public static void main(String[] args) {
Data data = null;
System.out.println("1. data = " + data);
data = new Data();
System.out.println("2. data = " + data);
data = null;
System.out.println("3. data = " + data);
}
}
3. NullPointerException
- 해당 객체를 접근하는 주소가 없을때 찾아가려고 하면 예외 오류 발생
package ref;
public class BigData {
Data data;
int count;
}
package ref;
public class NullMain3 {
public static void main(String[] args) {
BigData bigData = new BigData();
System.out.println("bigData.count = " + bigData.count);
System.out.println("bigData.data = " + bigData.data);
System.out.println("bigData.data.value = " + bigData.data.value);
}
}
- 해결법은 null값인 bigData를 new 연산자를 사용하여 생성한 후 참조값을 할당받는다.
package ref;
public class NullMain4 {
public static void main(String[] args) {
BigData bigData = new BigData();
bigData.data = new Data();
System.out.println("bigData.count = " + bigData.count);
System.out.println("bigData.data = " + bigData.data);
System.out.println("bigData.data.value = " + bigData.data.value);
}
}
정리
(1) 기본형vs참조형
- 기본형을 제외한 나머지 변수는 모두 참조형.
- 참조형은 배열을 다루는 변수를 참조형
- 기본형은 직접 변수의 값을 대입하지만 참조형은 참조값을 저장한다.
- 기본형은 직접 연산이 가능하지만 참조형은 불가능하다.
- 기본형은 null을 할당할 수 없지만 참조형은 가능하다.
(2) 기본형vs참조형 - 메서드 호출
- 메서드 호출 시 기본형은 매개변수 값을 변경해도 호출자의 변수 값에 영향이 없다.
- 하지만, 참조형은 매개변수가 전달된 멤버변수를 변경하면 호출자의 객체도 변경된다.