[자바프로그램이 실행되는 전체적인 흐름]

- C언어는 바로 OS를 통해 하드웨어의 메모리 공간을 할당받는다.

- 자바JVM을 거쳐 OS를 통해 하드웨어의 메모리 공간을 할당 받는다.

 

  *C언어에서는 개발자가 임시로 저장했던 문자열, 배열 공간을 일일히 해제해준다.

   이걸 안 하면, 컴퓨터에 찌꺼기들(쓰레기라고도 한다)이 남아서 디스크 정리를 해줘야한다.

  *자바는 JVM의 가비지 컬렉터가 있어서 임시로 저장했던 배열, 객체 공간을 알아서 해제한다.

   대신, 가비지컬렉터의 인터셉트로 인해 속도는 그만큼 C언어보다 느리다.

 

[변수의 기본타입과 참조타입]

- 변수는 하나의 값을 저장할 수 있는 메모리 공간을 말한다.

- 변수의 타입은 기본타입과 참조타입으로 나뉠 수 있는데,

   기본타입은 기본형 값을 저장하고, 참조타입은 객체나 배열의 주소값(16진수)을 저장한다.

 

[JVM(이 빌려온) 메모리 공간 ]

** 수정되어야할 부분 체크 : 아래 그림에서 상수풀은 현재 힙 영역에 있습니다. 

- 크게 세 가지 영역, 메소드 영역, 스택 영역, 힙 영역이 있다.

- 메소드 영역에서는 프로그램이 시작할 때 정적필드/상수, static초기화블럭/static메소드 코드가 적재되며, 객체가 생성될 때마다 instance초기화블럭/instance생성자/instance메소드가 적재된다.

  *Simple Mind : 자주쓰는 데이터를 미리 축척하거나, 필요할 때 함수식을 꺼내 올려두는 사전 작업소

- 스택 영역에서는 main함수부터 시작해서 함수LIFO(Last in First Out) 형태로 차곡차곡 호출되고(push in) 나간다(pop out)

  *Simple Mind : 함수를 하나씩 실행하는 실질 작업소

- 힙 영역에서는 main함수 또는 그 함수가 호출한 다른 함수들에서 배열 또는 객체를 생성하라 명령할 때, 임시 공간에 명령에 따라 데이터를 저장한다.

  *Simple Mind : 객체와 배열의 데이터를 저장하는 임시 저장 공간

 

[프로그램이 실제로 구동되는 과정_예시) 게임 프로그램을 실행했을 때]

 

[전체 이미지 다운로드]

- 위 내용의 전체구조도 이미지.

- 다운 필요하면 아래의 PDF파일 다운 받아 사용하셔도 됩니다.

정리_메모리_배열.pdf
0.13MB

 

 

[참조]

- 블로그

  자바(Java) - 참조타입과 참조변수1 https://dustink.tistory.com/31

  IT관련 용어 [OS]란 무엇인가?

  https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=pst8627&logNo=221663921157 

- 그 외 ) 국비 지원과정 수업 내용 참조

1. 문자열을 정수형을 바꾸는 법 _ 변수타입.parse변수타입();

Boolean.parseBoolean(String s)
Byte.parseByte(String s)
Short.parseShort(String s)
Integer.parseInt(String s)
Long.parseLong(String s)
Float.parseFloat(String s)
Double.parseDouble(String s)

 

package test;

public class TypeTest {

	public static void main(String[] args) {
		String home_addr = "01002";
		int addr = Integer.parseInt(home_addr);
		System.out.printf("HOME ADDRESS : %d",addr);
	}

}

>> 결과

HOME ADDRESS : 1002

※ 앞의 0이 사라지는 걸 볼 수 있다. 0은 정수형 타입으로 변환될 때 삭제되기 때문. 

 

2. 정수형을 문자열로 바꾸는 법 _ String.valueOf(   ); 

package test;

public class TypeTest2 {

	public static void main(String[] args) {
		int addr = 10002; //만약 01002를 적으면 이건 십진수가 아님
		String home_addr = String.valueOf(addr);
		System.out.println("HOME ADDRESS : "+home_addr);
	}

}

>> 결과

HOME ADDRESS : 10002

 

3. 문자타입의 숫자를 정수타입의 숫자로 바꾸는 법_  '9' - '0'

package test;

public class TypeTest4 {

	public static void main(String[] args) {
    	//문자를 숫자로
		char initial = '9';
		int change = initial - '0';
		System.out.println(change);
	}

}

>> 결과

9

 

4. 정수타입의 숫자를 문자타입으로 바꾸는 법_ 9 + '0'

package test;

public class TypeTest3 {

	public static void main(String[] args) {
		//숫자를 문자로
		int initial = 9;
		char change = (char)(initial + '0');
		System.out.println(change);
	}

}

>> 결과

9

 

[Vector 클래스]

**Vector보다는 ArrayList를 쓰는 것이 좋다. 

**why? 버전이 업되면서 개선된 것이 ArrayList이기 때문에. 가급적 ArrayList를 쓰는 편이 좋다.

