1.코드

package java01.test31;

public class Test31 {

 public static void main(String[] args) {
  
  Calculator c1 = new Calculator();
  Calculator c2 = new Calculator();
  
  c1.plus(10);
  c2.plus(5);
 }

}

public Calculator{

   private int result; 

 

   public void plus(int value){

      this.result += value;

   }

}

 

 

2. 실행순서

JVM2.pptx

 


3. JVM 구조

  • 나중에 주소 첨부


'개발 > Java' 카테고리의 다른 글

[JAVA] static  (0) 2017.01.02
[JAVA] import  (0) 2017.01.01
[JAVA] Class(클래스)  (0) 2017.01.01
[JAVA] Tip. 코드를 보고 알아보는 if문의 효율정리  (0) 2017.01.01
[JAVA] 제어문 VS 반복문  (0) 2017.01.01

---------------------------------------------------------------------------------------------------

변수의 static과 메소드의 static은 다르다!!!

---------------------------------------------------------------------------------------------------

 

1. 변수의 static

  • "변수를 저장하는 방법을 static이다" 라는 것!
  • 즉, stack의 영역에 저장되어 메소드가 끝이나면 사라지는 변수가 아니라
  • method area 영역에 저장되어 메소드가 끝이나더라도 사라지지 않는 변수의 특성을 말한다.
  • static 공통적으로 같은 값을 갖고 있고 수정의 필요가 없을 때 사용하므로 ​보통 final과 함께 쓰이는 경우가 많다.


 1.1 장점​

  • static 키워드를 붙이면 자바는 메모리 할당을 딱 한번만 하게 되어 메모리가 절약된다.
  • heap영역이 아니므로 가비지 컬렉터가 수거하지 않고 계속 메모리에 남아있다.
  • stack영역이 아니므로 class 또는 instance가 끝남과 동시에 메모리에서 사라지지 않는다.

 

1.2 단점

  • 메모리가 계속 남아있으므로 잘못사용할 시, 메모리가 낭비될 수 있다.

 

1.3 언제 사용하는가?

  • 여러개의 인스턴스가 동일한 값을 저장하는 변수를 갖고 있을 때, static으로 저장한다.


ex) 계산기를 만드는 클래스 Calurlator가 있다면, 각각의 결과값을 저장하는 result라는 변수는 static이 필요하지 않지만,

만약 모든 계산기의 이름이 "카*오"라는 이름을 갖고 있는 것을 저장한다면 static을 이용하여 method area에 저장한다. 

1) 그냥 선언할 경우

2) static으로 선언할 경우

public class Test{

   class Calulator{

      int result;

     String calName = "카*오";

   

      void plus(int value){  

         this.result += value;

      }

  }

   public static void main(String[] args){

      Calulator c1 = new Calculator();

      Calulator c2 = new Calculator();

   }

}

 

public class Test{

   class Calulator{

      int result;

     static String calName = "카*오";

   

      void plus(int value){  

         this.result += value;

      }

  }

   public static void main(String[] args){

      Calulator c1 = new Calculator();

      Calulator c2 = new Calculator();

   }

}

 Calulator로 인스턴스를 만들때마다 heap 영역에 calName이라는 공간이 쌓이게 된다. 만약 Calulator 인스턴스를 100개를 만든다면 100개의 "카*오"라는 동일한 값을 갖는 calName이 생긴다는 것이다

=> 메모리낭비

 claName을 static로 선언했으므로 method area영역에 한번만 메모리가 생성되고 만약 Calulator 인스턴스를 100개를 만든다면 하나의 calName을 서로 공유하게 된다

=> 메모리 효율적 관리 가능 

 

 

 

2. 메소드의 static

  • 메소드의 static은 어떻게 호출할 것인가 방법에 대한 것.
  • 즉, 함수 호출시 클래스로 호출할 것인가 아니면 인스턴스로 호출할 것인가에 문제
  • static 메소드의 변수는 메소드가 호출되지 않아도 method area영역에 변수의 메모리가 생성된다.
  • static메소드는 메소드를 호출하지 않아도 static 메소드안의 변수와 메소드가 JVM에 올라간다.
  • staic이 붙지 않는다면 instance method​

 

2.1 언제 사용하는가?

 1) 그냥 선언할 경우

 2) static으로 선언할 경우

public class NomalTest{

   public void printTest(){  

         System.out.println("Instance Method");

    } 

}

-----------------------------------------------------------

public class Test{

   public static void main(String[] args){

      NomalTestc1 = new NomalTest(); //객체 생성

      n1.printTest();

}

 public class StaticTest{

   public static void printTest(){  

         System.out.println("Static Method");

    } 

}

-----------------------------------------------------------

public class Test{

   public static void main(String[] args){

       StaticTest.printTest();

   }

}

