변수의 데이터 타입을 가장 크게 기본형, 참조형으로 분류할 수 있다.
기본형 - int, long, double, boolean과 같이 변수에 사용할 값을 직접 넣을 수 있는 데이터 타입
참조형 - People person1, int[ ] a 와 같이 데이터에 접근하기 위한 주소를 저장하는 데이터 타입
기본형 | 참조형 | |
사용 | 바로 사용 가능 | 객체, 배열을 통해 메모리 상에 생성된 객체를 통해 사용 가능 |
연산 | 가능 | 불가능 |
연산 예시 )
기본형
참조형
하지만, 참조형에서 멤버 변수에 접근한 경우에는 아래와 같이 연산을 할 수 있다.
정리해보자면, 기본형을 제외한 나머지는 모두 참조형이다.
기본형은 모두 소문자로 int, long, double, boolean이 있고, 그외 대문자로 시작하는 클래스는 모두 참조형이다.
ex) String을 자바에서 문자로 많이 쓰고있다. String 역시 클래스이므로 참조형이다.
변수 대입 방법
기본형, 참조형 모두 항상 변수에 있는 값을 복사해서 대입한다. 이를 자바에서 대원칙이라고 부르는데
- 기본형이면 변수에 들어있는 실제 사용하는 값을 복사해서 대입하고,
- 참조형이면 변수에 들어 있는 참조값을 복사해서 대입하게 된다.
기본형 변수 대입
처음 a와 b의 변수를 설정한 후, 각각 a 따로 b 따로 변수를 바꾸어 출력해보았다. 당연하게도 a b 각각 재 정의한 변수들만 바뀌고 다른 변수에는 영향을 끼치지 않았다.
참조형 변수 대입
기본형 변수 대입과 다르게 a의 나이만 바꿨을 때 b의 나이도 함께 변했고, b의 나이만 바꿨을 때 a의 나이도 함께 변했다.
왜 그럴까?
잘 보면 a의 참조값과 b의 참조값이 고정되어 있다. 즉, 같은 곳을 가르킨다는 뜻이다.
변수의 대입은 변수에 들어있는 값을 복사하여 대입한다. 변수 대입 방법에서 말한 자바의 대원칙이 그렇다.
변수 a에 참조값이 들어있다. 여기서 변수 a에 들어있는 참조값을 복사하여 변수 b에 대입한다.
* 변수 a가 가리키는 인스턴스를 복사하는 것이 아니라 변수에 들어있는 참조값만 복사하여 전달한다.
a와 b에 들어있는 참조 값은 같다. 따라서 둘다 같은 참조값의 People 인스턴스를 갖게 되는 것이다.
메서드 호출시
기본형 메서드 호출
a의 변수에 30을 넣어주고 메소드에 30을 전달 한 뒤 값을 바꾸어 호출해보았다.
a에 30이라는 데이터가 생성되고, aa에 a의 값을 전달받아 다시 0으로 바꾸어서 메서드에 있는 print문은 0이 떴다.
여기서 a = 30, aa = 0 데이터 두개가 만들어진 것이다. 그러면서 메소드를 빠져나오며 aa = 0 이 사라지게 되고, 메서드 호출 후 a는 원래의 값인 30으로 유지되는 것이다.
참조형 메서드 호출
기본형과 다르게 메서드 호출 후의 값이 변화된 것을 확인할 수 있다.
이처럼 자바에서 메서드의 매개변수는 항상 값에 의해 전달된다. 그러나 매개변수의 값이 실제값이냐, 참조 값이냐에 따라 동작하는게 다르다.
- 기본형
- 메서드로 기본형 데이터를 전달할 때, 해당 값이 복사되어 전달된다.
이 경우, 메서드 내부에서 매개변수의 값을 변경해도 호출자의 변수 값에는 영향이 없다. - 참조형
- 메서드로 참조형 데이터를 전달할 때, 참조값이 복사되어 전달된다.
이 경우, 메서드 내부에서 매개변수로 전달된 객체의 멤버 변수를 변경하면, 호출자의 객체도 변경된다.
'✨ Java > etc' 카테고리의 다른 글
자바(JAVA) - 스트림(Stream) (0) | 2024.02.21 |
---|---|
자바(JAVA) - String, StringBuffer, StringBuilder 각 성능차이 (0) | 2023.07.24 |
자바(JAVA) - 직렬화(Serialization) (0) | 2023.07.24 |
자바(JAVA) - ByteArrayInputStream과 ByteArrayOutputStream (0) | 2023.07.24 |
자바(JAVA) - equals와 '==' 차이 (0) | 2023.07.20 |
댓글