Archives
Recent Posts
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[7일차 Java] Static 본문

Computer/Java

[7일차 Java] Static

Wise-99 2023. 5. 6. 22:11

 

 

출처 : 안드로이드 앱스쿨 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