열심히 끝까지

Java1 day05 보충 본문

Java1(주말)

Java1 day05 보충

노유림 2022. 4. 24. 13:52

       2-6 ) 클래스메소드 ( static method )와 인스턴스 메소드
             - 인스턴스 메소드인스턴스 변수와 관련된 작업을 하는,
               즉 메소드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메소드

             - 인스턴스와 관련없는 ( 인스턴스 변수나 인스턴스 메소드를 사용하지 않는) 메소드는 
               클래스 메소드로 정의

             ① 클래스를 설계할 때 멤버변수 중 모든 인스턴스가 공통으로 사용하는 것에 static을 붙힘
             - 생성된 각 인스턴스는 서로 독립적이기 때문에 각 인스턴스의 변수는 서로 다른 값을 유지
             - 그러나 모든 인스턴스에서 같은 값이 유지되어야 하는 변수는 static을 붙여서

               클래스 변수로 정의

             ② 클래스 변수(static)는 인스턴스를 생성하지 않아도 사용할 수 있음.
             - static이 붙은 변수는 클래스가 메모리에 올라갈 때 이미 자동적으로 생성되기 때문

             ③ 클래스 메소드는 인스턴스 변수를 사용할 수 없음
             - 인스턴스 변수는 인스턴스가 반드시 존재해야만 사용할 수 있는데 
               클래스 메소드는 인스턴스 생성 없이 호출 가능하므로
               클래스 메소드가 호출되었을 때 인스턴스가 존재하지 않을 수도 있음
             - 반면에 인스턴스 변수나 인스턴스 메소드에서 static이 붙은 멤버들을 사용 가능
             - 인스턴스 변수가 존재한다는 것은 static 변수가 이미 메모리에 존재한다는 것을 

               의미하기 때문

             ④ 메소드 내에서 인스턴스 변수를 사용하지 않는다면 메소드에 static을 붙이는 것을 고려
             - 메소드 작업 내용중에서 인스턴스 변수를 필요로 한다면 static을 붙일 수 있음.
             - 허나 인스턴스 변수를 필요로 하지 않는다면 static을 붙이는 것을 고려

 

 

package example02;

public class MemberCallTest {
       int iv = 10;                        // 인스턴스변수
       static int cv = 20;               // 클래스변수

       // static  int cv2 = iv;          // 에러
       /*
        *  클래스 변수는 인스턴스 변수를 사용할 수 없다.
        *  왜why? 클래스변수가 메모리에 올라갈 때 인스턴스 변수는 생성이 안되어 있을 수도 있다.
        *  즉, 만들어지지도 않은 애를 어떻게 변수로 올리는가?
        */
       static int cv2 = new MemberCallTest().iv;
       // iv를 보기 위해서 MemberCallTest를 열어주고 iv를 가져온다.

       int iv2 = cv;
       /*
        * 인스턴스변수는 클래스변수를 사용할 수 있다.
        * 왜why? 인스턴스변수가 메모리에 올라갈 때는 이미 클래스변수는 메모리에 올라가 있기 때문에
        */

       static void staticMethod() {        // 클래스 메소드
             int number = 10;               // 지역변수
             System.out.println("cv : " + cv);
             // System.out.println("iv : " + iv);
             // 클래스 메소드에서 인스턴스 변수를 사용할 수 없다.
             MemberCallTest c = new MemberCallTest();
             System.out.println("c.iv : " + c.iv);
             // 이렇게 거의 안씀
      }

       void instanceMethod() {        // 인스턴스 메소드
             System.out.println("cv : " + cv);
             System.out.println("iv : " + iv);
       }

       void instanceMethod2() {
             // 인스턴스 메소드에서는 인스턴스 메소드, 클래스 메소드 모두 호출 가능
             staticMethod();
             instanceMethod();
       }

       static void Method2() {
             MemberCallTest.staticMethod();        // 아래와 동일
             staticMethod();

             // instanceMethod();
             // 클래스 메소드에서 인스턴스 변수 사용 불가 사용하려면 아래와 같이
             MemberCallTest c = new MemberCallTest();
             c.instanceMethod();

             new MemberCallTest().instanceMethod(); // 위와 동일
       }
}
-------------------------------------------------------------------------------------------------------------

package example02;

