반응형

# 정보은닉 (Private)

## 정보은닉

  • 정보은닉 : 다른 객체(class)로부터 접근을 막는 것이다. (멤버변수를 private 하여 정보은닉.)
public class MemberVO {
	private String name;
	private int age;
	private String tel;
	private String addr;
    
	public MemberVO() {
    
	}
}
  • 이때 객체생성해서 아래와 같이 바로 접근하는 건 제한 됨.
MemberVO member = new MemberVO();

멤버변수가 private 이기때문에 아래와 같이 접근 불가.
m.name
m.age
m.tel
m.addr
  • private 멤버 변수에 접근하는 방법 : getter, setter method 를 활용.

## getter, setter method

  • 정보은닉된 정보 접근 시 getter, getter method 활용.
public void setName(String name) {
	this.name = name;
}

public String getName() {
	return name;
}
  • 아래와 같이 사용.
m.setName("자바");
m.getName();

## getter, setter method (실습)

  • 아래와 같이 직접 접근하여 데이터를 넣게되면 잘못된 데이터가 들어갈수도 있다. 그렇기 때문에 정보은닉 필요.
package kr.tpc;

public class MemberVO {
	public String name;
	public int age;
	public String tel;
	public String addr;
	
	public MemberVO() {
		
	}
}
import kr.tpc.MemberVO;

public class TPC15 {

	public static void main(String[] args) {
		MemberVO member = new MemberVO();
		member.name = "홍길동";
		member.age = 5000;	// 나이에 터무니없는 값 넣어짐.
		member.tel = "010-1234-5678";
		member.addr = "세종시";
		
		System.out.println(member.name);
		System.out.println(member.age);
		System.out.println(member.tel);
		System.out.println(member.addr);
		
		
	}
}
  • 정보은닉 적용.
package kr.tpc;

public class MemberVO {
	private String name;
	private int age;
	private String tel;
	private String addr;
	
	public MemberVO() {
		
	}

	// getter, setter method
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		if (age > 0 && age <= 200) {
			this.age = age;
		} else {
		}		
	}

	public String getTel() {
		return tel;
	}

	public void setTel(String tel) {
		this.tel = tel;
	}

	public String getAddr() {
		return addr;
	}

	public void setAddr(String addr) {
		this.addr = addr;
	}
}
import kr.tpc.MemberVO;

public class TPC15 {

	public static void main(String[] args) {
		MemberVO member = new MemberVO();
		member.setName("홍길동");
		member.setAge(1000);
		member.setTel("010-1234-5678");
		member.setAddr("세종시");
		
		System.out.println(member.getName());
		System.out.println(member.getAge());
		System.out.println(member.getTel());
		System.out.println(member.getAddr());	
	}
}

 

# 잘 설계된 클래스

## 잘 설계 된 DTO, VO 클래스

1. 정보은닉 (information hiding)

  • 모든 멤버는 private로 정보은닉하여 객체의 상태를 보호해야 한다. 

2. 생성자

  • 디폴트 생성자를 명시적으로 만든다.
  • 오버로딩 생성자를 만들어 적절하게 초기화 한다. (객체를 생성하는 작업은 생성자 내부에서 JVM이 자동으로 처리한다.)

3. getter, setter method

  • getter, setter method 생성 : private으로 만들어진 멤버변수를 접근하기 위해 getter, setter method를 생성한다. 
  • DI (Dependency Injection) : 종속 객체 주입으로, setter method의 역할.

4. toString() method

  • toString() method : 객체가 가지고 있는 값 전체를 출력하기 위한 toString() method를 재정의 한다.
package kr.tpc;

public class MemberVO {
	// 1. 정보은닉.
	private String name;
	private int age;
	private String tel;
	private String addr;
	
	// 2. 생성자
	// 디폴트 생성자 명시적으로 생성.
	public MemberVO() {	
	}	
	// 생성자 오버로딩(중복적용) -> 초기화를 효율적으로 하기 위함.
	public MemberVO(String name, int age, String tel, String addr) {	
		this.name = name;
		this.age = age;
		this.tel = tel;
		this.addr = addr;
	}
	
