정구리의 우주정복
[Java] static에 대해 본문
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은 공유메모리 !!!
'STUDY > K-DIGITAL' 카테고리의 다른 글
[HTML/CSS] float 정복하기 (0) | 2022.08.23 |
---|---|
[HTML/CSS] position 정복하기 (0) | 2022.08.23 |
[Java] 객체 생성, 클래스에서 다른 클래스 호출해 사용하기 (5) | 2022.08.21 |
[Java] Mac Eclipse IDE / Projects are not visible in workspace folder (0) | 2022.08.21 |
[Java] 객체를 배열로 다루기 (0) | 2022.08.18 |