Stack 메모리의 영역

 

※ 스택 프레임(Stack Frame)

  • 하나의 메서드를 호출하는데 필요한 메모리덩어리
  • 메서드 하나당 하나의 스택 프레임이 존재

: 하나의 메서드에 필요한 메모리 덩어리를 묶어서 스택 프레임(Stack Frame)이라고 한다.

 하나의 메서드당 하나의 스택 프레임이 필요하며, 메서드를 호출하기 직전 스택프레임을 자바 Stack에 생성한 후 메서드를 호출하게 된다. Stack 메모리는 메서드가 사용하는 메서드 전용메모리이며, 메서드들은 각각의 메서드에서 사용하는 메모리를 스택 프레임 형태로 만드는 것이다.


스택 프레임의 구성요소

  • 지역변수
  • 매개변수
  • 리턴값을 위한 공간 

『 메서드가 호출될 때마다 하나의 스택 프레임이 만들어지며 메서드의 호출이 끝나면 자동으로 스택 프레임은 제거된다.

 

Ex)

/*

 스택 프레임 실습을 위한 예제

*/

public class StackMain {

public static int sum(int a, int b){

        int c = a + b;

        return c;

}


public static void main(String[] args){

         int x=10;

        int y=20;

        int z = sum(x, y);

                          

        System.out.println(z);

}

}

 


l  sum()의 스택 프레임의 구성

n  int a;

n  int b;

n  int c;

n  return value;

 

l  main()의 스택 프레임의 구성

n  int x;

n  int y;

n  int z;

n  String[] args



 

스택 메모리 영역

 

sum()  스택 프레임

return value

int c

int b

int a

 

 

 

main() 스택 프레임

String[] args

int z

int y

int x












Heap 메모리의 영역

 

Ex)

/*

     힙메모리의 개념을 이해하기 위한 예제

*/

class Top {

     public int a = 10;

     public int b = 20;

     public int c = 30;

     public int sum(){

          int d = a + b + c;

          return d;

     }

}

public class HeamMain {

     public static void main(String[] args){

          Top t = new Top();

          Top s = new Top();

          s.a=1;

          s.b=2;

          s.c=3;

          int x = t.sum();

          int y = s.sum();

          System.out.println(x);

          System.out.println(y);

}

}


Heap 메모리 영역

a=10

b=20

c=30

 

a=1

b=2

c=3



스택 프레임

String[] args

int y

int x

Top s

Top t



위의 예제에서 참조 변수인 t s 스택 프레임에 생성되기 때문에 스택 메모리를 사용한다. 여기서 스택에 생성되는 t s 메모리는 참조값 자체를 저장하기 위한 메모리이다. new Top() 했을 생성되는 Top형에 대한 메모리는 힙영역에 생성된다.



반응형
블로그 이미지

아쭝구리

,

스태틱(static)



※ Static 멤버 변수

-  객체를 계속 생성하더라도 스태틱 변수는 오직 하나의 메모리만 생성

 

: static 키워드는 스태틱 멤버 변수(static Member Variable)의 개념을 논하지 않고서는 설명이 불가능하다. 예를 들어보자. 6개의 멤버 변수를 가지고 있는 클래스가 있다고 가정하고,  new 연산자를 이용해서 10개의 객체를 생성한다면 내부의 멤버 6개가 한 세트씩 10세트가 만들어진다.

하지만 멤버 필드 중에 static  키워드를 달고 있는 놈이 하나 있다면 전체 멤버 6개 중에서  5개는 하나의 묶음으로 만들어지며 static이 붙어 있는 스태틱 멤버 변수는 생성된 모든 객체들이 공유하는 형식을 사용한다.

 


Ex)

/*

     static 멤버 필드를 테스트하는 예제

*/

public class StaticConcept {

      //static 멤버 변수 s 하나의 메모리만 생성하기 때문에

      //어느 곳에서 값을 바꾸든 하나의 메모리를 상대하는 것이 된다.

      public static int s//스태틱 멤버 변수 선언

     

      public  int a;

      public  int b;

      public  int c;

      public  int d;

      public  int e;

     

      public static void main(String[] args) {

            StaticConcept st1 = new StaticConcept();

            StaticConcept st2 = new StaticConcept();

            StaticConcept st3 = new StaticConcept();

            //멤버 변수에 데이터 할당

                     st1.s = 1; st1.a = 1; st1.b = 2; st1.c = 3;

                     st1.d = 4; st1.e = 5;

                     st2.s = 10; st2.a = 10; st2.b = 20; st2.c = 30;

                     st2.d = 40; st2.e = 50;

                     st3.s = 100; st3.a = 100; st3.b = 200; st3.c = 300;

                     st3.d = 400; st3.e = 500;

                     //멤버 변수의 데이터 출력

                     System.out.println("st1:" + st1.s + ", " + st1.a + ", " + st1.b);

                     System.out.println(", " + st1.c + ", " + st1.d + ", " + st1.e);

                     System.out.println("st2:" + st2.s + ", " + st2.a + ", " + st2.b);

                     System.out.println(", " + st2.c + ", " + st2.d + ", " + st2.e);

                     System.out.println("st3:" + st3.s + ", " + st3.a + ", " + st3.b);

                     System.out.println(", " + st3.c + ", " + st3.d + ", " + st3.e);

      }

}

 

