// 객체 생성 방법
new 클래스();
new
는 클래스로부터 객체를 생성시키는 연산자 new 연산자
로 생성된 객체는 메모리 힙(heap) 영역에 생성된다. new 연산자
는 힙 영역에 객체를 생성시킨 후, 객체의 주소 리턴 하... 여기부터 대가리가 깨져버리는 것입니다. 머라는거야 ㅅㅂ... 차근차근... 예제를 뜯어보겠습니다...
// 클래스 선언
public class Student {
}
// 클래스로부터 객체 생성 (StudentExample 클래스의 main() 메소드에서 Student 객체 생성)
public class StudentExample {
public static void main(String[]args) {
Student s1 = new Student(); // 객체 생성
// new 연산자를 사용하였기 때문에 객체가 메모리에 생성됨
System.out.println("s1 변수가 Student 객체를 참조합니다.");
// 힙 영역에 객체가 생성되면 변수가 객체를 참조한다!
Student s2 = new Student(); // 같은 클래스로부터 생성되었지만 각각의 개체는 자신만의 고유한 데이터를 갖는다.
// s1과 s2가 참조하는 Student 객체는 완전히 독립된 서로 다른 객체임
// 객체들은 Student 클래스의 인스턴스들!
System.out.println("s2 변수가 또 다른 Student 객체를 참조합니다.");
}
}
위를 실행시키면 메모리에 클래스 변수와 객체 생성
new
연산자를 통해서 객체를 생성함. 그리고 객체의 주소를 리턴 시킴. 리턴된 주소는 변수(s1
, s2
)에 저장된다.
new는 앞서 이야기했지만 값을 저장하는 것이 아니라 주소를 저장하는 것임. (new 연산자는 객체 주소 리턴함)
스택 영역: 변수(객체의 주소)
힙 영역: 객체(객체 -> 주소 리턴)
stack 영역: s1
, s2
/힙 영역: student객체
, student객체
(각각 참조됨)
new 연산자
를 통해 생성된 객체에 저장된 주소를 클래스 변수(참조 타입)에 저장(s1
, s2
)해두면, 변수를 통해서 객체 사용 가능. public class Student {
// 라이브러리 클래스 (필드, 생성자, 메소드)
...
}
public class StudentExample {
// 실행 클래스 (실행하기 위한 코드)
public static void main(String[]args) {
Student s1 = new Student();
System.out.println("s1 변수가 Student 객체를 참조합니다.");
Student s2 = new Student();
System.out.println("s2 변수가 또 다른 Student 객체를 참조합니다.");
}
}
main() 메소드
를 제공하는 역할
무슨 말인지 잘 모르겠지만 아무튼 짱입니다