저번 주에 공부한 게 아직 머리에 제대로 남지 않았나 보다… 문제를 풀 때도 그렇고 보면 볼 수록 모르겠고 복잡해서 진짜 또 너무 괴롭따..🫠 help me…참조변수를 이해하는데 너무너무너무 어려워서 참조변수랑 메모리 구조만 따로 먼저 정리를 해보려 한다.
✅ 기본 변수 vs 참조 변수가 무엇인지 모르겠는가?
→ 글로 참조 변수가 주소를 가키킨다는 것은 너무나도 알겠다. 기본 변수의 타입이 int, string, double 등이 있다는 것도.. 근데 코드만 보면 도통 무슨 말인지 이해가 안된다. class를 호출해서 생성자를 만들고 인스턴스에 값을 넣기 시작하면서 머리가 복잡해졌다… 그래서 다시 정리가 필요할 듯 해서 차근차근 내가 이해하기 쉽게 정리해볼까 한다.
기본 변수와 참조 변수
기본 변수는 물건이 있을 때 물건을 바로 가리키는 것과 비슷하다.
예를 들어 오늘 입을 옷의 정보를 저장하기 위해 “String” 타입의 변수를 만들었다면 기본 변수는 오늘 입을 옷 정보 가리킨다.
기본 변수가 물건의 정보를 가리킨다면 참조 변수는 물건이 어디 있는지 위치를 가리킨다.
class Clothes{
// 참조 변수가 없는 기본 변수 color, type
String color;
String type;
// 생성자 메서드
public Clothes(String color, String type){
this.color = color; // color 필드 초기화
this.type = type; // type 필드 초기
}
}
public class ReferenceExample {
public static void main(String[] args) {
// Clothes 클래스의 인스턴스 생성
// new 키워드를 사용하여 메모리 공간 확보
// ootd는 클래스의 인스턴스를 가리키는 참조변수
Clothes ootd = new Clothes("검은색","후드티");
// 인스턴스의 color와 type 필드 출력
System.out.println("오늘 입을 옷은 "+ ootd.color +" "+ ootd.type+"입니다🧥");
// 인스턴스를 참조하는 참조 변수 ootd 출력
System.out.println(ootd);
}
}
// 결과값
// 오늘 입을 옷은 검은색 후드티입니다🧥
// java_0424.Clothes@13fee20c (참조변수의 위치는 컴퓨터마다 다르게 나올 것)
⇒ 출력결과
오늘 입을 옷은 검은색 후드티입니다🧥
java_0424.Clothes@13fee20c (주소)
위의 옷 정보는 참조변수의 주소를 찾아가서 기본변수 color와 type의 정보를 출력했다. 그리고 아래 ootd만 출력한 결과는 주소만 출력되어 나왔다.
즉, 참조 변수는 어디 있는지 위치를 알려주는 변수이고 점연산자(.)를 활용해 기본 연산자에 접근한다.
그리고 참조 변수를 배울 수 있는 또 다른 예시이다. 이번 예시는 오늘 배운 “생성자”와도 연관이 있다.
package java_0424;
// 클래스 정의
class Pants {
// 기본 변수
String color;
String type;
// 생성자(매개변수, 매개변수)
public Pants(String color, String type){
// 이 객체의 color = 매개변수에 입력 받는 color
this.color = color;
// 이 객체의 type = 매개변수에 입력 받는 type
this.type = type;
}
}
// ReferenceExample2 정의
public class ReferenceExample2 {
// 생성자를 가지지 않는 Top 메소드(기본변수로만 구성)
public static void Top() {
String color = "pale yellow";
String color2 = color; // color2 = "pale yellow"
color2 = "pink"; // color2 = "pink"
System.out.println("오늘 입을 상의 색은 "+color);
System.out.println("내일 입을 상의 색은 "+color2);
}
// pants메소드 정의
public static void pants(){
// Pants 객체 생성
Pants pantsA = new Pants("black","slacks");
// pantsA의 주소값을 pantsB변수에 할당
Pants pantsB = pantsA;
// pantsB 객체의 type 속성 값을 변경
pantsB.type = "jeans";
System.out.println("오늘 입을 바지의 종류는 "+pantsA.type);
System.out.println("내일 입을 바지의 종류는 "+pantsB.type);
}
// main 메소드
public static void main(String[] args){
Top(); // Top 메소드 호출
pants(); // pants 메소드 호출
}
}
// 결과값
// 오늘 입을 상의는 pale yellow
// 오늘 입을 바지의 종류는 jeans
탑 메소드를 그림으로 표현해보면 다음과 같다.
- String color = “pale yellow”; 로 초기화
- String color2 = color; color2라는 변수 메모리 값에는 color의 글자 “pale yellow”가 들어간다.
- color2 = “pink”; color2 는 “pink” 값으로 변환 되면서 color2에 있던 pale yellow 값은 지워진다.
- color의 값은 그대로 “pale yellow” 변함 없이 남아있다.
⇒ Top 메소드의 출력값
오늘 입을 상의 색은 pale yellow
내일 입을 상의 색은 pink
흠.. 그림을 어떻게 그리는 게 맞는지… 모르겠다ㅎ
- public Pants(String color, String type){ }을 갖는 생성자가 만들어진다.
- pants메소드에서 Pants pantsA = new Pants("black","slacks"); → Pants를 가리키는 pantsA라는 참조 변수가 만들어 지고 new 메소드를 통해 메모리를 확보한다 → 입력된 매개변수 값인 black과 slacks가 저장(초기화)된다.
- Pants pantsB = pantsA; → Pants를 가리키는 새로운 참조 변수를 만들어 주고 pantsB의 주소는 pantsA의 주소로 할당한다.
- pantsA와 pantsB는 동일한 곳을 가리킨다.
- pantsB.type = “jeans”; 로 참조 변수 pantsB가 가리키는 곳의 type 값을 “jeans”로 변경해준다.
- 결국 pantsA와 pantsB는 동일한 곳을 가리킴으로 하나의 값을 바꾸면 같이 변경된다.
⇒ 동일한 곳을 가리킬 때 변수의 값은 동일하다.
이렇게 객체가 생성됨에 따라 머리가 아파졌다. 기본 변수의 값을 바로 출력하는 Top 메소드는 출력값이 이해된다 하지만 pants 메소드는 쉽게 이해되지 않았기 때문이다. 생성자를 만드는 과정에서도 new가 생성자라는 건지~ㅋㅋㅋ 근데 왜 new가 없는데 또 Pants가 생성자래@!! 이러면서 처음에는 헷갈렸는데 참조변수를 공부하고 나니 정리가 됐다!
사실 아직 heap 메모리, stack 메모리에 대해서는 잘 모르겠다. 스택, 큐, 이것도 시험 때문에 글로만 외웠지 이전에 학원 다닐 때는 내가 코딩을 하면서도 사용되는지 모르면서 썼던 내용들이라 진짜 머리가 지끈 거린다.
이걸 어떻게 정리해야 더 이해하기 쉽고 내가 나중에 봤을 때도 또 아 이런 거였지 하면서 볼 수 있을까 생각하면서 쓰다 보니 더 오래 걸리는 듯 하다. 항상 그렇게 쓰긴 하는데.. 오늘은 유독 오래 걸렸다. 이상하다. 개념을 정리한다는 게 정말 쉽지 않다.
오늘 생성자를 정리하다 말고 참조변수를 정리하기 시작한 것인데 9시간 동안 참조변수만 봤다. 그래도 이제 참조변수가 뭔지는 정확히 설명할 수 있을 것 같다. 진짜로ㅋㅋㅋㅎㅎ
진짜 차라리 문제만 풀고싶다 흐앙앙...ㅜㅜ 그래도 뭔가 이렇게 개념들을 알아가니 마음이 편하다. 이전에 학원에서는 static이 뭔지도 정확히 모르고 공부했으니까...ㅎㅎ 좋다... 그래도 오늘처럼 오래 걸리는 건 너무 마음도 몸도 힘들다. 근데 오늘은 사실 이렇게 안됐던 이유를 글을 쓰다보니 알 것 같긴 하다.. : )
'LANGUAGE > JAVA' 카테고리의 다른 글
[JAVA] JAVA 객체지향 프로그래밍 / 메서드 오버라이딩(Method Overriding)이란? (0) | 2023.04.25 |
---|---|
[JAVA] 자바 객체 지향 프로그래밍 / 상속화(inheritance) (0) | 2023.04.25 |
[JAVA] System.arraycopy 배열에 값 추가하기 / 배열 복사 메서드 (0) | 2023.04.24 |
[JAVA] JAVA 객체지향 프로그래밍 / 메서드 오버로딩(Method Overloading)이란? (0) | 2023.04.23 |
[JAVA] 필드(Field)와 메서드(Method) / 변수의 구분 (0) | 2023.04.22 |