	// getter, setter method
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		if (age > 0 && age <= 200) {
			this.age = age;
		} else {
		}		
	}

	public String getTel() {
		return tel;
	}

	public void setTel(String tel) {
		this.tel = tel;
	}

	public String getAddr() {
		return addr;
	}

	public void setAddr(String addr) {
		this.addr = addr;
	}
	
	// 3. 디버깅 하기 쉽도록 toString() 메서드 생성.
	@Override
	public String toString() {
		return "MemberVO [name=" + name + ", age=" + age + ", tel=" + tel + ", addr=" + addr + "]";
	}
}

## 잘 설계된 클래스 (실습)

package kr.tpc;

public class MemberVO {
	// 1. 정보은닉.
	private String name;
	private int age;
	private String tel;
	private String addr;
	
	// 2. 생성자
	// 디폴트 생성자 명시적으로 생성.
	public MemberVO() {	
	}	
	// 생성자 오버로딩(중복적용) -> 초기화를 효율적으로 하기 위함.
	public MemberVO(String name, int age, String tel, String addr) {	
		this.name = name;
		this.age = age;
		this.tel = tel;
		this.addr = addr;
	}
	
	// getter, setter method
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		if (age > 0 && age <= 200) {
			this.age = age;
		} else {
		}		
	}

	public String getTel() {
		return tel;
	}

	public void setTel(String tel) {
		this.tel = tel;
	}

	public String getAddr() {
		return addr;
	}

	public void setAddr(String addr) {
		this.addr = addr;
	}
	
	// 3. 디버깅 하기 쉽도록 toString() 메서드 생성.
	@Override
	public String toString() {
		return "MemberVO [name=" + name + ", age=" + age + ", tel=" + tel + ", addr=" + addr + "]";
	}
}
import kr.tpc.MemberVO;

public class TPC16 {
	public static void main(String[] args) {
		MemberVO member = new MemberVO("홍길동", 100, "010-1111-1111", "서울시");
		// 위와같이 했을땐 생성자를 이용하여 초기화 하여 getter, setter 필요 없음.
		
		System.out.println(member);	// toString() 메서드로 인해 하나의 문자열로 출력됨.
		
		
		MemberVO m = new MemberVO();
		m.setName("홍길순");
		m.setAge(90);
		m.setTel("010-1234-1234");
		m.setAddr("세종시");
		
		System.out.println(m);		
	}
}
반응형
반응형

# private 생성자

## private 생성자 메서드 (Constructor)

  • 객체생성에 관여하는 생성자 메서드가 private 접근제어를 가지면 객체를 생성할 수 없다는 뜻이 됨.
  • 그러므로 객체를 생성하지 않고도 사용가능해야 된다. (모든 클래스의 멤버가 static 멤버가 되어야 한다.)
public class BookDTO {
	private BookDTO(){
		
	}
    
	// 인스턴스 메서드 (static 키워드가 붙어있지 않는 메서드)
	public void tpc() {
		System.out.println("TPC 강의");
	}
    
	// 클래스 메서드 (static 키워드가 붙은 메서드를 의미)
	public static void java() {
		System.out.println("JAVA 강의");
	}
}


=>
어떤 객체에 생성자 메서드가 private이면 모든 멤버는 static이 붙은 멤버가 되어야 함.

### static 멤버 접근방법

클래스이름.클래스메서드 (static 메서드)

### 인스턴스 메서드 (non-static 멤버인 경우)

  • 객체 생성 후 접근 가능.
BookDTO book = new BookDTO();	// 생성자가 public인 경우.
book.tpc();

=> 
생성자가 private인 경우 BookDTO book = new BookDTO(); 불가하므로. tpc() 메서드 접근 불가.

### 클래스 메서드 (static 멤버인 경우)

  • 객체 생성 없이 접근 가능 (클래스 이름으로 접근)
BookDTO.java();

=>
클래스를 사용하는 시점에서 static 멤버는 먼저 자동으로 메모리에 로딩된다.
그 이후 호출이 됨.
  • 자주 사용하는 객체, 동작은 static 멤버로 만들어서 사용한다.

## private 생성자 메서드(실습)

