응애개발자
article thumbnail
Published 2023. 12. 17. 20:20
[Java] 변수와 초기화 Language/Java
728x90

1. 변수와 초기화

1-1. 변수의 종류

  • 멤버 변수 (필드) : 클래스에 선언
  • 지역 변수 : 메서드에 선언, 매개변수(파라미터)도 지역 변수의 한 종류입니다. 지역 변수는 이름 그대로 특정 지역에서만 사용되는 변수라는 뜻입니다. 

 

멤버변수(필드) 예시 코드

package class1;

public class Student {
    String name;
    int age;
    int grade;
}

name, age, grade 는 멤버 변수입니다.

 

 

지역 변수 예시 코드 1

package class1;

public class ClassStart3 {
    public static void main(String[] args) {
        Student student1;
        student1 = new Student();
        Student student2 = new Student();
    }
}

student1, student2는 지역 변수입니다.

 

 

지역 변수 예시 코드 2

package class1;

public class MethodChange1 {
    public static void main(String[] args) {
        int a = 10;
        System.out.println("메서드 호출 전: a = " + a);
        changePrimitive(a);
        System.out.println("메서드 호출 후: a = " + a);
    }
    public static void changePrimitive(int x) {
        x = 20;
    }
}

a는 지역변수이고, int x 에서 x(매개변수)도 지역 변수입니다. 변수 x는 changePrimitive() 메서드 블록에서만 사용되고, 메서드가 끝나면 제거됩니다. a 변수도 마찬가지로 main() 메서드가 끝나면 제거됩니다. 

 


2. 변수값 초기화

  • 멤버 변수 : 자동 초기화
    • 인스턴스의 멤버 변수는 인스턴스를 생성할 때 자동으로 초기화됩니다.
    • 개발자가 초기값을 직접 지정할 수 있습니다.
  • 지역 변수 : 수동 초기화
    • 지역 변수는 항상 직접 초기화해야 합니다.

 

멤버변수 초기화 전체 코드

package class1;

public class InitData {

    int value1; //초기값 지정 x
    int value2 = 10; //10으로 초기화
    
}
package class1;

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);
        
    }
}

//출력 결과
value1 = 0
value2 = 10

value 1은 초기값을 지정하지 않았지만 멤버 변수는 자동으로 초기화 됩니다. int 는 0

value 2는 초기값으로 10을 설정해 두었기 때문에 객체를 생성할 때 10으로 초기화됩니다.

 


3. Null

참조형 변수에는 항상 객체가 있는 위치를 가리키는 참조값이 들어갑니다. (기본형은 초기값 존재) 그런데 아직 가리키는 대상이 없거나, 가리키는 대상을 나중에 입력하고 싶다면 null 이라는 특별한 값을 넣어줄 수 있습니다. null은 값이 존재하지 않는다. 즉, 없다는 뜻입니다.

 

전체 코드

package ref;

public class Data {

 int value;
 
}
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);
    }
}

//출력 결과
1. data = null
2. data = ref.Data@x001
3. data = null

 

출력 결과를 이해 하셨다면 넘어가셔도 됩니다. 이해가 되지 않으시다면 밑에서 자세히 설명드리겠습니다.

 

출력 결과 1

Data data = null;
 System.out.println("1. data = " + data);
 
 
//출력 결과
1. data = null

Data 타입을 받을 수 있는 참조형 변수 data를 만들었습니다. 그리고 여기에 null 이라는 값을 할당했습니다. 따라서 data 변수에는 아직 가리키는 객체가 없다는 뜻입니다.

 

출력 결과 2

data = new Data();
 System.out.println("2. data = " + data);
 
//출력 결과
2. data = ref.Data@x001

이후 새로운 Data 객체를 생성해서 처음 data 변수에 할당해 주었고, 이제 참조할 객체가 존재하기 때문에 해당 주소값이 담기게 됩니다.

 

출력 결과 3

data = null;
 System.out.println("3. data = " + data);
 
 
//출력 결과
3. data = null

마지막에는 data에 다시 null 값을 할당했고, 이렇게 하면 data 변수는 앞서 만든 Data 인스턴스를 더는 참조하지 않습니다.

 


4. Garbage Collection

data 변수에 null을 할당했기 때문에, Data 인스턴스를 더는 아무도 참조하지 않게 됩니다. 이렇게 아무도 참조하지 않게 되면 ref.Data@x001 이라는 참조값을 다시 구할 방법이 없게 됩니다. 따라서 해당 인스턴스에 다시 접근할 방법이 없습니다. 이렇게 아무도 참조하지 않는 인스턴스는 사용되지 않고 메모리 용량만 차지할 뿐입니다.
C와 같은 과거 프로그래밍 언어는 개발자가 직접 명령어를 사용하여 인스턴스를 메모리에서 제거해야 했습니다. 만약 실수로 인스턴스 삭제를 누락하면 메모리에 사용하지 않는 객체가 가득해져서 메모리 부족 오류가 발생하게 됩니다. 자바는 이런 과정을 자동으로 처리해줍니다. 아무도 참조하지 않는 인스턴스가 있으면 JVM의 가비지 콜렉터가 더이상 사용하지 않는 인스턴스라 판단하고 해당 인스턴스를 자동으로 메모리에서 제거해줍니다. 이 과정을 가비지 컬렉션(GC)이라 부릅니다.

'Language > Java' 카테고리의 다른 글

[Java] 생성자  (0) 2023.12.18
[Java] 절차지향, 객체 지향 프로그래밍  (0) 2023.12.17
[Java] 인자, 매개변수  (1) 2023.12.14
[Java] 기본형과 참조형  (2) 2023.12.13
[Java] 클래스, 객체, 인스턴스  (2) 2023.12.11
profile

응애개발자

@Eungae-D

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!