: 위의 예제에서 StaticConcept형의 객체 3개를 생성한 각각의 멤버에 값을 할당하지만 스태틱멤버는 값이 전부 똑같다. 일반 멤버 변수의 메모리는 따로 생성되지만 스태틱 멤버 변수의 메모리는 하나만 생성된 공유하기 때문에 변수 s 값이 모든 객체에서 동일하게 출력되는 것이다.

결론 적으로 보면 하나의 메모리를 3개의 객체가 공유하고 있는 것이다. 공유 메모리의 성격을 띄고 있음을 알수 있다.

 

/*

 * 스태틱 멤버 변수를 테스트하는 예제

 */

public class HelloCount {

      //sCount 값은 단한번만 초기화

      private static int sCount = 0;

      //nCount 값은 객체를 생성할 때마다 초기화

     

      private int nCount = 0;

     

      public void sayHello(){

            sCount = sCount + 1;

            nCount = nCount + 1;

            System.out.println("전체:" + sCount + "번재 인사를 합니다. hello!");

            System.out.println(this + " "nCount + "번재 인사를 합니다. Hi!");

      }

     

      public static void main(String[] args){

            HelloCount h1 = new HelloCount();

            HelloCount h2 = new HelloCount();

            //h1 2 인사

            System.out.println(h1 + " 인사");

            h1.sayHello();

            h1.sayHello();

            System.out.println();   //단순히 다음 라인으로 보내기 위해서 호출

            //h2 3 인사

            System.out.println(h2 + " 인사");

            h2.sayHello();

            h2.sayHello();

            h2.sayHello();

            //전체는 5번 인사

           

      }

}

 

일반 멤버변수는 객체가 생성될 때마다 메모리가 생성되며, 생성되자마자 0으로 초기화 된다. 그렇기 때문에 객체 자신의 sayHello()를 호출할 횟수를 알 수 없다. 이에 반해 스태틱 멤버는 메모리가 하나만 생성되기 때문에 전체 sayHello()가 몇 번 호출되는지 알 수 있다.

 

static 멤버변수는 클래스 내에 있는 멤버이다. 그리고 static 멤버도 private public의 법칙은 완변하게 지킨다. 메모리가 하나만 생성되고 전체가 공유하는 공유 메모리라고 해서 스태틱멤버에 마음대로 접근할 수 있는 것은 아니다.  private static 멤버인 경우에는 public 메소드를 통해서만 접근할 수 있다.

 

public class StaticTime {

      public static int special = 2000;

     

      public static void main(String[] args){

            System.out.println("객체 생성 접근 - StaticTime.special:");

            //객체생성이전에 클래스 이름으로 스태틱에 접근할 있다.

           

            System.out.println(StaticTime.special);

           

            //객체의 이름을 이용해서 스태틱에 접급할 수있다.

           

            StaticTime s = new StaticTime();

            s.special = 4000;

           

           

            System.out.println("객체 생성 접근- s.special:" + s.special);

            System.out.println("객체 생성 접근 - StaticTime.special:");

            System.out.println(StaticTime.special);

      }

}

 

객체를 생성하기 전에 클래스이름으로 접근한다는 사실은 객체를 생성하기도 전에 이미 메모리가 만들어져 있다는 것을 말해준다.

 

/*

 *    스태틱 멤버 메서드에서 일반 멤버 변수를 사용하는 (에러)

 */

public class StaticErr {

      private  int s;  

      //스태틱 멤버 메서드에서 일반 멤버 변수 사용(애러)

      public static void printStaticData(){

            //System.out.println(s); //에러

           

      }

      public static void main(String[] args){

            StaticErr.printStaticData();

      }

}

 

위의 예제에서는 스태틱 멤버 메서드 printStaticData()라는 메소드에서 일반 멤버 변수 s 사용했기 때문에 컴파일조차 못하고 있다.

위의 일반변수를 static으로 수정하면 컴파일이 될것이다.

 

-      스태틱은 스태틱끼리 동작한다.’라고 생각하면 된다. 당연히 메모리가 생성되기도 전에 스태틱메서드를 호출할 수 잇기 때문에 메모리가 생성되지도 않은 일반 멤버변수를 스태틱 메서드에서 사용할 수 없는 것이다