### 클래스 메서드와 인스턴스 메서드 존재 시 접근

package kr.tpc;

public class Inflearn {
	
	// 인스턴스 메서드
	public void tpc() {
		System.out.println("TPC 재밌음.");
	}
	
	// 클래스 메서드
	public static void java() {
		System.out.println("JAVA 재밌음.");
	}
}
import kr.tpc.Inflearn;

public class TPC13 {

	public static void main(String[] args) {
		Inflearn inf = new Inflearn();
		inf.tpc();	// 인스턴스 메서드는 인스턴스 생성 후 접근해야 해서 번거로움.
		//inf.java();
		
		Inflearn.java(); // 클래스메서드는 new 사용하지 않고 클래스명으로 바로 접근 가능.
	}
}

### 클래스 메서드만 존재 시 접근

package kr.tpc;

public class Inflearn {
	
	// 클래스 메서드
	public static void tpc() {
		System.out.println("TPC 재밌음.");
	}
	
	// 클래스 메서드
	public static void java() {
		System.out.println("JAVA 재밌음.");
	}
}
import kr.tpc.Inflearn;

public class TPC13 {

	public static void main(String[] args) {
		/*
		 * Inflearn inf = new Inflearn(); inf.tpc(); // 인스턴스 메서드는 인스턴스 생성 후 접근해야 해서
		 * 번거로움. //inf.java();
		 */		
		
		Inflearn.java(); // 클래스메서드는 new 사용하지 않고 클래스명으로 바로 접근 가능.
		Inflearn.tpc();
	}
}
  • 이때 객체 생성은 필요하지 않으므로 생성자를 private로 해주면 생성자 메서드 호출 불가.
package kr.tpc;

public class Inflearn {
	
	private Inflearn() {
		
	}
	
	// 클래스 메서드
	public static void tpc() {
		System.out.println("TPC 재밌음.");
	}
	
	// 클래스 메서드
	public static void java() {
		System.out.println("JAVA 재밌음.");
	}
}

 

import kr.tpc.Inflearn;

public class TPC13 {

	public static void main(String[] args) {
		/*
		 * Inflearn inf = new Inflearn(); inf.tpc(); // 인스턴스 메서드는 인스턴스 생성 후 접근해야 해서
		 * 번거로움. //inf.java();
		 */		
		
		// Inflearn inf = new Inflearn(); // private라 생성자 호출 불가.
		
		Inflearn.java(); // 클래스메서드는 new 사용하지 않고 클래스명으로 바로 접근 가능.
		Inflearn.tpc();
	}
}

 

### 자바 API 생성자 private

import kr.tpc.Inflearn;

public class TPC13 {

	public static void main(String[] args) {
		// Java API 생성자 private
		// 1. System 
		// System system = new System();
		System.out.println();
		
		// 2. Math
		// Math m = new Math();
		int v = Math.max(10, 20);
	}
}

 

# class, object, instance 상호관계

  • 객체 생성과정
BookDTO book = new BookDTO();	// new 연산자와 생성자 메서드 호출

=>
객체 : 여기서 book은 객체, 변수.

인스턴스 변수 : book라는 객체가 구체적인 대상체(실체)를 가리킬 때 인스턴스 변수라고 함.

인스턴스가 만들어져야 데이터를 넣고, 빼는게 가능해짐.
그래서 객체 생성 과정을 인스턴스를 만드는 과정이라고 할 수 있음.

DTO : Data Transfer Object
VO : Value Object
  • 현실세계의 객체(책)가 존재한다고 할 때.. 책을 모델링(설계도, 클래스)을 통해 설계.
// 클래스 = 모델링 하는 도구. (클래스로 만든 새로운 자료형 = 바구니 = 이동)
public class BookDTO {
	public String title;
	public int price;
	public String company;
	public int page;
    
	public BookDTO() {
		super();
	}
}
  • 이때 객체를 만들고 어떻게하면 기억공간을 효율적으로 사용할지 고민 필요.

## class, object, instance 상호관계(실습)

package kr.tpc;

public class BookDTO {
	public String title;
	public int price;
	public String company;
	public int page;
	
