💁♀️ 오늘의 TIL
객체를 만들기 위한 틀
붕어빵이 객체라면, 붕어빵 틀은 클래스
public class 클래스 명 {
클래스 블록
}
public class CarExam {
public static void main(Sting[] args) {
Car c1 = new Car ();
Car c2 = new Car ();
}
}
new
연산자는 new
앞에 나오는 생성자 Car
를 이용하여 메모리에 객체(인스턴스)를 만든다.c1
, c2
Car
라는 객체가 2개 만들어지고 각각의 객체를 참조하는 c1
, c2
변수가 선언된다. 기본형 타입 : 논리형, 문자형, 정수형, 실수형
👉 기본형 타입은 클래스가 아니다.
참조형 타입 : 기본형 타입을 제외한 모든 타입 (배열, 클래스 등)
public class ReferenceDataType {
public static void main(String[] args) {
int i = 4;
String str = new String ("hello");
// 변수앞에 기본형 타입이 아닌 String 타입이, new 뒤에는 생성자 String이 있다.
// new 라는 키워드는 '클래스를 메모리에 올려주세요'
// 메모리에 올라간 클래스는 인스턴스 라고 한다.
// 인스턴스를 참조하는(가리키는) 변수는 str
}
}
str
이 String
인스턴스를 가지고 있는것이 아니라 String
인스턴스는 다른 메모리 영역에 있고 이 인스턴스를 참조하는 것
str
변수는 메모리 위치값을 저장
- 모든 클래스는 new 연산자를 이용하여 인스턴스화 함
- 그러나 String 은 new라는 연산자를 이용하지 않아도 됨
- 한번 생성된 String 클래스는 변하지 않는다.
✍ 예제
public class StringExam {
Public static void(String[] args {
String str1 = "hello"; //hello 인스턴스를 상수 영역에 저장
String str2 = "hello"; //기존 hello 인스턴스를 가리킴
String str3 = new String("hello"); //새 인스턴스를 힙 영역에 저장
String str4 = new Strings("hello"); //각각 다른 hello 인스턴스를 가리킴
if(str1 == str2)
System.out.println("str1 과 str2는 같은 레퍼런스이다.");
if(str1 == str3)
System.out.println("str1 과 str3는 같은 레퍼런스이다.");
if(str3 == str4)
System.out.println("str3 과 str4는 같은 레퍼런스이다.");
}
}
👉 결과
str1 과 str2는 같은 레퍼런스이다.
상수 영역과 힙영역
- Runtime Data Area (프로그램을 수행하기위해 운영체제에서 할당받은 메모리공간) 에는 클래스, 스택, 힙 ,native, 메소드, pc 레지스터로 나뉘는데 상수는 클래스 영역에, new로 생성하면 힙 영역에 객체로 생성된다.
- 그냥 서로 다른 영역에 생성된다고 생각
https://brownbears.tistory.com/519
참조 타입에 대해 깔끔하게 정리한 설명이 있어서 첨부한다.