본문 바로가기

객체 지향 프로그래밍 - 클래스

정적 멤버

정적 멤버 선언

  • 정적 멤버: 메소드 영역의 클래스에 고정적으로 위치하는 멤버


    출처, 이것이 자바다


  • static 키워드를 추가해 정적 필드와 정적 메소드로 선언


    출처, 이것이 자바다


정적 멤버 사용

  • 클래스가 메모리로 로딩되면 정적 멤버를 바로 사용할 수 있음
  • 클래스 이름과 함께 도트(.) 연산자로 접근


    출처, 이것이 자바다



    출처, 이것이 자바다


  • 정적 필드와 정적 메소드는 객체 참조 변수로도 접근(오해의 소지가 있어서 권장안함)
package ch06.sec10.exam01;

/*
 정적(static)멤버 : 필드와 메소드 
 */

public class Calculator {

    //정적필드
    static double pi = 3.14159;

    //정적메소드
    static int plus(int x, int y) {
        return x + y;
    }

    static int minus(int x, int y) {
        return x - y;
    }

}

package ch06.sec10.exam01;

public class CalculatorExample {

    public static void main(String[] args) {

        //main메소드에 의하여 실행시, JVM 이 Calculator클래스의 static멤버를 찾는다.
        //그리고, method area(static area)에 static멤버들에 대한 메모리를 생성한다.

        //인스턴스 멤버가 존재하지 않으므로, 객체생성을 할수가 없다.

        //정적멤버 접근
        double result1 = 10 * 10 + Calculator.pi;
        int result2 = Calculator.plus(10, 5);
        int result3 = Calculator.minus(10, 5);

        System.out.println("result1: " + result1);
        System.out.println("result2: " + result2);
        System.out.println("result3: " + result3);

        //객체를 생성하여, 정적멤버도 접근은 가능하도록 되어있지만, 오해 소지가 있어 권장은 안한다.
        //힙영역의 메모리에는 static멤버의 기억장소는 존재하지 않는다.
        Calculator cal = new Calculator();
        double result4 = 10 * 10 + cal.pi;
        int result5 = cal.plus(10, 5);
        int result6 = cal.minus(10, 5);

        System.out.println();

        System.out.println("result4: " + result4);
        System.out.println("result5: " + result5);
        System.out.println("result6: " + result6);
    }

}

정적 블록

  • 정적 필드를 선언할 때 복잡한 초기화 작업이 필요하다면 정적 블록을 이용


    출처, 이것이 자바다


  • 정적 블록은 클래스가 메모리로 로딩될 때 자동으로 실행
  • 정적 블록이 클래스 내부에 여러 개가 선언되어 있을 경우에는 선언된 순서대로 실행
  • 정적 필드는 객체 생성 없이도 사용할 수 있기 때문에 생성자에서 초기화 작업을 하지 않음
package ch06.sec10.exam02;

/*
 static 블록 또는 메소드에서는 인스턴스 멤버들을 호출이 불가능.
 이유는? static메소드 또는 블록이 먼저 생성되어 실행되는 시점에는
 인스턴스 기억장소는 존재하지 않기때문이다.
 */
public class Television {

    //1)static 멤버필드는 method area에 기억장소 생성
    static String company = "MyCompany";
    static String model = "LCD";
    static String info;

    int a; //인스턴스 멤버는 new 작업대상 

    //정적블록 : static 멤버필드를 초기화작업, 2)자동호출
    static {
        //중단점
       info = company + "-" + model;
       //문법에러발생 이유는? new생성자작업구문보다 static작업이 먼저실행되어
       //int a에 대한 힙영역의 기억장소가 존재안하는 상태에서  호출하여 실행하기 때문에 컴파일 에러 발생
       //int = 10;
    }
}

package ch06.sec10.exam02;

public class TelevisionExample {

    public static void main(String[] args) {

        //디버깅 진행시 실행이 누가 먼저되는지 확인하면 도움이 된다.
        //중단점
        Television tv = new Television();

        System.out.println(Television.info);

    }

}

인스턴스 멤버 사용 불가

  • 정적 메소드와 정적 블록은 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없으며 this도 사용할 수 없음
  • 정적 메소드와 정적 블록에서 인스턴스 멤버를 사용하고 싶다면 객체를 먼저 생성하고 참조 변수로 접근


    출처, 이것이 자바다


package ch06.sec10.exam03;

/*
 * 설계도에 해당하는 라이브러리 Car클래스 + 실행 클래스(main)
 */
public class Car {

    //인스턴스 필드선언
    int speed;

    //인스턴스 메소드 선언
    void run() {
        System.out.println(speed + "으로 달립니다.");
    }

    static void simulate() {
        //객체생성 myCar객채이름은 이 메소드안에서만 인식되므로 28라인의 이름과는 충돌되지 않는다.
        Car myCar = new Car();
        myCar.speed = 200;
        myCar.run();

        //인스턴스 멤버는 아직 메모리 생성되기전 상태이무로 직접호출할 수가 없다.
//        speed = 100;
//        run();
    }

    //main 메소드는 Car클래스안에 작성은 되어있지만, 독립적인 요소로 바라본다.
    public static void main(String[] args) {
        //Car.simulate();
        simulate(); //클래스명 생략가능하다.

        Car myCar = new Car();
        myCar.speed = 60;
        myCar.run();

}
}

'객체 지향 프로그래밍 - 클래스' 카테고리의 다른 글

패키지  (0) 2023.01.17
final 필드와 상수  (0) 2023.01.16
인스턴스 멤버  (0) 2023.01.16
메소드 선언과 호출  (0) 2023.01.16
생성자 선언과 호출  (0) 2023.01.16