1. static
- 주로 멤버 변수와 메서드에 사용
1-1. static 변수
- 특정 클래스에서 공용으로 사용할 수 있는 변수
- static 변수 / 정적 변수 / 클래스 변수 라고 함
1-1-1. static 변수 예시 (몇 개의 객체가 생성되었는지 count하고 싶음)
- 잘못된 예시 (static 사용 x)
public class Person {
public String name;
public int count;
public Person(String name) {
this.name = name;
count ++;
}
}
public class Main {
public static void main(String[] args) {
// 객체 생성 - 1
Person person1 = new Person("A");
System.out.println("A count = " + person1.count);
// 객체 생성 - 2
Person person2 = new Person("B");
System.out.println("B count = " + person2.count);
}
}
/* 출력결과
A count = 1
B count = 1 */
- 출력결과
- 원하는 대로 몇 개의 객체가 생성되었는지 확인 불가
- 객체 생성마다 Person 인스턴스가 새로 만들어지고 이 인스턴스에 포함된 count 변수가 새로 만들어지기 때문
- 옳은 예시 (static 사용)
public class Person {
public String name;
public static int count; // 공용으로 함께 사용하는 static 변수
public Person(String name) {
this.name = name;
count ++;
}
}
public class Main {
public static void main(String[] args) {
// 객체 생성 - 1
Person person1 = new Person("A");
System.out.println("A count = " + Person.count);
// 객체 생성 - 2
Person person2 = new Person("B");
System.out.println("B count = " + Person.count);
}
}
/* 출력결과
A count = 1
B count = 2 */
- 출력결과
- 객체가 생성되면 생성자에서 static 변수 count를 증가시킴
- 따라서 원하는대로 생성한 객체 수를 확인 가능
📌 정적 변수는 인스턴스 영역이 아니라 메서드 영역에서 관리!
⇒ static 변수인 count는 인스턴스 영역에서 생성되지 않음 / 대신 메서드 영역에서 관리
1-1-2. static 변수 접근 방법
- 위의 예제와 같이 클래스명.정적변수이름 으로 접근
- 마치 클래스에 직접 접근하는 느낌
📌 static 변수는 인스턴스가 아닌 클래스 자체에서 참조해서 사용
1-2. static 메서드
- 정적 메서드는 객체 생성없이 클래스에 있는 메서드를 바로 호출할 수 있음
- static 메서드는 static이 붙은 “static 변수나 static 메서드만 사용가능!”
public Class Person {
// 인스턴스 변수
private String name;
// static 변수
private static int count;
// 인스턴스 메서드
public void instanceMethod() {
System.out.println("인스턴스 메서드");
}
// static 메서드
public static void staticMethod() {
System.out.println("정적 메서드");
}
public static void Info() {
System.out.println("이름 : " + name); // 인스턴스 변수 접근, 컴파일 에러!
System.out.println("카운트 : " + count); // static 변수 접근 가능!
instanceMethod(); // 인스턴스 메서드 접근, 컴파일 에러!
staticMethod(); // static 메서드 접근 가능!
}
}
- 정적 메서드는 공용 기능임
- ⇒ 접근 제어자만 허락한다면 클래스를 통해 모든곳에서 static 호출 가능!
📌 static 메서드가 인스턴스의 기능 사용 불가한 이유
static 메서드는 클래스 이름을 통해 바로 호출함
⇒ 인스턴스처럼 참조값의 개념 x
⇒ 인스턴스 변수, 메서드 를 사용하려면 참조값을 알아야 되는데 static 메서드는 참조값 없이 호출되기 때문에!!
1-2-1. static 메서드 접근 방법
- static 변수와 마찬가지로 클래스 통해서 접근 가능
클래스명.정적메서드 - 인스턴스 통해서 접근도 가능 (추천x)
인스턴스명.정적메서드
// 클래스 통한 접근
Person.staticMethod();
// 인스턴스 통한 접근 (추천 x)
Person person1 = new Person();
person1.staticMethod();
'Java' 카테고리의 다른 글
[Java] 자바 메모리 구조 (0) | 2024.07.09 |
---|---|
[Java] final (0) | 2024.07.09 |
[Java] 객체 지향 프로그래밍 - 추상화 (Abstraction) (0) | 2024.07.09 |
[Java] 객체 지향 프로그래밍 - 다형성 (Polymorphism) (0) | 2024.07.09 |
[Java] 객체 지향 프로그래밍 - 상속 (Inheritance) (0) | 2024.07.08 |