  •  class이름으로 호출불가!
  • 인스턴스 이름으로 호출하여야함
  • plus함수 호출시 호출한 객체의 시작변수를 담고있는         히든변수 this가 생성됨
  • StaticTest.printTest();로 호출가능
  • "new"를 통해 객체 생성 필요X

 

* 2)번 보다는 1)번을 선호한다.

* .java 파일에서 .class로 컴파일 될 때, static 메소드들은 먼저  method area 메모리에 적재된다. 따라서 불필요한 method에 static을 붙일경우,

  불필요한 메모리 낭비가 일어날 수 있다.

 

 

2.2 main은 왜 반드시 static일까?

main method를 호출하는 명령어는 누구도 존재하지 않는다. 때문에 호출되지 않고도 변수와 method가 JVM에 위치하게 하려면 static이여야 하는 것이다.(static메소드는 메소드를 호출하지 않아도 static 메소드안의 변수와 메소드가  JVM에 생성되므로)
=> 따라서, main은 static을 쓴다!!

 

그렇다면 다른 method도 전부 static으로 하면 편하지 않을까?

아니다!! 만약, 다른 함수들도 static으로 선언된다면, 모든 method의 변수가 전부 다 JVM에 쌓이고 상주하므로 overflow가 발생하게 된다.

 

따라서, 적시적소에 static을 붙이는 것이 중요하다.   

 

 

3. static block

  • 클래스가 로딩된 후 클래스 변수를 초기화 하는 용도로 사용
  • 클래스 로딩은 단 한 번만 이루어지므로 static 블럭도 단 한번도 실행된다.
  • 실행순서: ​클래스 로딩 -> 클래스 변수 준비 -> static block 실행

 

3.1 쉬운 satic block 예시

< 예제코드 >

 public class Test45 {
   public static void main(String[] args) {
   
   System.out.println("클래스는 언제 로딩될까? => 1");
   ClassA obj1;
   System.out.println("클래스는 언제 로딩될까? => 2"); 
  

   //아래의 출력결과를 보면 1, 2사이에 클래스 로딩되었으므로 new를 하려고 할 때 해당 클래스가 없다면 로딩되는 것을 알 수 있다.
   obj1 = new ClassA();     
   System.out.println("클래스는 언제 로딩될까? => 3");
  
   System.out.println(ClassA.value);
 }
}

 public class ClassA {
   static int value = 100;
 
   static{
      System.out.println("ClassA의 static 블럭실행");
      value = 200;
   }
   static{
      System.out.println("static 블럭이 여러개일 경우 순차적으로 실행");
   }
}

 

< 출력결과 >

 클래스는 언제 로딩될까? => 1
 클래스는 언제 로딩될까? => 2
 ClassA의 static 블럭실행
 static 블럭이 여러개일 경우 순차적으로 실행
 클래스는 언제 로딩될까? => 3
 200 

 


4. 첨부

JVM.pptx


1. 다른 패키지의 클래스를 사용하는 방법

1.1 사용 할 때에 패키지 명시

public class Test{

   public static void main(String[] args){ 

       java.util.ArrayList list = new java.util.ArrayList

   }

}

 

1.2 import 사용

import java.util.ArrayList

 

public class Test{

   public static void main(String[] args){

        ArrayList list = new ArrayList();

   }

}

 * import java.util.* 로 하여 전부다 패키지를 불러오는 것보단 위의 방법으로 클래스이름까지 명확히 명시해주는 것이좋다

 * 정확히 명시해 줌으로써 패키지 전체를 뒤지지 않아도 되기 때문에 컴파일 속도가 빠르다

 * 후에 유지보수 할때에도 정확히 명시해주는 것이 소스코드를 해석하는데 도움이 된다.

 * 컴파일 하고 나서는 import문은 사라지므로, 크기의 걱정은 필요없다.

 

 

2. import 사용이유

  • 1.1 로 할경우에는 매번 쓸때마다 적어야 하므로 코드가 길어지고 복잡해진다.
  • 반면에, 1.2(import 사용)의 경우 한번만 선언하고 앞부분을 생략해서 쓸수 있으므로 훨씬 간결하다.


1. 클래스란?

  • 역할에 따라 메소드와 변수를 정의한 것, 묶어놓은 것

 

