java/oop

[oop] 8. 자바는 프로토타입클래스이다. (MemberApp) with JVM설명

jeri 2024. 4. 17. 11:11
반응형
자바는 "프로토타입클래스" 이다

 

프로토타입클래스란?
객체가 수십개 있어도 메모리에는 딱 한개만 만들어지는 것
메모리 절약 가능하다!
ex) Member클래스

 

1. Member 클래스

oop > Member.java
package oop;


//회원정보(아이디,이름,이메일)를 저장하기 위한 클래스 (VO클래스)
public class Member {

	private String id="NoId";
	private String name="NoName";
	private String email="NoEmail";
	
	public Member() {
		this("NoId","NoName","NoEmail");
	}
	

	public Member(String id) {
		this.id=id;
	}
	
	public Member(String id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	public Member(String id, String name, String email) {
		super();
		this.id = id;
		this.name = name;
		this.email = email;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getEmail() {
		return email;
	}
	
	public void setEmail(String email) {
		this.email = email;
	}
	
	//필드값을 출력하는 메소드
	public void display() {
		System.out.println("아이디 = "+id);
		System.out.println("이름 = "+name);
		System.out.println("이메일 = "+email);
	}
}

 

 

2. Member클래스 실행 프로그램

oop > MemberApp.java
package oop;

// 소스코드를 저장하면 자바컴파일러가 이진코드(ByteCode)가 저장된 클래스 파일을 생성함
//소스코드를 실행하면 JVM이 'java MemberApp' 명령어를 사용하여 MemberApp클래스를 불러들임

//1. static에 MemberApp메모리를 로드함 -> 그 안에 메인메소드가 들어있음
public class MemberApp {

		//2. MemberApp클래스의 main메소드가 자동 호출됨
		public static void main(String[] args) {

		//3. 제일 먼저 클래스로더가 Member를 읽고, 
		//static에 Member클래스(생성자1,생성자2,diplay메소드,상수,static필드 ..)를 로더함
        
        //4. new연산자가 Heap에 새주머니 생성하고, 
        //생성자2를 호출해 Heap에 멤버객체(Member클래스 이름, 객체의 필드값들 초기화)를 만듦
        //=> Member클래스 이름으로 static에 있는 Member클래스 참조가능
        
        //5. stack영역에 main메소드 내 m1참조변수 생성 후, 
        //m1참조변수 안에 참조할 메모리주소 저장함
		Member m1=new Member("abc","홍길동","abc@itwill.xyz"));

		//6. Member클래스가 로드되어있는가? 네, 또 만들 필요없어요 패스하세요.       
        
        //7. new연산자가 Heap에 새주머니 생성하고 
        //생성자2를 호출해 Heap에 Member클래스 이름과 필드의 초깃값들 저장함
        
        //8. main메소드 내 m2참조변수 생성해 위의 객체의 메모리주소 저장
        Member m2=new Member("xyz","임꺽정","xyz@itwill.xyz"));

		//9. m1.display메소드호출 시 , main메소드 대기상태로 변경
		m1.diplay();
        
		//new 연산자로 클래스의 매개변수가 없는 기본 생성자를 사용하여 객체 생성
		// => 생성된 객체의 필드는 기본값으로 자동 초기화
		// => new 연산자로 호출한 생성자가 없는 경우 객체 생성이 불가능하여 에러 발생 
		Member member1=new Member();
			
		//Getter 메소드를 호출하여 필드값을 반환받아 출력
		System.out.println("아이디 = "+member1.getId());
		System.out.println("이름 = "+member1.getName());
		System.out.println("이메일 = "+member1.getEmail());
				
		//Setter 메소드를 호출하여 매개변수의 전달값으로 객체의 필드값 변경
		member1.setId("aaa");
		member1.setName("홍길동");
		member1.setEmail("hgd@google.com");
				
		/*
		System.out.println("아이디 = "+member1.getId());
		System.out.println("이름 = "+member1.getName());
		System.out.println("이메일 = "+member1.getEmail());
		*/
        
		member1.display();
		Member member2=new Member("bbb");
		member2.display();
		Member member3=new Member("ccc", "임꺽정");
		member3.display();
		Member member4=new Member("ddd", "전우치", "chon@itwill.xyz");
		member4.display();

		//10. m1.display메소드종료
		//11. m2.display메소드호출
	    m2.display();
		//12. m2.display메소드종료
	}
}
반응형