	// 디폴트 생성자 메서드(생략)
	public BookDTO() {
		// 객체를 생성하는 작업을 한다.(기계어 코드)
		super();
	}

	public BookDTO(String title, int price, String company, int page) {
		this.title = title;
		this.price = price;
		this.company = company;
		this.page = page;
	}
}
import kr.tpc.BookDTO;

public class TPC14 {
	public static void main(String[] args) {
		// 1. 책 이라는 자료를 사용하기위해 클래스로 class(BookDTO) 책구조 설계.
		// 2. 설계한 클래스를 이용 객체, 인스턴스를 만드는 과정 필요.
		
		// 아래는 책이 아닌 책에 대한 내용들을 4개의 변수(개별적인 기억공간)에 책에 대한 정보가 존재하는것 뿐. 
		String title = "스프링";
		int price = 30000;
		String company = "길";
		int page = 300;
		
		
		// 설계 -> 클래스를 이용하여 설계.(DTO or VO)
		// 위와같은 4개의 데이터를 하나의 구조(여러 기억공간이 묶여있는)에 담기 위해서는 해당 구조를 직접 설계하는게 필요.
		BookDTO dto;	// dto(Object : 객체)
		//dto = new BookDTO();	// dto(Instance : 인스턴스 -> 실체를 가리킴.)
		
		//담는방법 1.
		/*
			dto.title = title;
			dto.price = price;
			dto.company = company;
			dto.page = page;
		*/
		
		// 담는방법 2. 생성자 이용.
		dto = new BookDTO(title, price, company, page);
		
		
		// 이동.
		bookPrint(dto);
	}
	
	public static void bookPrint(BookDTO dto) {
		System.out.println(dto.title);
		System.out.println(dto.price);
		System.out.println(dto.company);
		System.out.println(dto.page);
	}
}
반응형
반응형

# 기본 자료형(PDT), 사용자 정의 자료형(UDDT)

## 기본 자료형 (PDT)

  • 컴파일러에서 기본적으로 제공해주는 자료형.
int a;

a는 DataType int 이므로 정수가 들어갈 수 있음.

## 사용자 정의 자료형 (UDDT)

  • 사용자가 직접 만들어서 사용하는 자료형.
BookDTO b;

b는 DataType이 BookDTO로 사용자가 직접 만든 자료형.

class로 새로운 자료형을 만들어야 함.
public class BookDTO {
	public String title;
	public int price;
	public String company;
	public int page;
}
  • 기본 생성자 (default constructor) : 위와 같이 클래스를 설계하게 되면 기본적으로 기본생성자(default constructor)가 들어있음. (생성자 메서드가 해당 클래스가 갖고있는 멤버들(title, price, company, page)을 메모리에 객체로 만드는 역할을 하므로 생성자 메서드는 반드시 있어야 함.)
public BookDTO() {
	super();
}
  • new 연산자 : 객체 생성은 생성자 메서드를 사용하여 생성한다.
BookDTO b = new BookDTO();

## 사용자 정의 자료형(실습)

import kr.tpc.BookDTO;

public class TPC10 {
	public static void main(String[] args) {
		// 기본 자료형 : int, float, char, boolean 등 -> PDT
		int a = 10;
		
		// 사용자 정의 자료형 : 예로 책(BookDTO) 자료형 생성. -> UDDT
		BookDTO b = new BookDTO(); // 객체 생성 : 생성자 메서드 호출하여 객체 생성.
		b.title = "사용자 정의 자료형 책";
		b.price = 15000;
		b.company = "길벗";
		b.page = 300;
		
		System.out.println("== 책(BookDTO) 자료형 ==" 
							+ "\n책명 : " + b.title 
							+ "\n가격 : " + b.price 
							+ "\n출판사명 : " + b.company 
							+ "\n페이지 수 : " + b.page);
	}
}

 

# 객체 생성과정

## 객체 생성과정 (객체가 메모리에 어떻게 만들어지는지.)

  • VO는 Value Object를 의미.
