
// 객체 생성 방법
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() 메소드를 제공하는 역할
무슨 말인지 잘 모르겠지만 아무튼 짱입니다