[Java] 인스턴스 생성 & heap memory
인스턴스 생성과 힙 메모리 (heap memory)
인스턴스 (instance)
- 클래스는 객체의 속성을 정의 하고, 기능을 구현하여 만들어 놓은 코드 상태
- 실제 클래스 기반으로 생성된 객체(인스턴스)는 각각 다른 멤버 변수 값을 가지게 됨 가령, 학생의 클래스에서 생성된 각각의 인스턴스는 각각 다른 이름, 학번, 학년등의 값을 가지게 됨
- new 키워드를 사용하여 인스턴스 생성
힙 메모리
- 생성된 인스턴스는 동적 메모리(heap memory) 에 할당됨
- C나 C++ 언어에서는 사용한 동적 메모리를 프로그래머가 해제 시켜야 함 ( free() 난 delete 이용)
- 자바에서 Gabage Collector 가 주기 적으로 사용하지 않늠 메모리를 수거
- 하나의 클래스로 부터 여러개의 인스턴스가 생성되고 각각 다른 메모리 주소를 가지게 됨
참조 변수, 참조 값
Student studentLee = new Student();
studentLee.studentName = "홍길동";
System.out.println(studentLee);
용어 정리
객체 : 객체 지향 프로그램의 대상, 생성된 인스턴스
클래스 : 객체를 프로그래밍 하기위해 코드로 정의해 놓은 상태
인스턴스 : new 키워드를 사용하여 클래스를 메모리에 생성한 상태
멤버 변수 : 클래스의 속성, 특성
메서드 : 멤버 변수를 이용하여 클래스의 기능을 구현한 함수
참조 변수 : 메모리에 생성된 인스턴스를 가리키는 변수
참조 값 : 생성된 인스턴스의 메모리 주소 값
예제 분석
package ch04;
public class Student {
// 클래스 속성 선언한다.
public int studentID;
public String studentName;
public String address;
// 클래스의 메서드를 만든다.
public void showStudentinfo() {
System.out.println( studentID + " 학번의 학생의 이름은 " + studentName + "이고, 주소는 " + address + "입니다.");
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String name) {
studentName = name;
}
}
package ch04;
public class StudentTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//크키가 정해져 있기 때문에 그냥 써도 된다. 하지만 class의 경우 사이즈가 정해져 있지 않기
//때문에 정의해줘야한다.
//int num;
//class를 기반으로 여러개의 인스턴스가 생긴다(studnetLee)
//다른 말로 참조 변수라고 칭한다.
// 참조변수의 역할은 생성되는 메모리의 위치를 나타낸다.
// 타입은 student고, studentLee라는 변수가 선언되었다.
Student studentLee = new Student();
//클래스를 생성한다.
studentLee.studentID = 12345;
studentLee.setStudentName("Lee");
studentLee.address = "서울 강남";
studentLee.showStudentinfo();
// 만든 인스턴스들을 호출한다.
Student studentPark = new Student();
studentPark.studentID = 180506;
studentPark.setStudentName("Park");
studentPark.address = "충북 제천";
studentPark.showStudentinfo();
}
}
//실행을 하기 위한 클래스를 만든다
System.out.println(studentLee);
System.out.println(studentPark);
위의 코드를 찍어보면
콘솔에 이런 창이 하나 뜨는데
ch03.Student
해당 부분은 패키지의 이름과 클래스의 이름으로 풀네임이라고 하며
@3cb5cdba
@ 뒤에 오는 값이 주소값이다. 참조값이라고도 하며, 레퍼런스 value이다. 가르키는 주소가 가르키는 것은 student Lee와 Park이 자리잡은 어드레스주소를 말하며, 실제 물리적인 주소가 아니고, 가상 어드레스를 말한다.
실습해보기
package ch04;
public class Mango {
public int mangoID;
public String mangoName;
public int mangoAge;
public String mangoAddress;
public void mangodans() {
System.out.println("품번" + mangoID +"는 " + mangoAge + "년 산 망고이며, 이름은 " + mangoName + "(이)라고도 불립니다. 구매 문의는 " + mangoAddress +"시장으로 주세요 " );
}
}
package ch04;
public class MangTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Mango mangoS = new Mango();
mangoS.mangoID = 0023;
mangoS.mangoAge = 88;
mangoS.mangoAddress = "강원도 강릉 ";
mangoS.mangoName = "당망고 ";
mangoS.mangodans();
}
}
출력 결과
Leave a comment