2020/11/11 - [개발/자바] - JAVA 기초3 - 접근제어


반응형
블로그 이미지

아쭝구리

,



※ 메뉴바 > Help > Eclipse Marketplace에서 검색해서 설치

※ Eclipse Marketplace 없을 경우 Install New Software에서 URL로 검색해서 설치


1. Properties Editor or Simple Properties Editor

 : Properties 파일을 기본 에디터로 열어보면 한글이 깨져보이거나 유니코드로 표시될때 

  주로 위 플러그인을 사용


 URL 설치 : https://osdn.net/projects/propedit/storage/eclipse/updates/


 

2. MyBatipse

: Mybatis를 사용하는 경우 Mapper 또는 Dao에서 Sql쿼리가 작성된 xml로 바로 접근 

  • XML 쿼리문 바로접근 (단축키 CTRL+ CLICK)
  • XML 쿼리 Class명 자동완성 

URL 설치 : http://dl.bintray.com/harawata/eclipse 



3. AnyEditTools  

: 주로 CamelCase 표기법으로 변경할때 주로 사용

  •  소문자 - Ctrl+Alt+L (Lower Case)
  •  대문자 - Ctrl+Alt+U (Upper Case)
  •  카멜 - Ctrl+Alt+K
  •  Window > Preferences > General > Keys에서 AniEdit 검색 > 단축키 확인 및 설정


4. StartExplore

: 주로 선택된 항목에 윈도우탐색기 실행으로 주로 사용


URL 설치 : http://startexplorer.sourceforge.net/update/

  • Show in file Manager : 윈도우 탐색기실행
  • Start Shell here : 명령 프롬프트 실행
  • Open files default application : 기본 에디터 실행
  • Copy resource path to clipboard : 경로 복사
  • Custom Commands : 사용자 지정 명령 실행


5. Quick Search for Eclipse

: 이클립스 빠른검색 플러그인이다. Ctrl+H 단축키를 이용해서 원하는 정보를 찾을 수 있지만 이 플러그인을 사용하면 프로젝트 단위에 전체파일 내용을 쉽게 검색할수 있으며, 잘사용한다면 개발 생산성이 높아지는 장점이 있다. 

(단축키 Ctrl + Shift + L)



6. Insta Search

: 기본적으로 Ctrl+H 파일검색과 사용법은 같다. 플러그인 설치시 Insta Search 탭이 추가되며 인덱싱 처리가 되어 빠른 검색이 가능한 장점이 있다.



※ 이클립스 자주사용하는 단축키


F11 : 디버그 모드로 실행(Debug)

F5  : 디버깅시 선택된 행의 메소드 내부로 이동

F6 : 디버깅시 선택된 행의 아래로 이동

F7 : 디버깅시 실행중인 메소드 외부로 이동

F8 : 디버깅시 다음 디버그 포인트로 이동


Ctrl + F11 : 실행모드로 실행(Run)


Ctrl + Shift + F : 코드 형식 정리

Ctrl + Shift + O : import 자동 추가/ 삭제


Ctrl + Shift + X : 대문자로 변환

Ctrl + Shift + Y : 소문자로 변환


Ctrl + Shift + L : 프로젝트내 문자열 검색

Ctrl + Shift + R : 파일(클래스 포함) 찾기