2. 클래스 사용방법

 [공개여부 class 클래스이름{ ... }

 *공개여부: public, protected, (default), public

 

2.1 공개여부(접근제어자)

  • private: 클래스 멤버만 접근 가능
  • protected: 같은 패키지 클래스에서 접근가능, 다른 패키지이지만 자식 클래스 접근 가능
  • (default): 같은 패키지의 클래스만 접근 가능
  • public: 모두 접근 가능

         * 참고: [JAVA] 제어자

 

3. 클래스 사용이유

  • 재사용성이 높아짐 => 검증된 코드 사용 =>  안전성 높아짐 => 개발 비용 절감
  • 코드의 간섭(cohesion, coupling)이 줄어듬 => 유지보수가 쉬워짐 => 개발 비용 절감 


'개발 > Java' 카테고리의 다른 글

[JAVA] static  (0) 2017.01.02
[JAVA] import  (0) 2017.01.01
[JAVA] Tip. 코드를 보고 알아보는 if문의 효율정리  (0) 2017.01.01
[JAVA] 제어문 VS 반복문  (0) 2017.01.01
[JAVA] method(메소드)  (0) 2017.01.01

 

 1의 경우

2의 경우 

3의 경우 

 코드

 

 

public static void main(String[] args) {
  int num = 1;

  while (num <= 100){
   if (num % 4 == 0) {
    System.out.print(num + "   ");

}​
    if (num % 20 == 0) {
     System.out.println();

}​
     if (num % 60 == 0) {
      System.out.print("@");
     }
  
   num++;

 

}

 

public static void main(String[] args) {
  int num = 1;

  while (num <= 100){
   if (num % 4 == 0) {
    System.out.print(num + "   ");
    if (num % 20 == 0) {
     System.out.println();
     if (num % 60 == 0) {
      System.out.print("@");
     }
    }
   }
   num++;

  }

}

 

 public static void main(String[] args) {
  int num = 4;

  while (num <= 100){
    System.out.print(num + "   ");
    if (num % 20 == 0) {
     System.out.println();
     if (num % 60 == 0) {
      System.out.print("@");
    }
   }
   num += 4;

  }

}

 

 출력결과

 
  4   8   12   16   20  
  24   28   32   36   40  
  44   48   52   56   60  
  @64   68   72   76   80  
  84   88   92   96   100 

 효율

 if문을 각각 3번 돌렸으므로

(if문을 한 번 실행하는데 1초로 가정)

100 + 100 + 100 = 300

 if문안에 if문이중첩되어 있는 구조이믈

 100

 4씩 더하면서 하므로 if문 한번을 없앨 수 있으므로

100 / 4 = 25

 * 다 같은 결과를 나오지만, 효율로 따진다면 3의 경우가 가장 효율적이라고 할 수 있다.

'개발 > Java' 카테고리의 다른 글

[JAVA] import  (0) 2017.01.01
[JAVA] Class(클래스)  (0) 2017.01.01
[JAVA] 제어문 VS 반복문  (0) 2017.01.01
[JAVA] method(메소드)  (0) 2017.01.01
[JAVA] array(배열)  (0) 2017.01.01

1. 제어문

1.1 if문

 if(조건){ 실행문... }

 

1.2 if~else문

 if(조건){

   실행문...

}else if(조건){

   실행문...

}else if(조건){

   실행문...

} ....

 

else(){

    실행문 ...

}

 

1.3 switch문

 switch(조건){

    case 경우:

          실행문;

          break;

    case 경우:

           실행문;

            break;

    ....

    default:

           실행문;

}

 * 조건:  4byte이하 정수값, byte, short, char (JDK7 부터는 String도 조건에 넣을 수 있다)

 

 

2. 반복문

2.1 while문

 while(조건){

     반복할 내용;

     증감문;

}

  

2.2 do~while문

 do{

   반복문;

}while(조건)

 * 조건이 맞지 않더라도 최소한 1번은 do안의 반복문이 실행된다. 

 

2.3 for문

 for(초기화; 조건; 증감문;){

   반복문;

}

 

'개발 > Java' 카테고리의 다른 글

[JAVA] Class(클래스)  (0) 2017.01.01
[JAVA] Tip. 코드를 보고 알아보는 if문의 효율정리  (0) 2017.01.01
[JAVA] method(메소드)  (0) 2017.01.01
[JAVA] array(배열)  (0) 2017.01.01
[JAVA] 객체  (0) 2016.12.31

1.method

1.2 method란?

  • 객체가 하는 것(동사)
  • 같은 클래스에 속한 객체라도 method(행동)은 달라질 수 있다.

 

 

2. 사용방법

<메소드 정의> 

void 메소드이름(변수타입 변수명, 변수타입 변수명, ...){

   실행문;

}

 <메소드 호출>

메소드이름(아규먼트1, 아규먼트2, ...);

* 파라미터: 변수타입 변수명, 변수타입 변수명, ... => 메소드에서 받는 값(매개변수) 

* 아규먼트: 함수를 호출할 때에 인자(전달해주는 값)

* 파라미터와 야규먼트의 값과 순서는 반드시 동일해야 한다.

 

 

3. return type

3.1 void

  • 리턴이 없는 경우는 void(무치)로 한다.

 void go( ){   

}


3.2 반환하는 값이 있는경우

  • 아래의 보라색 부분은 반드시 반환하는 값의 변수유형(return)과 같아야 한다.
  • 변수유형: boolean, byte, short, int, long, float, double, char, String

< 선언부 > 

int go( ){           // int형 값을 return하겠다고 알려줌 

     return 30   // int형 값을 return 함

}

 < 호출부 >

int goValue = go();  // 리턴한 값의 변수유형과 동일한 유형에 값을 담아야 한다(여기서는 int)

 * return: 선언한 유형의 값을 리턴하거나 또는 선언한 유형과 호환가능한 값을 리턴

 * 보라색 부분은 같은 유형이어야 한다.

1. 배열이란?

  • 같은 타입의 변수 여러개를 한 번에 저장할 수 있는 저장소
  • 배열 자체는 참조변수(레퍼런스)=>   배열은 값을 저장하는 것이 아닌 주소값을 첨부한다.
  • 배열 내부의 원소 는 원시변수 => 원소에는 값이 들어가 있다.

 

2. 배열 사용법

2.1 정의

 < 방법1 >  int[] arr = new int[5];  //int타입의 변수가 5개 들어있는 배열을 생성한다.

 < 방법2 >  int arr[] = new int[5];  //int타입의 변수가 5개 들어있는 배열을 생성한다.

​* 방법1과 방법2는 동일하지만, java에서는 방법1을 더 많이 사용

 

2.2 초기화​ 

 <생성과 동시에 초기화> int[] arr = new int[]{200, 90, 100};  //초기화를 수행할 때에는 배열의 개수를 지정하지 X

                                                                               // new int[]는 생략가능 => int[] arr = {200, 90, 100};

 < 생성 후 초기화>        arr[0] = 100;   arr[1] = 90; arr[2] = 100;

 

 

3. 배열은 언제 사용할까?

  • 어떤 사물의 순서가 있는, 그리고 효율적인 목록을 빠르게 만들 때


1. 객체의 구조

  • 객체는 클래스에 의해 실체화 된것이다.   (참고주소: http://naraeh.tistory.com/12)
  • 객체 (원시)변수는 존재하지 않는다!! => 객체 레퍼런스변수(레퍼런스)만 존재할뿐                                                                                     ex) Dog myDog = new Dog();  //myDog는 (원시)변수가 아니라 레퍼런스변수

 

2. 객체의 선언 및 생성

 Dog myDog = new Dog();

 

  • 객체의 선언: Dog myDog => JVM에 레퍼런스 변수용 공간을 할당해 달라는 요청 후 그 변수명을 myDog로 지정
  • 객체의 생성: new Dog()  =>  Dog객체를 위한 공간마련

 

3. 객체의 메모리관리

  • garbage collection: 주소


1. JVM에서의 공간

1.1 JVM 구조



1.2 코드

public class Test {

   public static void main(String[] args){

       int[] p1 = new int[5];

       int[] p2 = new int[3];

       int[] p3 = p1;

 

       p3[2] = 100;

 

       System.out.println(p1[2]);

 

       p2 = p1;

   }

}

 

 

1.3 공간모습

 *stack: 메소드를 호출할 때마다 메모리가 쌓인다, 처음에 쌓였던 메모리가 가장 늦게 반환된다 => main()이 가장 늦게 반환된다

            main메모리 생성 -> p3 변수 메모리 생성 -> p3 변수 메모리 반환 -> main 메모리 반환

            (p1, p2는 new로 생성했으므로 stack이 아닌 heap영역 )

 


2. garbage colection(가비지 컬렉션)이란?

  • garbage : 참조하는 변수가 없는 메모리
  • garbage collectior: garbage memory를 해제하는 객체(heap 영역을 관리), 자동으로 실행된다.

 

2.1 garbege는 언제 청소될까?

  • idle time(운영체제가 한가한 시간에)
  • 메모리가 부족할 때

    * garbage가 생겼다고 garbage collection가 즉시 작동하는 것은 아니며, 무조건 작동하는 것은 아니다.

      (프로그램이 잠깐 실행되는 경우에는 garbage collection이 작동하지 않는다.)

 

2.2 garbage를 최소하 하기 위해서는?

  • 디자인 패턴에 따라 코드를 짜서 garbage생성을 최소화 하라!



3. 첨부파일

JAVA_garbageCollection.pptx


'개발 > Java' 카테고리의 다른 글

[JAVA] array(배열)  (0) 2017.01.01
[JAVA] 객체  (0) 2016.12.31
[JAVA] "인스턴스변수VS 메소드"와 "클래스 VS 객체"  (0) 2016.12.31
[JAVA] 기초03  (0) 2016.12.31
[JAVA] 기초 - 주석  (0) 2016.12.31

+ Recent posts