BookVO b = new BookVO();	// new 연산자와 생성자메서드 호출하여 객체 생성.
  • 현실세계에 존재하는 책(Object) 이라는 객체를 프로그램에서 사용하기 위해 객체를 만들기위해서는 상태정보(변수) 와 행위정보 가 필요하다.
  • 상태 정보(변수, attribute, property, member) : 책의 상태정보가 될 만한건 제목, 출판사, 가격, 페이지 수, 저자, 재질 등 존재.
  • 모델링 (Modeling) : 필요한 속성만 뽑아내는 과정
  • 상태정보를 모델링하여 필요한 정보만 간추림 (제목, 출판사, 가격, 페이지 수)
  • 행위 정보(동작, method, 기능(function))

### 클래스 설계

public class BookVO {
	public String title;
	public int price;
	public String company;
	public int page;
}

### 객체생성

  • 클래스를 설계하고 설계한 대로 메모리에 기억공간을 만드는 과정.
  • 아래와 같이 입력하여 생성
BookVO b = new BookVO();	// new 연산자와 생성자메서드 호출
  • 여기서 b는 변수로, 번지값이 들어있다.

### 객체생성 후 접근 방법 ( .(dot) 연산자)

  • dot(.) (접근 연산자, 참조 연산자) : b에 .(dot)연산자를 사용하여 상태정보(변수)에 접근한다. 이때 상태정보가 public인 경우만 접근 가능하다.
b.title = "가나다라 책";
b.price = 15000;
b.company = "길벗";
b.page = 150;
  • 위와같이 객체의 상태정보를 직벚 접근하게 되면 잘못된 데이터가 저장될 수 있다. 그래서 정보은닉(Information Hiding private)이 필요함. (이를 위해서는 상태정보를 public이 아닌 private으로 해야 함.)

## 객체 생성(실습)

package kr.tpc;

// 책(Object) -> 제목, 가격, 출판사, 페이지수
public class BookVO {
	public String title;
	public int price;
	public String company;
	public int page;
	
	// 디폴트 생성자 메서드(생략)
}
import kr.tpc.BookVO;

public class TPC11 {
	public static void main(String[] args) {
		// 책 1권을 저장하기 위한 객체 생성.
		BookVO book1 = new BookVO();
		book1.title = "갓바의 정석1";
		book1.price = 10000;
		book1.company = "길";
		book1.page = 100;
		
		System.out.println("== 책(BookVO) 자료형 ==" 
				+ "\n책명 : " + book1.title 
				+ "\n가격 : " + book1.price 
				+ "\n출판사명 : " + book1.company 
				+ "\n페이지 수 : " + book1.page);
		
		BookVO book2 = new BookVO();
		book2.title = "갓바의 정석2";
		book2.price = 30000;
		book2.company = "길";
		book2.page = 300;
		
		System.out.println("== 책(BookVO) 자료형 ==" 
				+ "\n책명 : " + book2.title 
				+ "\n가격 : " + book2.price 
				+ "\n출판사명 : " + book2.company 
				+ "\n페이지 수 : " + book2.page);
	}
}

 

# 생성자 메서드 (Constructor)

  • 객체를 생성할때 사용되는 메서드
  • 객체 생성 후 객체의 초기화를 하는 역할을 수행한다.
  • 특징은 아래와 같다.
1. 클래스이름과 동일한 메서드
public class BookVO {
	public String title;
	public int price;
	public String company;
	public int page;
    
	public BookVO() {
		super();
	}
}


2. 메서드의 return type이 없다. (void 아님)
public BookVO() {
	super();
}


3. public 접근 권한을 가진다. (단, private 생성자도 있음)
BookVO b = enw BookVO(); 시 BookVO() 호출하기 때문에 public 으로 해야 함. 
(하지만 무조건 public인건 아님.)
public BookVO() {
	super();
}


4. 생성자가 없을 때는 기본 생성자가 만들어진다.)
public BookVO() {
	super();
}
위와 같이 생성자가 없을 시 컴파일러가 기본 생성자(default constructor)를 자동으로 넣어줌.

 

## 객체 초기화

  • 생성자 메서드를 활용하여 객체를 초기화.
  • this : 자기 자신을 가리키는 객체.
  • Overloading Constructor : 초기화를 위해 중복 정의된 생성자
  • 생성자의 가장 큰 역할은 초기화.
