듣고 있는 강의 - 김영한의 실전 자바 기본편
변수의 초기화
멤버 변수 (필드)
클래스에 선언
인스턴스의 멤버 변수는 인스턴스를 생성할 때 자동으로 초기화된다
숫자 (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 |