Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

우주코딩

스태틱 변수, 인스턴스 변수, 스태틱 메서드, 인스턴스 메서드 본문

자바 본 강의

스태틱 변수, 인스턴스 변수, 스태틱 메서드, 인스턴스 메서드

우주코딩 2021. 7. 20. 17:18

스태틱 변수 (static variables) = 클래스 변수

  • main 메서드 없이 클래스를 실행시킬수 없다 => main 클래스가 'entry point'이기 때문에

  • main 메서드가 사용할 로컬 변수는 JVM Stack
    메인 메서드가 호출될 때 만들어지고 호출 끝나면 사라진다

  • main 메서드는 Method Area에 로딩된다.

  • main 메서드에서 메서드를 호출하면 JVM stack에 메서드 호출 frame 이 만들어진다.

  • 호출된 메서드 안에서 static 변수 사용.
    최초로 클래스를 [스태틱 멤버(변수, 메서드)를] 사용하는 시점에 클래스가 로딩된다.
    클래스가 로딩된 후 즉시 자동으로 스태틱 변수가 Method Area 영역에 생성된다.
    클래스가 언로드 될 때 스태틱 변수가 제거된다.
    클래스가 언로드 될 때는 JVM이 종료할 때다.
    static 변수는 한번 만들어지면 프로그램이 종료될 때 사라진다.

  • Test 클래스가 호출되는 시점에 Test 클래스의 스태틱 변수가 로딩된다.

  • static 변수는 클래스를 로딩되는 시점에 만들어진다.

  • 특정 인스턴스에 상관없이 공유할 값을 저장할 때 사용

  • 클래스가 로딩될 때 !!!한번만!!! 만들어진다.

논스태틱 변수(non-static variables) = 인스턴스 변수

  • 인스턴스 변수는 new 라는 명령을 실행해서 Heap에 만들어진다.
  • 가비지가 된 후 가비지 컬렉터에 의해 제거된다.
  • 인스턴스 만들려면 클래스 로딩해야하고 클래스 로딩할 때 스태틱이 만들어지니
    인스턴스 만들때 이미 스태틱은 만들어진 상태이다!
  • 힙의 주소값을 담을 레퍼런스 변수가 JVM Stack에 만들어진다
    Test t1 =  new Test();
    t1 = 레퍼런스 변수
    new Test(); = Heap에 만들어지는 주소값
Calculator c1 = new Calculator();

Calculator 클래스에서 nonstatic 필드를 찾아 Heap에 메모리를 만들어라.

  • 인스턴스 변수는 몇개든지 만들 수 있다.
  • 스태틱은 딱 한번만 만들 수 있다 ( 클래스 로딩은 한 번만 되니까 )
  • 인스턴스 마다 구분해서 관리해야할 데이터를 저장할 때 사용

스태틱 메서드

  • 클래스를 통해 사용할 수 있는 메서드
  • 자신이 소속된 클래스의 인스턴스는 필요 없다.
  • 자신이 소속된 클래스의 스태틱 멤버는 사용할 수 있다.

인스턴스 메서드

  • 인스턴스 주소를 가지고 호출하는 메서드
  • 그래서 보통 인스턴스 변수를 사용하는 메서드에 대해 인스턴스 메서드로 정의한다.
  • 자신이 소속된 클래스의 인스턴스 멤버 (변수, 메서드)를 사용할 수 있다.
  • 인스턴스 없이 사용하는 스태틱 멤버도 접근할 수 있다.
  • 인스턴스 주소를 담은 레퍼런스를 가리키는 메소드에 내장되어있는 변수 this
  • this 는 인스턴스 메서드에만 있다.

메서드를 분류했을 때의 이점

  • 소스코드를 유지보수하기 쉬워진다.
  • 코드를 재사용할 가능성이 높아진다.

클래스를 이용하여 사용자 정의 데이터 타입을 만들기

  • instance 필드를 사용하여 저장할 데이터의 메모리 설계
  • static 메서드를 활용하여 인스턴스 변수 다룸.

연산자와 메서드

class Scorer {
    String name;
    int kor, eng, math, sum;
    float average;
static void compute(Score s){
    s.sum = s.kor + s.eng + s.math;
    s.average = s.sum/3f;

    }
}

Score s = new Score();
s.name = "방우주";
s.kor = 100;
s.eng = 90;
s.math = 85;
Score.compute(s);

Score 인스턴스의 변수 값을 다룬다 = Score 타입의 데이터를 다루는 연산자와 같다.
인스턴스를 다루는 메서드를 '연산자'라 표현한다.
클래스안에 생성한 인스턴스 메서드는 새로 정의한 타입의 데이터를 다루는 '연산자'이다

Comments