public class MyMathEx02 {
       public static void main(String[] args) {
             System.out.println(MyMath2.add(5, 3));
             System.out.println(MyMath2.substract(5, 3));
             System.out.println(MyMath2.multiply(5, 3));
             System.out.println(MyMath2.divide(5, 3));

             MyMath2 mm2 = new MyMath2();
             System.out.println(mm2.add(5, 3));              // 사용은 가능하되 지양할 것
             MyMath2.add(5, 3);
      }
}

class MyMath2{
       // 덧셈, 뺄셈, 곱셈, 나눗셈 메소드

       // 1. 두 개의 정수를 전달받아 두 수의 합을 return 하는 메소드
       static int add(int a, int b) {
             // int result = a + b;
             //return result;                    1번째 방법
             return a + b;                       // 2번째 방법 (바로 넘기기)
       }

       // 2. 두 개의 정수를 전달받아 두 수의 차를 return 하는 메소드
       static int substract(int a, int b) {
             // int result = a - b;
             return a - b;
       }

       // 3. 두 개의 정수를 전달받아 두 수의 곱을 return 하는 메소드
       static int multiply(int a, int b) {
             int result = a * b;
             return result;
       }

       // 4. 두 개의 실수를 전달받아 두 수의 결과를 return 하는 메소드(몫을 return)
       static double divide(double a, double b) {
             // double result = a / b;
             return a / b;
       }
}
------------------------------------------------------------------------------------------------

package example02;

public class CallStackTest {
       public static void main(String[] args) {
             System.out.println("main()이 시작되었음");
             method1();
             System.out.println("main()이 끝났음");
       }

       static void method1() {
             int number = 10;
             System.out.println("method1()이 시작되었음");
             method2();
             System.out.println("method1()이 끝났음");

       }

       static void method2() {
             int number = 10;
             System.out.println("method2()가 시작되었음");
             System.out.println("method2()가 끝났음");
       }
       // LIFO(Last In First Out) 나중에 들어온게 먼저 나간다. - stack
       // FIFO(First In First Out) 먼저 들어온게 먼저 나간다. - queue
}
---------------------------------------------------------------------------------------------

package example03;

public class Data {
       int x;        // 인스턴스 변수(static이 붙지 않은)
}
------------------

package example03;

public class PrimitiveParamEx {
       public static void main(String[] args) {
             Data d = new Data();
             d.x = 10;
             System.out.println("main() : " + d.x);        // 10
             change(d.x); // 기본형
             System.out.println("main() : " + d.x);        // 10
       }

       static void change(int x) {        // 죽었다 깨도 주소를 가지지 못함
             x = 1000;
             System.out.println("change() : " + x);
       }
}
--------------------------------------

package example03;

public class ReferenceParaEx {
       public static void main(String[] args) {
             Data d = new Data();              // 인스턴스
             d.x = 10;                              // 장소값
             System.out.println("d : " + d);
             System.out.println("main() : " + d.x);        // 10
             change(d);                    // 같은 것을 가리키게 만듬 - 주소 공유, 주소 자체를 넘긴다.
             System.out.println("main() : " + d.x); // 30
       }

       static void change(Data d1) {
             System.out.println("d1 : " + d1);
             d1.x = 30;
             System.out.println("change() : " + d1.x);
       }
}
--------------------------------------------------------------------

package example03;

import java.util.Arrays;

public class ReferenceParaEx {
       public static void main(String[] args) {
             Data d = new Data();        // 인스턴스
             d.x = 10;                        // 장소값
             System.out.println("d : " + d);
             System.out.println("main() : " + d.x);              // 10
             change(d);              // 같은 것을 가리키게 만듬 - 주소 공유, 주소 자체를 넘긴다.
             System.out.println("main() : " + d.x);              // 30
             System.out.println();

             int [] ar = new int[4];        // 0, 0, 0, 0 
             System.out.println(Arrays.toString(ar));
             plusOne(ar);
             System.out.println(Arrays.toString(ar));
       }

       static void change(Data d1) {
             System.out.println("d1 : " + d1);
             d1.x = 30;
             System.out.println("change() : " + d1.x);
       }

       static void plusOne(int[] arr) {
             for(int i = 0; i < arr.length; i++) {
             arr[i]++;
             }
       }
}

'Java1(주말)' 카테고리의 다른 글

Java1 day07  (0) 2022.04.30
Java1 day06  (0) 2022.04.24
Java1 day05  (0) 2022.04.23
Java1 day04 보충  (0) 2022.04.23
Java1 day04  (0) 2022.04.17