Ctrl + Shift + C : 한줄 주석(//) 처리 또는 해제

Ctrl + Shift + / : 블록 주석(/* */) 처리 또는 해제


Ctrl + D : 한 줄 삭제

Ctrl + F : 파일 내 문자열 찾기(Find/Replace 다이얼로그)

Ctrl + H : 문자열 찾기 (Search 다이얼로그)

Ctrl + M : 콘솔에 대고 단축키 실행시 전체화면으로 보기


Ctrl + Space : 코드 자동 완성



반응형
블로그 이미지

아쭝구리

,

접근제어


접근제어란?

: 메모리를 보유한 객체를 이용해서 멤버에 점(.)찍고 접근할 수 있는지 없는지를 결정한다.


접근제어의 종류

  • 객체를 이용한 멤버의 접근제어
  • 상속관계에서 상위 클래스와 하위 클래스간의 접근제어


접근 지정자(Access Identifier)의 종류

  •  private

  •  public

  •  protected

멤버 변수나 메서드가 public으로 설정되어 있으면, 메모리를 보유한 객체에서 점(.)을 찍고 접근할 수 있다. 그러나 private으로 설정되어 있으면 점(.)을 찍고 접근할 수 없다.


/*

 * public, private 접근 테스트

 */

public class MemberVo {

public String id;

public String name;

private String password;     

}


public class Main {

           public static void main(String[] args){

MemberVo vo=  new MemberVo ();

vo.id = "testUser01";     // public 멤버접근

vo.name"홍길동";     // public 멤버접근

vo.password = "홍길동:"  // private 멤버접근 에러   

           }

}


private에 접근하는 방법

  • public 멤버 메서드의 매개변수를 통해서 private 멤버에 값을 할당

  • public 멤버 메서드의 리턴(Return)을 통해서 private 멤버의 값 내보내기

☞ eclipse(STS,egovFramework) 메뉴에서 source à generate getters and setters.. 

(단축키 ALT+SHIFT+S+R)를 통해서 private로 선언된 멤버변수에 getters setters를 생성할 수 있습니다.


public class MemberVo {

private String password;     


public String getPassword() {                  // private에 접근하는 public 메소드

// return을 이용해서 외부로 값을 노출

return password

public void setPassword(String password) {     // private에 접근하는 public 메소드

// 매개변수의 값을 멤버 변수로 값복사

this.password = password

}  

}


private 멤버변수의 사용

  • 자료보호
  • 내부적 사용



2020/11/11 - [개발/자바] - JAVA 기초2 - 자바 프로그램의 실행구조와 JVM



반응형
블로그 이미지

아쭝구리

,


자바 프로그램의 실행구조와 JVM



☞ 일반적인 프로그램의 실행구조

하드웨어 > 운영체제 > 프로그램

: 하드웨어를 기반으로 운영체제가 동작하고 그위에서 프로그램이 실행되는 구조이다.


☞ 자바 프로그램의 실행구조

하드웨어 > 운영체제 > 가상머신 > 자바프로그램


일반적인 프로그램실행 구조와 차이점은 운영체제와 자바프로그램 사이의 자바가상머신이 존재한다는 점이다. 운영체제는 자바 가상머신을 실행시키고 자바 가상머신은 자바프로그램을 실행시키는 구조이다.

자바 가상머신도 운영체제 위에서 동작하는 일종의 소프트웨어이다.. 그렇다면 왜? 자바프로그램은 운영체제가 직접 실행을 시키는 구조가 아닌, 자바 가상머신에 의해서 실행되는 구조로 설계된 것인가? 이는 자바프로그램을 운영체제에 상관없이 실행시키기 위함입니다.


Java Program

< 동일 프로그램 >

Java Program

Windows JVM

< 서로 다른 JVM>

Linux JVM

Windows

<서로 다른 OS>

Linux

hardware

hardware


JVM(Java Virtual Machine, 자바 가상 머신)

: JVM은 메모리 상에만 존재하는 가상컴퓨터이다. 자바의 소스 코드를 컴파일 하게 되면 바이트코드로 변환되는데 JVM은 이러한 바이트 코드를 읽어서 실행할 수 있도록 해주는 도구이다. 바이트코드를 해석한 JVM은 그 내용을 자신의 각 메모리에 배치시키게 된다.


스택영역(Runtime Stack)

: 바이트 코드를 읽어 이곳에서 자바의 로컬(Local) 변수(Variable)를 할당시킨다. 해당 변수들은 그것이 선언된 블록의 영역을 벗어나는 순간 메모리가 소멸되며 각 공간은 자동으로 초기화 되지 않기 때문에 사용 시에는 반드시 초기화 작업을 하여야 한다.

- 지역변수가 할당되면 메모리가 뒤에서 앞으로 할당, 앞에서 뒤로 소멸된다.

- 자동초기화가 되지않는다.


동적 할당 메모리 영역(Garbage Collection Heap)

: 배열로 만들어진 연속된 공간들이나 클래스에 포함된 멤버를 할당하는 영역으로 Garbage 컬렉터에 의해 관리된다.

모든 영역은 초기화가 디폴트(Default)로 되기 때문에 특별한 초기화 과정 없이도 사용할 수 있다.


상수 메소드 영역

: 고정 데이터를 가진 상수나 추상화 형식을 지닌 메서드(Method)의 경우 해당 내용을 기억해 두어야 할 필요성 때문에 만들어진 영역으로 실행 시에 위치 값을 가지게 된다. 따라서 그 위치가 조건에 의해 결정되는 것이 아니므로 외부에서 쉽게 경로를 파악할 수 없어 해킹으로부터 안정적이다.

- 프로그램 시작시 할당되면 종료시 소멸


Register 영역(Process Register)

JVM이 실행하면서 필요한 부분의 주소를 기억해 두는 곳으로 각 영역에 연결되어 프로세서가 작동할 때 여기에 등록된 내용을 기초로 실행된다.



2020/11/11 - [개발/자바] - JAVA 기초1 - 객체지향 특징 및 기본데이터 타입


반응형
블로그 이미지

아쭝구리

,