inflearn

[인프런] 김영한의 자바 기본 강의 섹션2. 기본형과 참조형 (240105)

hail2y 2024. 1. 6. 01:02

어제 필기 본에 기본형과 참조형이 들어가 버렸다..! 별 수 없다 이 글은 어차피 내가 보려고 적어둔 글이니 참고하고 넘어가야지 덕분에 필기양이 줄겠군 후후

1/5 섹션2 기본형과 참조형 필기 

기본형과 참조형에 대해 갓영한 선생님께서 설명을 너무 잘해주셔서 다 이해된 줄 알았더니 영락없이 코드 예측을 실패했다ㅋ 지금은 다 이해했어! 이거 필기 본 올리고 파일 한번 검토해 봐야지-

Data dataA = new Data();
dataA.value = 10;
Data dataB = dataA;

 

dataA.value와 dataB.value를 출력해 보면 같은 값을 가지고 있는 걸 확인할 수 있다. 왜냐하면 dataB에는 dataA가 가지고 있는 인스턴스의 주소를 똑같이 가지고 있으니까, 즉 똑같은 곳을 참조하고 있기 때문에 같은 값을 가져오게 된다. 그렇기 때문에 dataA.value = 20;을 하더라도 B의 value 또한 20으로 변경된다. 반대로 dataB.value = 30;을 하면 A의 value 또한 30으로 변경된다. 

 

자꾸 이 개념을 잊어 버리게 되는데 의식적으로 생각하자! step by step!

dataA.value

dataB.value

.을 찍으면 변수에 있는 참조값을 통해 객체에 접근하게 된다. 위에서처럼 둘다 동일한 참조값을 담고 있으니 어느 하나의 value를 변경하더라도 같은 결과를 나오는 것을 알 수 있다. 

 

Data dataX = dataA; -- 접근할 수 있는 방법이 하나 늘어난다고 생각하면 된다.

  • 기본형은 메서드 내부의 매개변수 값을 변경해도 호출자의 변수 값에 영향이 없다. 그에 반해 참조형은 참조값이 복사되어 전달되는데 메서드 내부에서 매개변수로 전달된 객체의 멤버변수를 변경하면 호출자의 객체도 변경된다.  

인텔리제이 팁 

  • 자기 패키지에 있는 클래스는 자동으로 읽어들이지만 다른 패키지에 있는 클래스는 가져오면 안 된다. 접근 제어자 때문에 컴파일 오류가 발생한다. 

다른 패키지의 것을 써도 되는데 지금은 접근 제어자를 배우지 않았기 때문에 자기 패키지 안에 있는 것만 불러오도록 한다. 

 

Student 타입의 student 변수를 여러 개 만든다고 할 때 createStudent 메서드 안에 인스턴스를 생성하고 매개변수로 그 멤버변수의 값을 전달하면서 코드를 깔끔하게 만들 수 있다. 

조심! 중요!

메서드 안에 인스턴스를 생성하게 되면 종료 시에 참조값을 가지고 있던 참조 변수만 사라지고 인스턴스는 사라지지 않는다. 따라서 반환 값을 받아 메인 메서드에서 인스턴스에 여전히 접근할 수 있게 되는 것이다.

 

  • 변수의 종류는 크게 멤버변수와 지역변수로 나뉘어진다.
  • 멤버변수는 숫자 0, boolean false, 참조형 null로 자동 초기화가 되고, 지역변수는 수동 초기화 해야 한다. 

GC(가비지 컬렉션) 

아무도 참조하지 않는 인스턴스 정리 

 

C에서는 직접 명령어로 메모리에서 제거하는데 실수로 인스턴스 삭제를 누락하게 되면 메모리에 사용하지 않는 객체가 가득해져서 메모리 부족 오류로 프로그램 종료가 될 수 있다. 자바에서는 JVM에서 가비지 컬렉션을 자동으로 해 준다.

-- 보통 참조 변수에 직접 null을 할당하지는 않고, 지역변수에다 참조값을 넣어서 생존범위가 끝나거나 더 이상 아무도 참조하고 있지 않을 때 가비지 컬렉션이 이루어진다.

(어느 정도 모이면 한번에 제거한다. -- 일일이 제거하는 것보다 좋음)

 

nullPointerException

참조값 없이 객체를 찾아갔을 때 생기는 오류, 즉 null에다 점을 찍었을 때 발생한다. 

 

기본형 변수는 null을 할당할 수 없지만 참조형 변수는 null을 할당할 수 있다.  null은 참조하는 곳이, 참조하는 메모리가 없을 때 사용된다.

Data data = null;
data.value = 10;  // NullPointerException 예외 발생
System.out.println("data= " + data.value);

 

예외가 발생하면 이후의 코드는 실행되지 않고 그대로 밖으로 빠져나간다. 

 

오랜만에 치트키 등장!

  • ctrl + alt + V 반환값 받아와서 변수에 저장할 때 앞에 자동으로 변수명을 설정해 준다. 

 

--끝--