본문 바로가기

JAVA

[JAVA] 필드의 구분/메소드의 구분

JAVA 메모리 영역

클래스 영역 : 공유메모리 (static변수, static메서드, 생성자메서드)
스택 영역     : 일반변수, 참조변수
힙 영역        : 객체

 

 

 

클래스의 필드(field)란 클래스에 포함된 변수(variable)를 의미

클래스 내에서 필드는 선언된 위치에 따라 다음과 같이 구분

 

1. 클래스 변수(static variable)

  • 클래스 영역에 위치한 변수 중 static 키워드를 가짐
  • 자동 초기화
  • 인스턴스 생성하지 않고 바로 사용 가능
  • 해당 클래스의 모든 인스턴스가 공유해야 하는 값을 위해 사용
  • 하나의 메모리 공간만 사용

2. 인스턴스 변수(instance variable)

  • 클래스 영역에 위치한 변수 중 static 키워드를 가지지 않음
  • 자동 초기화
  • 인스턴스마다 가져야 하는 고유한 값을 위해 사용
  • 변수마다 메모리공간 생성

3. 지역 변수(local variable)

  • { }내에서 선언되는 변수
  • { }내에서 공간형성 , { }를 벗어나면 공간 소멸
  • 메소드나 생성자, 초기화 블록 내에 위치한 변수
  • 사용전 초기화 필요

 

변수 생성 시기 소멸 시기 저장 메모리 사용 방법
클래스 변수 클래스가 메모리에 올라갈 때 프로그램이 종료될 때 메소드 영역 클래스 이름.
변수 이름
인스턴스 변수 인스턴스가 생성될 때 인스턴스가 소멸할 때  힙 영역 인스턴스 이름.
변수 이름
지역 변수 블록 내에서 변수의 선언문이 실행될 때 블록을 벗어날 때  스택 영역 변수 이름

 

예제 )

선언위치에 따른 변수의 종류_포커카드 속성

class Card
{
  String kind;     //(무늬)인스턴스 변수
  int number;      //(숫자)인스턴스 변수
  
  static int width = 100; //(폭)클래스 변수
  static int height = 250; //(높이)클래스 변수
  
  void method()
  {
     int lv=0;     //지역 변수
  }
}

//인스턴스 변수 호출
Card c = new Card(); //객체 생성
c.kind = "Heart"; //객체 이름.변수이름
c.number = 5; 

//클래스 변수 호출(객체 생성 없이 사용가능)
Card.width = 200; //클래스이름.변수이름
Card.height = 300;

클래스 영역에 선언된 변수 : 인스턴스, 클래스 2가지. 

이때 static이 있으면 클래스 변수, 없으면 인스턴스 변수라고 함.

매서드 영역에 선언된 변수 : 지역변수

 

포커카드 마다 폭과 넓이는 모두 같다 > 공통 속성 > 클래스 변수(static)

포커카드 마다 무늬와 숫자는 다르다 > 개별 속성 > 인스턴스 변수

 

 

 

예제 )

class Field {
    static int classVar = 10; // 클래스 변수 선언
    int instanceVar = 20;     // 인스턴스 변수 선언
}

public class Member01 {
    public static void main(String[] args) {
        int var = 30;                   // 지역 변수 선언
        System.out.println(var + "\n"); // 지역 변수 참조

        Field myField1 = new Field();   // 객체 생성
        Field myField2 = new Field();   // 객체 생성

        System.out.println(Field.classVar); // 클래스 변수 참조
        System.out.println(myField1.classVar);
        System.out.println(myField2.classVar + "\n");

        Field.classVar = 100;            // 클래스 변수의 값을 변경 

        System.out.println(Field.classVar); // 클래스 변수 참조
        System.out.println(myField1.classVar);
        System.out.println(myField2.classVar + "\n"); 

        System.out.println(myField1.instanceVar); // 인스턴스 변수 참조
        System.out.println(myField2.instanceVar + "\n");

        myField1.instanceVar = 200;               // 인스턴스 변수의 값을 변경

        System.out.println(myField1.instanceVar); // 인스턴스 변수 참조
        System.out.println(myField2.instanceVar);
    }
}

클래스 변수는 생성된 모든 인스턴스가 같은 값을 공유

인스턴스 변수는 각 인스턴스마다 고유한 값을 가짐

따라서, myFIeld1의 인스턴스 변수값을 200으로 변경 후

myField1객체를 호출하면 200, myField2 객체를 호출하면 20 이 출력된다.

 

 

결과 )

30

10
10
10

100
100
100

20
20

200
20

 

 

 

 


 

 

 

 

 

메소드의 구분

메소드 : 어떠한 작업을 수행하기 위한 명령문의 집합

 

1. 클래스 메소드 (static method)

  • static  키워드를 가짐
  • 객체 생성 없이 바로 사용가능
  • '클래스 이름.메서드이름(매개변수)'와 같이 호출 가능
  • 전달된 매개변수만으로 동작
  • 인스턴스 변수 사용할 수 없음
  • 클래스 멤버가 인스턴스 멤버를 참조 또는 호출하고자 할 경우 객체 생성

 

2. 인스턴스 메소드 (instance method)

  • static  키워드를 가지지 않음
  • 반드시 객체 생성해야만 호출 가능
  • 인스턴스 멤버(인스턴스 변수와 인스턴스 메소드)는 반드시 객체를 생성한 후에만 참조 또는 호출 가능

 

 

예제 )

class Sum {
    Scanner sc = new Scanner(System.in);
	
    //클래스 메서드 : 인스턴스 변수와 관계없이 매개변수만으로 작업 가능
    static int sum1(int x, int y) {
        return x+y; //x, y는 지역 변수
    }
    
    //인스턴스 메서드 : 인스턴스 변수 x,y만을 이용해 작업하므로 매개변수 필요 없다.
    int x, y;
    int sum2() {
        System.out.print("정수 2개 입력 : ");
        int x = sc.nextInt();
        int y = sc.nextInt();
        return x+y; //x, y 인스턴스 변수
	}
}
    
class SumTest {
    public static void main(String[] args) {

        //클래스 메서드 호출
        System.out.println(Sum.sum1(10,20));

        //인스턴스 메서드는 객체 생성 후에만 호출 가능
        Sum result = new Sum();
        System.out.println(result.sum2());
	}
}

 

 

결과 )

30
정수 2개 입력 : 10 20
30

 

 

 

정리 )

  • 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통적으로 사용해야하는 것에 static 을 붙인다.
  • 클래스변수(static 변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.
  • 클래스 메서드(static 메서드)는 인스턴스 변수를 사용할 수 없다.
  • static 이 붙은 메서드는 인스턴스 생성 없이 호출 가능한 반면, 인스턴스 변수는 객체를 생성해야만 만들어지기 때문에 static 이 붙은 메서드에서 인스턴수 변수의 사용을 허용하지 않음. 그러나, 인스턴스 변수나 인스턴스 메서드에서는 static 이 붙은 멤버들을 사용한 것은 언제나 가능.
  • 인스턴스 변수를 필요로 하지않는다면 static 을 붙이자. (메서드 호출시간 짧아지기 때문에 효율 증가)
  • 클래스의 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야하는 것이 있는지 살펴보고 있으면 static 을 붙인다.

 

 

 

 

 

 

 

 

 

참고 사이트 : https://88240.tistory.com/440 [shaking blog:티스토리]

참고 사이트 : tcpschool.com

참고 영상 : 남궁성의 정석코딩