TIL/JAVA

[JAVA] 변수와 초기화

아람2 2024. 12. 2. 16:20
반응형

듣고 있는 강의 - 김영한의 실전 자바 기본편 

 

변수의 초기화 

멤버 변수 (필드) 

클래스에 선언

인스턴스의 멤버 변수는 인스턴스를 생성할 때 자동으로 초기된다 

숫자 (int) = 0, boolean = false, 참조형 = NULL (NULL - 참조할 대상이 없다) 

지역 변수 

메서드에 선언 

매개 변수도 지역 변수의 한 종류이다 

지역 변수는 항상 직접 초기화해야 한다 

int value1; // 초기화하지 않음
int value2 = 10; // 10 으로 초기화

 

NULL 

NULL 은 참조형에서만 사용할 수 있다 

가리키는 대상이 없거나, 가리키는 대상을 나중에 입력하고 싶을 때 사용한다 

아직 값이 없다, 존재하지 않는다 라는 뜻 

package ref;

public class NullMain1 {
    public static void main(String[] args) {
//        Data data; // 지역 변수라서 초기화하지 않고 선언하면 안 됨
        Data data = null; // NULL 로 초기화 - 가리키는 객체가 없다
        System.out.println("1. data - " + data);
        data = new Data(); // 새로운 Data 객체 생성하여 data 에 할당
        System.out.println("2. data - "+data);
        data = null; // 다시 NULL 할당  
        System.out.println("3. data - "+data);
    }
}

// 결과
1. data - null
2. data - ref.Data@3feba861
3. data - null

 

참고) Garbage Collection - 아무도 참조하지 않는 인스턴스의 최후

2번에서 Data 객체를 생성했다가 3번에서 NULL 을 할당하게 되면, 앞서 생성한 Data 객체는 아무도 참조하지 않는다 

이렇게 아무도 참조하지 않게 되면 이 참조값을 다시 구할 방법이 없고, 해당 인스턴스에 다시 접근할 방법이 없게 된다 

이렇게 아무도 참조하지 않는 인스턴스를 사용되지 않고 메모리 용량만 차지한다 (쌓이면 메모리 부족 오류를 발생시킨다)

C 에서는 이런 인스턴스를 직접 메모리에서 제거해야 하지만, 자바는 JVM 의 GC 에서 자동으로 메모리에서 제거해 준다 

 

NullPointerException 

NullPointerException 은 이름 그대로 null 을 가리키는 (pointer) 인데, 이 때 발생하는 예외 exception 이다 

Null 은 없다는 뜻이므로, 결국 주소가 없는 곳을 찾아갈 때 발생하는 예외이다 

객체를 참조할 때 . dot 을 사용하는데 null 에 . 을 사용할 때 발생한다 

package ref;

public class BigData {
    Data data; // 초기값 NULL
    int count; // 초기값 0
}

public class Data {
    int value;
}

public class NullMain3 {
    public static void main(String[] args) {
        /* NullPointerException Error 확인 */
        BigData bigData = new BigData();
        System.out.println("bigData.data "+bigData.data);
        System.out.println("bigData.count "+bigData.count);

        System.out.println("bigData.data.value "+bigData.data.value);
    }
}

// 결과 
bigData.data null
bigData.count 0
Exception in thread "main" java.lang.NullPointerException: Cannot read field "value" because "bigData.data" is null
	at ref.NullMain3.main(NullMain3.java:10)


BigData 의 data 멤버 변수가 참조형이므로 null 로 초기화되기 때문에 BigData.data.value 에서 NullPointerException 이 발생한다 

아래와 같이 Data 인스턴스를 만들고 BigData.data 멤버 변수에 참조값을 할당하면 NullPointerException 이 발생하지 않는다 

		...
        BigData bigData = new BigData();
        bigData.data = new Data();
        System.out.println("bigData.data "+bigData.data);
		...
        
// 결과 
bigData.data ref.Data@5f184fc6
bigData.count 0
bigData.data.value 0

NullPointerException 은 NULL 값에 . dot 을 찍었다고 생각하면 문제를 쉽게 찾을 수 있다 

 

📌 단축키

iter - 향상된 for 문

Option + Cmd + V - 자동으로 변수 타입과 변수명 선언해주기

getTotalAmount(orders); 앞에서 Option+Cmd+V 해주면 int totalAmount 라는 변수가 자동으로 만들어진다 

 

기본형과 참조형 코드 예시

package ref.ex;

import java.util.Scanner;

/* ref 의 ProductOrderMain2 리팩토링 - 사용자 입력 받기 */
public class ProductOrderMain3 {
    public static void main(String[] args) {
//        ProductOrder[] orders = new ProductOrder[3];
//        orders[0] = createOrder("두부", 2000, 2);
//        orders[1] = createOrder("김치", 5000, 1);
//        orders[2] = createOrder("콜라", 1500, 2);
        Scanner scanner = new Scanner(System.in);
        System.out.print("입력할 주문의 개수 ");
        int n = scanner.nextInt();
        scanner.nextLine(); // Buffer 없애기 

        ProductOrder[] orders = new ProductOrder[n];
        for (int i=0; i< orders.length; i++) { // 상품 정보 입력 받기
            System.out.println((i+1)+"번째 상품 정보를 입력하세요 ");
            System.out.print("상품명 ");
            String productName = scanner.nextLine();
            System.out.print("가격 ");
            int price = scanner.nextInt();
            System.out.print("수량 ");
            int quantity = scanner.nextInt();
            scanner.nextLine(); // Buffer 비우기

            orders[i] = createOrder(productName, price, quantity);
        }

        printOrders(orders); // 항목 출력
        int totalAmount = getTotalAmount(orders);
        System.out.println("총 결제 금액 "+totalAmount);
    }

    static ProductOrder createOrder(String name, int price, int quantity) {
        ProductOrder orders = new ProductOrder();
        orders.productName = name;
        orders.price = price;
        orders.quantity = quantity;
        return orders;
    }

    /* 상품명과 가격과 수량을 출력하는 메서드 */
    static void printOrders(ProductOrder[] orders) {
        for(ProductOrder order: orders) {
            System.out.println("상품명 "+order.productName +" 가격 "+order.price+" 수량 "+order.quantity);
        }
    }
    /* 총 결제 금액을 계산하여 반환하는 메서드 */
    static int getTotalAmount(ProductOrder[] orders) {
        int totalAmount = 0;
        for(ProductOrder order: orders) {
            totalAmount += order.price * order.quantity;
        }
        return totalAmount;
    }
}
반응형

'TIL > JAVA' 카테고리의 다른 글

[JAVA] 어노테이션 Annotation  (2) 2024.12.10
[JAVA] 객체 지향 프로그래밍  (5) 2024.12.06
[JAVA] 기본형과 참조형  (2) 2024.11.26
[JAVA][기본] 클래스 Class  (4) 2024.11.16
[JAVA] 메서드 Method 2/2  (0) 2024.11.13