메서드/생성자 설명
Vector() 10개의 객체를 저장할 수 있는 Vector인스턴스 생성
*10개 이상의 인스턴스 저장 시, 자동으로 크기 증가
boolean add(Object o) Vector에 객체를 추가 *추가에 성공하면 true, 실패하면 false를 반환
boolean remove(Object o) Vector에 저장된 객체를 제거 *제거 후 Vector에 객체가 없으면 true, 있으면 false반환
boolean isEmpty() Vecotor가 비어 있는지 검사 
Object get(int index) index위치의 객체 주소 반환 
int size() Vecotor에 저장된 객체의 갯수 반환
package mymain;

import java.util.Vector;

public class VectorTest {

	public static void main(String[] args) {
		/*
		Product[] item = new Product[3];
		item[0] = new Tv();
		item[1] = new Audio();
		item[2] = new Computer();
		//AirConditioner를 넣을 공간이 없다.
		*/
		Vector<Product> item = new Vector<Product>(); //Product타입의 10개의 배열
		item.add(new Tv()); //순서대로 item[0] = new Tv();
		item.add(new Tv());
		item.add(new AirConditioner());
		item.add(new Computer());
		item.add(new Audio());
		System.out.println(item.get(0).toString());
		System.out.println(item.get(1).toString());
		System.out.println(item.get(2).toString());
		System.out.println(item.get(3).toString());
		System.out.println(item.get(4).toString());
		item.remove(item.get(1)); //삭제하면 빈 곳으로 객체주소 한칸씩 이동
		System.out.println("--------------------");
		System.out.println(item.get(0).toString());
		System.out.println(item.get(1).toString());
		System.out.println(item.get(2).toString());
		System.out.println(item.get(3).toString()); //4를 얻으려하면 에러 발생
		System.out.println("--------------------");
		System.out.println("item isEmpty? : "+item.isEmpty());
		System.out.println("--------------------");
		System.out.println("item 갯수 : "+item.size());
	}

}

class Product{}
class Tv extends Product{
	public String toString() {return "Tv";}
}
class Audio extends Product{
	public String toString() {return "Audio";}
}
class Computer extends Product{
	public String toString() {return "Computer";}
}
class AirConditioner extends Product{
	public String toString() {return "AirConditioner";}
}

>> 결과

Tv
Tv
AirConditioner
Computer
Audio
--------------------
Tv
AirConditioner
Computer
Audio
--------------------
item isEmpty? : false
--------------------
item 갯수 : 4

[ Single-ton 의 원리]

- 프로그램이 시작되었을 때 클래스변수, 클래스메서드가 메서드영역(클래스영역)에 적재되는 것을 응용
- 단순히 기능만 제공하는 서비스 객체(클래스)인스턴스반복적으로 생성해야할 때,
메모리의 불필요한 사용을 줄이고자 싱글톤을 사용한다.

<일상생활을 예로 이해하기 - 못 박기>

10번 못을 박기 위해,
1) 철물점에 가서 망치를 산다 -> 2) 못을 박는다.
2) 철물점에 가서 망치를 산다 -> 2) 못을 박는다.
3) 철물점에 가서....
x 10
-> 10번 못을 박기 위해,
1) 철물점에 가서 망치를 산다. -> 2) 못을 박는다.
1) 이미 사둔 망치를 또 쓰자 -> 2) 못을 박는다.
.......
x10


▼ 그림으로 표현한 싱글톤 원리


[예제_망치로 못을 박기]

package myutil;

public class MySingleTonTest {

	public static void main(String[] args) {
		int times = 10;
		for(int i = 0; i < times; i++) {
			Hammer hammer = Hammer.getInstance();
			hammer.nail();
		}
	}
	
}

class Hammer{
	public static Hammer single;
	
	protected Hammer(){}
	
	public static Hammer getInstance() {
		if(single == null) {
			single = new Hammer();
		}
		return single;
	} 
	
	public void nail() {
		System.out.println("못!");
	}
}

>> 결과

못!
못!
못!
못!
못!
못!
못!
못!
못!
못!


[ 자세한 내용 참조 링크 ]
https://velog.io/@kyle/%EC%9E%90%EB%B0%94-%EC%8B%B1%EA%B8%80%ED%86%A4-%ED%8C%A8%ED%84%B4-Singleton-Pattern

[참고]
국비과정 수업 내용참조

이클립스에서 패키지를 .jar로 내보내고 가져오기

[1] 패키지를 .jar형태로 Export 하기

내보내고 싶은 패키지를 선택하고 우측마우스&amp;gt;Export
JAR file은 .jar 라이브러리형식으로 내보내겠다는 의미다.
[1] 내보낼 패키지와 패키지 내 파일들 선택 [2] export할 장소 지정(여기에 저장된다)

 

[2] 내장된 .jar 가져오기

PATH를 지정해서, 지정된 경로에 있는 라이브러리를 가져오겠다는 의미

 

[3] 이제 사용가능한지 볼까?

** 어라? 소스코드를 볼 수 없다네. 왤까?

앞에서 export할 때, 소스코드도 같이 내보내겠다고 설정하지 않아서다.

>> 해결하는 법 : .jar 삭제하고 다시 export하자

 

[4] 코드 돌려보기 

잘 된다.

+ Recent posts