JAVA의 가장 기본이 되는 내용

JAVA는 항상 변수의 값을 복사해서 대입한다.

cwchoiit 2024. 3. 25. 10:10
728x90
반응형
SMALL

참고 자료:

 

김영한의 실전 자바 - 중급 1편 | 김영한 - 인프런

김영한 | 실무에 필요한 자바의 다양한 중급 기능을 예제 코드로 깊이있게 학습합니다., [사진]국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바

www.inflearn.com

정말 중요한 내용이다. JAVA는 언제나, 항상 (primitive type)변수의 값을 복사해서 대입한다. (항상 (reference type)변수의 참조값을 복사해서 대입한다) 이 말이 무슨 말이냐면 다음 소스 코드를 보자.

 

위 코드를 보면 add(int value)라는 메서드에 값을 주면 그 값에 10을 더하는 로직이 있다. 그럼 이 때 main 메서드에서 만든 

int value = 30; 에서 이 value의 최종적인 값은 무엇이 될까? 답은 30이다.

왜냐하면 위 문장 "자바는 항상 변수의 값을 복사해서 대입한다"를 생각하면 된다.

 

즉, main() 메서드에서 만든 value라는 변수와 add() 메서드에서 파라미터로 받는 value는 완전히 다른 변수이다. 굳이굳이 따지자면 add(int value)에서 value는 add() 메서드에서만 사용할 수 있는 지역변수라고 생각하면 된다. 그 지역변수에 main() 메서드의 value라는 변수에 들어있는 값만이 add() 메서드에 전달될 뿐이다. 즉, 값만을 복사해서 전달한 것.

 

그리고 이런 int, boolean, double, long 등과 같은 변수를 primitive type이라고 하는데 이와 반대로 String, Boolean, Double, Students, Products 등과 같은 변수를 reference type이라고 하는데 이런 변수들에 대한 대입은 해당 참조값(주소)을 복사해서 전달한다.

 

그래서 만약 위 메서드를 만든 의도가 전달한 value의 값을 10을 추가하고 그 추가된 값으로 main() 메서드 내에서 다음 로직을 계속 진행하고자 한다면 리턴값으로 돌려받아야 한다. 아래와 같이 말이다.

 

 

그리고, 또 다른 방법으로는 인스턴스를 사용하는 경우도 메서드 내부에서 변경을 그대로 가져가 사용할 수 있다. 다음과 같은 인스턴스가 있고 value라는 멤버 변수가 있다.

 

그러면 이렇게 인스턴스를 받아서 인스턴스의 값을 메서드 내부에서 변경하면 그 값이 메서드 밖에서도 적용이 된다. 

 

이는 위 내용과 일맥상통한다. 즉, 자바에서 대입은 항상 변수에 들어 있는 값을 복사한다. 인스턴스도 변수다. 변수인데 참조형(Reference Type)이다. 인스턴스 변수의 값은 메모리상의 주소를 가지고 있다. 주소에 가면 해당 인스턴스가 가지고 있는 필드(멤버 변수)를 담는 공간이 있다.

 

다시 한번 강조! 인스턴스도 변수고 인스턴스 변수에는 인스턴스 자체가 들어있는 게 아니라 위치를 가르키는 주소(인스턴스에서 참조값은 그 인스턴스의 주소가 된다)가 들어있다. 그래서 대입 시 인스턴스가 복사되는 게 아니라 참조값만 복사된다. 그래서 add(), main() 두 메서드에서 사용되는 인스턴스는 같은 인스턴스를 가리키게 되는 것.

 

그래서 헷갈리는 개념이 다음 코드를 보자.

Boolean bVal = false;

이거 보면 primitive type이 아니고 reference type이다. 그러면 이 값을 add() 메서드에 주면 이것도 참조값을 복사해서 주니까 주소를 복사해서 전달하고 add() 메서드 내부에서 변경이 일어나면 그게 밖에서도 적용되지 않을까? 라는 궁금증이 생길 수 있다. 결론부터 말하면 아니다. 왜 그러냐면 이것은 참조형 변수는 맞다. 그러나 이게 인스턴스인가? 아니다. 인스턴스라면 new로 만들어내야 한다. 즉, 이 reference type 변수 bVal의 참조값은 그대로 'false'이다. 주소가 아니다. 실제로 이 값을 찍어보면 된다. 만약 이 변수의 참조값이 메모리상의 주소라면 주소가 찍히는데 다음과 같이 값 그대로가 찍힌다. 

 

그래서 결론은 reference type이라도 변수가 담고 있는 값(참조값)이 메모리 상에 주소가 아닌 실제 값이라면 add() 메서드 내부에서 적용한 것은 add() 메서드 외부에서까지 반영되지 않는다.

 

728x90
반응형
LIST

'JAVA의 가장 기본이 되는 내용' 카테고리의 다른 글

객체 지향 프로그래밍  (0) 2024.03.26
NullPointerException  (0) 2024.03.25
Null / GC (Garbage Collection)  (0) 2024.03.25
형변환, 형변환 시 오버플로우, 연산 시 형변환  (0) 2024.03.25
JAVA란  (0) 2024.03.18