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메소드)와 인스턴스 메소드의 차이를 이해하는게 중요하다. 언제 무엇을 어떻게 선언하는지를 아는 것이 관건!
--------------------------------------------클래스 멤버와 인스턴스 멤버의 참조와 호출----------------------------------
위와 같이 클래스멤버와 인스턴스멤버의 참조 관계를 포현 할 수 있다. 인스턴스 메소드로 만들어야 하는데 클래스 메소드로
만드는 실수는 하지말자.