public class BookVO {
	public String title;
	public int price;
	public String company;
	public int page;
    
	// 초기화
	public BookVO(String title, int price, String company, int page) {
		this.title = title;
		this.price = price;
		this.company = company;
		this.page = page;
	}
}


BookVO book = new BookVO("갓바의 정석", 30000, "길", 300);	// 초깃값

## 생성자 중복정의(Overloading)

  • 생성자 중복정의란 하나의 메서드 안에 이름이 같은 메서드가 중복정의 되는 것. 객체지향에서 메서드 이름이 같아도 되지만 이 경우 매개변수의 갯수는 달라져야 함.
BookVO book = new BookVO();

BookVO book = new BookVO("갓바의 정석", 30000, "길", 300);
package kr.tpc;

// 책(Object) -> 제목, 가격, 출판사, 페이지수
public class BookVO {
	public String title;
	public int price;
	public String company;
	public int page;
	
	// 디폴트 생성자 메서드(생략)
	public BookVO() {
		this.title = "갓바의정석";
		this.price = 30000;
		this.company = "갓바";
		this.page = 300;
	}
	
	// 생성자 메서드 중복정의(Overloading)
	public BookVO(String title, int price, String company, int page) {
		this.title = title;
		this.price = price;
		this.company = company;
		this.page = page;		
	}
}
  • 만약 아래와 같이 생성자가 한개 존재한다면, 기본 생성자는 만들어지지 않음.
package kr.tpc;

// 책(Object) -> 제목, 가격, 출판사, 페이지수
public class BookVO {
	public String title;
	public int price;
	public String company;
	public int page;

	// 생성자 메서드 중복정의(Overloading)
	public BookVO(String title, int price, String company, int page) {
		this.title = title;
		this.price = price;
		this.company = company;
		this.page = page;		
	}
}

## 생성자(실습)

package kr.tpc;

// 책(Object) -> 제목, 가격, 출판사, 페이지수
public class BookVO {
	public String title;
	public int price;
	public String company;
	public int page;
	
	// 디폴트 생성자 메서드(생략)
	public BookVO() {
		// 초기화 작업. this는 생략 가능하지만, this를 명시해주는게 가독성에 좋음.
		this.title = "갓바의정석";
		this.price = 30000;
		this.company = "갓바";
		this.page = 300;
	}
	
	// 생성자 메서드 중복정의(Overloading)
	public BookVO(String title, int price, String company, int page) {
		this.title = title;
		this.price = price;
		this.company = company;
		this.page = page;		
	}
}
import kr.tpc.BookVO;

public class TPC12 {

	public static void main(String[] args) {
		// 생성자 -> 객체 생성 + 초기화하는 메서드. 생성자는 메서드를 중복정의할 수 있음
		BookVO book1 = new BookVO();
		System.out.println("== 책(BookVO) 자료형 ==\n" 
				+ "책명 : " + book1.title 
				+ "\t가격 : " + book1.price 
				+ "\t출판사명 : " + book1.company 
				+ "\t페이지 수 : " + book1.page);	
		
		// 원하는 값으로 초기화
		BookVO book2 = new BookVO("강산", 10000, "길", 150);
		System.out.println("\n== 책(BookVO) 자료형 ==\n" 
				+ "책명 : " + book2.title 
				+ "\t가격 : " + book2.price 
				+ "\t출판사명 : " + book2.company 
				+ "\t페이지 수 : " + book2.page);	
	}
}
반응형
반응형

# 메서드의 매개변수 전달기법(parameter passing)

## 값 전달 기법 (Call By Value)

  • 기억공간 개별, 값 전달.
int a = 10; int b = 20;
int v = sum(a, b);	// method 호출 부, 여기서 a, b는 값(value), 실 인수

public int sum(int a, int b) {	// method 정의 부, 여기서 a, b는 가 인수
	int v = a + b;
    return v;
}

## 번지전달 기법 (Call By Reference)

  • 기억공간 공유, 번지 전달.
int[] arr = {10, 20, 30};

int v = sum(arr);	// method 호출 부, arr은 번지(reference)

