정구리의 우주정복

[Java] static에 대해 본문

STUDY/K-DIGITAL

[Java] static에 대해

Jungry_ 2022. 8. 21. 22:39
반응형

 

 

ShipMain.java

public class ShipMain {

	public static void main(String[] args) {

		Ship s1 = new Ship();
		Ship s2 = new Ship();
		Ship s3 = new Ship();
		
		s1.sail(100);
		s2.sail(2000);
		s3.sail(50000);
		
		
		System.out.printf("여객 터미널 이용객 수는 : %d 명 입니다\n ",Ship.totalCnt);
		
		System.out.printf("여객 터미널 이용객 수는 : %d 명 입니다 \n",s1.totalCnt);
		System.out.printf("여객 터미널 이용객 수는 : %d 명 입니다 \n",s2.totalCnt);
		System.out.printf("여객 터미널 이용객 수는 : %d 명 입니다 \n",s3.totalCnt);
	}

}

 

s1,s2,s3 라는 Ship 객체를 3개 생성한다 .

s1,s2,s3 모두 sail 이라는 메소드를 호출한다 그리고 매개 변수를 각각 넣어준다

 

출력 부분에 집중해주자

Ship.totalCnt 으로 한번 호출 

s1 , s2 , s3 도 totalCnt 한번씩 호출을 해준다

 

원래였다면 

s1 은 100 

s2 는 2000

s3 은 50000 이 출력되어야 할 것이다 

Ship 은 뭐가 출력 될지 모르겠다 왜냐면 값을 넣어준 적이 없으니까 

 

그렇다면 결과는 어떨까 ?!

 

 

모두 동일한 결과를 출력한다 .

어째서인지는 밑에서 알아보자 

 

 

public class Ship {

	int passengerCnt;
	static int totalCnt;
	
	public void sail(int passengerCnt) {
		this.passengerCnt = passengerCnt;
		Ship.totalCnt += passengerCnt;
	}
	
	public int getTotalCnt() {
		return Ship.totalCnt;
	}
}

우선 sail 은 totalCnt 를 매개변수만큼 더해주는 메소드이다 

 

totalCnt 를 static int 로 선언해주었다. 

static 은 "서로 다 공유하는 메모리 영역이다"

static 으로 지정해주었기 때문에 이제 totalCnt 는 패키지에서 서로 공유하는 친구가 되어버린 거시다

 

 

그래서 특이하게 Ship.totalCnt 이런 형태로 totalCnt안의 값을 가져올 수 있다 (원래였으면 s1 처럼 객체를 생성해서 사용해줘야한다)

소스코드 하나만 더 살펴보자 

 

 

 

Sequence.java

public class Sequence {
	
	private static int basisNum;
	private int currentNum;
	
	public static void setBasisNum(int basisNum) {
		Sequence.basisNum = basisNum;
		
	}
	
	public int nextNum() {
		currentNum = basisNum ++;
		return currentNum;
	}
	

}

basisNum 을 public static 으로 선언해줬다 (접근에 getter/setter이 필요하다)

BasisNum 에 접근하기 위한 setBasisNum 도 만들어준다 

 

nextNum 은 basisNum 의 값을 ++ 해주는 친구이다 

 

 

SequenceMain.java

public class SequenceMain {

	public static void main(String[] args) {

		Sequence.setBasisNum(0); //클래스 명만 가지고 바로 불러올 수 있음 스태틱의 힘 !
		
		Sequence s1 = new Sequence();
		Sequence s2 = new Sequence();
		Sequence s3 = new Sequence();
		
		System.out.println(s1.nextNum());
		System.out.println(s2.nextNum());
		System.out.println(s3.nextNum());
		
		System.out.println();
		
		Sequence.setBasisNum(10);
		System.out.println(s1.nextNum());
		System.out.println(s2.nextNum());
		System.out.println(s3.nextNum());
	}

}

 

만약 이거 실행하면 결과가 어떻게 될지 한번 고 민 해 보 자 

별도의 객체를 생성하지 않고 Sequence 클래스만을 basisNum을 set 해주자

 

그리고 s1 s2 s3 를 사용해서 ++ 를 해주자 !

 

이후 다시 set을 해주고 또 ++ 을 해준다 

 

 

 

그럼 짜잔 이런 결과가 나오게된다 

왜 1 2 3 이 아니라 0 1 2 인지 궁금하신분은 

Sequence 부분의 currentNum 를 보면 

 

currentNum = basisNum ++;

 

currentNum 에 basisNum 값을 넣은 후 

basisNum의 값을 ++ 해주는것이기 때무닌거시다 !

 

static은 공유메모리 !!! 

반응형
Comments