본문 바로가기

▶Programming/Theory

static 과 non static

1. static이 붙은 변수나 메소드를 인스턴스 생성없이 사용가능 이유는?


답)인스턴스의 모태가 되는 클래스가 메모리에 올라갈 때 클래스의 멤버로 메모리에 같이 올라가 있기 때문에


2. static이 붙은 메소드에서 인스턴스 변수를 사용 할 수 없는 이유는?


답)static 사용 시점에 인스턴스가 생성되어 있는지 안 되어 있는지 알 수 없기때문에


3. static 사용 이유는?


답)값의 중복을 피할 수 있게 해주고 한 장소에 값을 적재하기 때문에 값을 찾는 시간이 줄어든다. 

이는 프로그램의 효율성을 높여준다.


4. static 고려사항


①클래스 멤버 변수 중 인스턴스화 시켰을 때 공통으로 유지할 값이 있으면 static 사용을 고려한다.

②클래스에서 만든 메소드 중 인스턴스 변수 사용이 없는 메소드는 static을 고려한다.


5. 참고사항


-static으로 선언한 변수는 지역변수로 사용할 수 없다. 이유는 지역변수는 함수 호출이 끝나면 사라져야 하는데

static은 특징이 프로그램이 종료되기 전까지 살아있는 것이므로 둘의 충돌로 인해 사용될 수 없다.

(지역변수 생명주기나 static  생명 주기는 메모리 할당 글에 있다)



--------------------------------------------클래스 변수와 인스턴스 변수----------------------------------

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
32
33
34
35
36
37
package project1;
 
 class Car{
     //자동차의 가로,세로 등은 차종류에 따라 다르므로 인스턴스마다 다를 것 이다. 
     //이러한 값들은 인스턴스 변수로 선언한다. 인스턴스 변수는 따로 선언 방식이 존재하는게 아니라
     //그냥 타입앞에 아무것도 안 쓰면 된다.
     
     int width; //인스턴스 변수(=객체변수)
     int height;//인스턴스 변수(=객체변수)
 
     //자동차 바퀴수  4개, 네비게이션은 1개는 어느 자동차를 생산하더라도 고정이고 공유 할 수 있다.
     //바퀴가 4개 초과나 네비게이션 2개 이상인 차는 고려하지 않는다고 하자.
     
    //스테틱을 붙이면 값이 공유가 된다. 그리고 이렇게 static을 붙인 변수를 클래스 변수(=정적변수,static변수)라 한다.
     static int wheel=4;
     static int navi=1;
     
 }
public class HelloWorld {
 
    public static void main(String[] args) {
        
        
        Car car=new Car();//인스턴스 생성
        
        car.height=200;
        car.width=150;
        
        //car가 소문자인걸 주목하자. car는 인스턴스다.
        System.out.println("가로는 "+car.width+" 세로는 "+car.width);
        
        //static 변수는 인스턴스에서도 사용 가능하다. car.wheel처럼. 물론 클래스 자체에서도 사용 가능하다. 
//Car.navi처럼(사용방법: 클래스명.변수이름)
        System.out.println("네비게이션 수는 "+Car.navi+" 바퀴수는 "+car.wheel);
        
    }
 
}
cs

위의 코드를 보고 주석을 보면 쉽게 이해 할 수 있다. 중요한걸 다시 얘기하자면, static으로 선언한 변수는 인스턴스와 관계 없이 사용 가능하다.



--------------------------------------------클래스 메소드(static붙은 메소드)와 인스턴스 메소드----------------------------------



중요한 것은 클래스메소드(static메소드)와 인스턴스 메소드의 차이를 이해하는게 중요하다. 언제 무엇을 어떻게 선언하는지를 아는 것이 관건!



--------------------------------------------클래스 멤버와 인스턴스 멤버의 참조와 호출----------------------------------

위와 같이 클래스멤버와 인스턴스멤버의 참조 관계를 포현 할 수 있다. 인스턴스 메소드로 만들어야 하는데 클래스 메소드로

만드는 실수는 하지말자.