public int sum(int[] a) {	// method 정의 부
	int v = 0;
    for (int i = 0; i < a.length; i++) {
    	v += a[i];
    }
    return v;
}

## 매개변수 전달기법(실습)

public class TPC07 {

	public static void main(String[] args) {
		// 매개변수 전달 관련
		int a = 20;
		float b = 56.7f;
		
		// a + b 계산.
		float v = sum(a, b);	// 값 전달 기법(Call By value)
		System.out.println("sum : " + v);
		
		
		int[] arr = {1, 2, 3, 4};	
		
		int vv = arrSum(arr);	// 번지 전달 기법(Call By Reference)
		System.out.println("arrSum : " + vv);
	}
	
	public static float sum(int a, float b) {
		float v = a + b;
		return v;
	}
	
	public static int arrSum(int[] arr) {
		int sum = 0;
		
		for(int i = 0; i < arr.length; i++) {
			sum += arr[i];
		}
		
		return sum;
	}
}

 

# JVM의 메모리 모델

## JVM Memory Model 1

  • JVM은 가상머신(프로세스)이므로 동작 시 4종류(method Area, stack Area, heap Area, literal Pool)를 이용 프로그램을 동작시킨다.
  • JVM이 class(실행 클래스)를 실행하는 절차는 아래와 같다.
1. 해당 클래스를 현재 디렉토리에서 찾는다. (찾기)

2. 찾은 클래스 내부에 있는 "static 키워드"가 있는 메서드를 메모리로 로딩한다. (로딩)
- method Area의 static zone에 로딩 한다. main(), add() method

3. static zone에서 main() 메서드를 실행한다. (호출, 시작)
- main() method가 호출되면 main() method의 호출정보가 Stack Area에 들어간다. (Push)
- 프로그램이 시작되는 부분이다.

4. Stack Area가 비어 있으면 프로그램이 종료된 것이다.

출처 : 인프런 박매일 Java TPC

  • method Area : Method의 byte code가 저장되는 영역 (static zone, non-static zone 으로 나뉜다.)
  • stack Area : 메서드가 호출되면 메서드의 호출정보가 저장되는 영역 (= Call Stack Frame Area)
  • heap Area : 객체가 생성되는 영역(new 연산자)
  • literal Pool : 문자열(객체)상수가 저장되는 영역

## JVM 메모리 모델1(실습)

public class TPC08 {

	public static void main(String[] args) {
		int a = 30;
		int b = 50;
		
		int v = add(a, b);	// static method call.
		
		System.out.println("sum : " + v);
	}
	
	public static int add(int a, int b) {
		int sum = a + b;
		return sum;
	}

}

## JVM Memory Model 2

  • JVM이 class(실행 클래스)를 실행하는 절차는 아래와 같다.
1. 해당 클래스를 현재 디렉토리에서 찾는다. (찾기)

2. 찾은 클래스 내부에 있는 "static 키워드"가 있는 메서드를 메모리로 로딩한다. (로딩)
- method Area의 static zone에 로딩 한다. main() method

3. static zone에서 main() 메서드를 실행한다. (호출, 시작)
- main() method가 호출되면 main() method의 호출정보가 Stack Area에 들어간다. (Push)
- 프로그램이 시작되는 부분이다.

4. Stack Area가 비어 있으면 프로그램이 종료된 것이다.

출처 : 인프런 박매일 Java TPC

  • method Area : Method의 byte code가 저장되는 영역 (static zone, non-static zone 으로 나뉜다.)
  • stack Area : 메서드가 호출되면 메서드의 호출정보가 저장되는 영역 (= Call Stack Frame Area)
  • heap Area : 객체가 생성되는 영역(new 연산자)
  • literal Pool : 문자열(객체)상수가 저장되는 영역

## JVM 메모리 모델2(실습)

public class TPC09 {

	public static void main(String[] args) {
		int a = 56;
		int b = 60;
		
		// a + b = ?
		TPC09 tpc = new TPC09();	// heap Area(힙 영역)에 객체 생성.
		int sum = tpc.sum(a, b);
		System.out.println("sum : " + sum);
	}

	public int sum(int a, int b) {
		int sum = a + b;
		return sum;
	}
}
반응형

+ Recent posts