안드로이드 개발자의 창고
[7일차 Java] Static 본문
출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT
📖 Static이란?
- 객체를 생성하지 않고도 사용하는 요소로써 클래스 이름을 통해 접근할 수 있다.
- 객체 참조 변수를 통해서도 사용이 가능하며 딱 하나의 변수만 생성된다.
- 프로그램 전체에서 딱 하나만 존재하는 값을 저장할 때 사용한다.
- 변수 : 프로그램이 시작되어 클래스들이 메모리에 올라갈 때 생성되는 변수
- 메서드 : static 변수나, 매개변수를 포함한 지역변수만 사용이 가능하다.
- static변수나 매개변수를 포함한 지역변수만 사용하는 메서드의 경우 static으로 정의하면 편하게 사용할 수 있다.
📖 Static을 사용한 클래스
class TestClass1 {
int memberA = 100; // 멤버 변수
static int memberB = 200; // static 변수
// 멤버 메서드
public void method1() {
System.out.println("method1 호출");
// 객체를 생성해야지만 사용할 수 있는 메서드 이므로 모든 static 요소에 접근할 수 있다.
System.out.printf("memberA : %d\n", memberA);
System.out.printf("memberB : %d\n", memberB);
method2();
}
// static 메서드
public static void method2() {
System.out.println("method2 호출");
// static 메서드는 객체를 생성하지 않아도 호출이 가능하기 때문에 객체의 멤버에는 접근이 불가능하다.
System.out.printf("memberA : %d\n", memberA); <<< 불가능
System.out.printf("memberB : %d\n", memberB);
method1(); <<< 불가능
}
}
✔️ 코드 해석
// static 메서드
public static void method2() {
System.out.println("method2 호출");
// static 메서드는 객체를 생성하지 않아도 호출이 가능하기 때문에 객체의 멤버에는 접근이 불가능하다.
System.out.printf("memberA : %d\n", memberA); <<< 불가능
System.out.printf("memberB : %d\n", memberB);
method1(); <<< 불가능
}
- 해당 메서드에서 멤버변수 memberA와 멤버 메서드 method1()를 사용하는 것은 불가능하다.
- Static을 이용한 메서드는 객체를 선언하지 않고도 사용이 가능하다.
- method2() 메서드를 통해 method1() 메서드를 호출할 때는 객체가 생성될지 안될지 알 수 없다.
- 따라서 객체가 생성되야지만 사용할 수 있는 method1() 메서드를 method2() 메서드 내부에서는 사용할 수 없다.
📖 메인 클래스
public class MainClass {
public static void main(String[] args) {
// static 요소 사용
System.out.printf("TestClass1.memberB : %d\n", TestClass1.memberB);
TestClass1.method2();
// 객체 생성없이 멤버변수 사용
System.out.printf("TestClass1.memberA : %d\n", TestClass1.memberA); <<< 불가능
TestClass1.method1();
// 객체를 생성한다.
TestClass1 t1 = new TestClass1();
// 객체 참조 변수를 통해 객체의 멤버에 접근한다.
System.out.printf("t1.memberA : %d\n", t1.memberA);
t1.method1();
// 객체 참조 변수를 통해 static 요소에 접근한다.
System.out.printf("t1.memberB : %d\n", t1.memberB);
t1.method2();
}
}
✔️ 메인 클래스 코드 해석
// static 요소 사용
System.out.printf("TestClass1.memberB : %d\n", TestClass1.memberB);
TestClass1.method2();
- Static을 사용하면 클래스 이름을 통해 접근이 가능하다.
- 따라서 객체를 생성하지 않고도 멤버변수나 멤버메서드에 접근이 가능하다.
// 객체 생성없이 멤버변수 사용
System.out.printf("TestClass1.memberA : %d\n", TestClass1.memberA); <<< 불가능
TestClass1.method1();
- memberA는 Static을 사용하지 않았기 때문에 객체를 생성하여 접근해야 한다.
- 해당 코드는 오류가 발생한다.
// 객체를 생성한다.
TestClass1 t1 = new TestClass1();
// 객체 참조 변수를 통해 객체의 멤버에 접근한다.
System.out.printf("t1.memberA : %d\n", t1.memberA);
t1.method1();
// 객체 참조 변수를 통해 static 요소에 접근한다.
System.out.printf("t1.memberB : %d\n", t1.memberB);
t1.method2();
- 해당 클래스의 객체를 생성한다.
- Static을 사용한 멤버변수나 멤버메서드는 객체 생성 전부터 메모리 상에 올라가있으므로 상관없이 호출이 가능하다.
'Computer > Java' 카테고리의 다른 글
[7일차 Java] 중첩 클래스 (0) | 2023.05.06 |
---|---|
[7일차 Java] final (0) | 2023.05.06 |
[6일차 Java] 캡슐화 (0) | 2023.05.05 |
[6일차 Java] 접근 제한자 (2) | 2023.05.05 |
[6일차 Java] 오버라이딩(Overriding) (0) | 2023.05.05 |