본문 바로가기
BackEnd/Java

[Java] 스태틱 Static

by summer_light 2021. 7. 1.

Static 정적인

static은 정적이라는 의미를 가지고 있다.

자바에서는 정적 개념과 동적 개념을 구분하고 있는데,

쉽게 표현하면 정적은 클래스가 로드되는 시점을 이야기하고,

동적은 로드된 클래스가 실행된 이후를 말한다.

이 중 객체는 동적 데이터라고 해서 프로그램이 실행된 이후에 발생되는 대표적 형태이다.

그러므로 정적 변수, 정적 메소드는 객체(동적) 생성 없이 호출이 가능하도록 클래스 안에 정의한 것이다. 

 


1. 정적 변수와 인스턴스 변수

정적 변수 

모든 객체를 통틀어서 하나만 생성되고 같은 클래스로부터 나온 모든 객체가 공유한다.

객체를 통하지 않고 사용할 수 있는 멤버

클래스명.변수명으로 호출

인스턴스를 생성하지 않고 사용

하나의 클래스에 하나의 변수만 가능

객체보다 클래스에 의지한다(클래스에 연결)

static을 붙여 정적 변수임을 명시한다. 

인스턴스 변수

인스턴스 생성 시 가지는 자신의 변수

별도의 기억공간을 가지고 객체마다 각각 다른 값을 가진다.

객체명.변수명으로 호출

 

 

2. 정적 메소드

정적 변수처럼 static을 붙여 정적 메소드도 만들 수 있다.

메인 함수에도 static이 붙는데, 객체 생성 없이 메인 함수를 호출하기 위해서이다.

 

※ 정적 메소드 사용 시 주의사항

  1. 인스턴스 변수 사용 불가 
  2. 인스턴스 메소드 호출 불가
    → 정적 메소드는 객체가 생성되지 않은 상태에서 호출되는 메소드 이므로
    객체 고유의 인스턴스 변수, 인스턴스 메소드를 호출할 수 없다. (오류발생)
  3. this 사용 불가
    → this 가 참조할 인스턴스가 없기 때문
  4. 정적 메소드에서 정적 메소드를 호출하는 것은 가능

 

3. final 

final을 붙인 상수는 모두 다 같이 쓰는 변수이다.

따라서 객체를 만들지 않고 쓰면 좋기 때문에 static을 붙여주면 좋다. 

ex) final static number = 100; 

 

 

 

예제 01. Static 변수, Static 메소드 사용하기

→ static 메소드인 sleep()은 non static 변수인 name과 non static 메소드인 eat()을 사용할 수 없다. 

package jun03;

class Animal{
   String name;
   int age;
   static int number; //정적변수
   static String lang = "Kr";
   final static int CODE = 102; //정적상수, 바뀌지 않는 수
   
   public static void sleep() {
      System.out.println("Zzzz");
//      eat();  객체가 없으면 eat()은 실행할 수 없기 때문에 오류
      sound();
//      name = "";   객체가 없으면 non static 변수에 값이 없기 때문에 오류 ***
   }
   
   public static void sound() {
      System.out.println("소리냅니다.");
   }
   
   public void eat() {
      System.out.println("먹습니다.");
      sleep(); //non static 이 static 메소드를 부르는 것은 가능
      work();
   }
   
   public void work() {
      System.out.println("work");
      number = 1000; //non static이 static 변수를 부르는 것은 가능
   }
}

public class Static01 {

   public static void main(String[] args) {
      
      
      //정적멤버 호출   클래스명.static붙은 변수명
      Animal.number = 100; 
      
      //정적 메소드 호출    클래스명.static붙은 메소드()
      Animal.sleep(); //Zzzz 소리냅니다. 
      
      //cat, dog, mouse
      Animal cat = new Animal();
      Animal dog = new Animal();
      
      cat.name = "R2D2";
      cat.age = 149;
      
      dog.name = "3PO";
      dog.age = 10;
      
      System.out.println(cat.name); //R2D2
      System.out.println(cat.age); //149
      System.out.println(dog.name); //3PO
      System.out.println(dog.age); //10
      System.out.println(cat.number); //100 static 변수이므로 동일
      System.out.println(dog.number); //100 static 변수이므로 동일
   }

}

 

 

'BackEnd > Java' 카테고리의 다른 글

[Java] Object  (0) 2021.07.01
[Java] 접근제어자 Access Modifier  (0) 2021.07.01
[Java] 오버라이드, 오버로드  (0) 2021.07.01
[Java] 객체지향프로그래밍 OOP*  (0) 2021.07.01
[Java] 동적가변배열 Dynamic Array  (0) 2021.07.01

댓글