Static하지 않은 변수
Java에서 class 내 static하지 않은 변수나 메서들은 각각의 인스턴스와 관련이 있으며 인스턴스를 통해서만 액세스를 할 수 있다.
예시로 다음과 같이 Fish라는 물고기 클래스를 정의하였다. 물고기한테는 이름 변수와 swim() 메서드가 있다.
class Fish{
String name;
public void swim(){
System.out.println(name+" swims!");
}
}
그 후 main에서 nemo라는 인스턴스를 생성하여 swim()을 호출하면 nemo swims!가 출력된다.
class Main {
public static void main(String[] args) {
Fish nemo = new Fish(); // 새로운 Fish nemo를 만든다
nemo.name = "nemo"; // nemo의 이름을 nemo로 한다
nemo.swim(); // nemo의 swim 메서드를 호출한다
}
}
//출력결과: nemo swims!
그러나 swim은 static하지 않기 때문에 Fish 클래스 자체를 통해 호출할 수는 없다. 다음과 같은 코드는 오류를 낼 것이다.
class Main {
public static void main(String[] args) {
Fish.swim();
}
}
// 출력결과: 에러
Static한 변수
Java에서 static한 변수들은 class 자체와 관련이 있으며 class를 통해 호출할 수 있다. 개별 인스턴스와는 독립적이다.
이제 Fish에 static 변수를 추가해 보자. 여태까지 만들어졌던 모든 물고기의 수를 세는 fishCount를 만들것이다.
//..
private static int fishNum = 0;
//...
클래스 밖에서 fishNum이 변형 된다면 물고기 수를 잘못 셀 수 있다. 때문에 private 변수로 만드는 것이 좋다. 그리고 다음과 같이 public한 getFishNum 메서드로 밖에서 fishNum을 읽을 수 있게 하면 된다.
//...
private static int fishNum = 0;
public static int getFishNum(){
return fishNum;
}
//...
마지막으로 Fish() constructor를 통해서 Fish가 만들어질 때마다 fishNum을 1씩 증가시킨다.
//...
private static int fishNum = 0;
public static int getFishNum(){
return fishNum;
}
public Fish(){
fishNum ++;
}
//...
원 코드와 합쳐서 nemo를 만들기 전, nemo를 만든 후에 getFishNum을 한 번씩 실행해 보자.
class Fish{
private static int fishNum = 0;
public Fish(){
fishNum ++;
}
public static int getFishNum(){
return fishNum;
}
String name;
public void swim(){
System.out.println(name+" swims!");
}
}
class Main {
public static void main(String[] args) {
System.out.println("fishNum: "+ Fish.getFishNum()); // nemo 생성 전
Fish nemo = new Fish();
nemo.name = "nemo";
// nemo.swim();
System.out.println("fishNum: "+ Fish.getFishNum()); // nemo 생성 후
}
}
0과 1이 정상적으로 출력된다.
nemo 인스턴스에서 fishNum을 호출할 수도 있는데, 이 방법은 프로그래머를 헷갈리게 할 수 있으므로 피하는 것이 좋다.
class Main {
public static void main(String[] args) {
Fish nemo = new Fish();
System.out.println("fishNum: "+ nemo.getFishNum());
}
}
// 출력결과: 1
'프로그래밍 > 기타' 카테고리의 다른 글
Java 상속에서 생성자 (0) | 2025.04.18 |
---|---|
파이썬으로 네트워크 ID, 브로드캐스트 주소, 호스트 수 구하기 (Subnet masking) (20250109 7일차) (0) | 2025.01.09 |