231218 JAVA static01(인스턴스 멤버, 정적 멤버)

2023. 12. 19. 20:572023.11.21-2024.05.31

package static01;

 //2023-12-18 프로그래밍 언어활용(12/26) 270ㅔ

 

 //인스턴스 멤버                          정적 멤버

 /*

  * static 키워드

  * static 정적 이라는 의미가 있습니다.

  * 자바에서는 정적 개념과 동적 개념이 있습니다.

  * 쉽게 표현하면 정적은 클래스가 로드되는 시점을 말합니다

  * 동적은 로드된 클래스가 실행된 이후를 말합니다.

  *

  *

  * 이 중 객체는 동적 데이터라고 해서 프로그램이 실행된 이후에 발생하는 대표적인 형태입니다.

  *

  * 인스턴스 멤버

  * 인스턴스 생성시 가지게 되는 자신의 변수

  * 인스턴스명.변수명 으로 호출

  * 인스턴스를 생성한 후에 사용해야 합니다.

  * 인스턴스

  * new 있어야 쓸 수 있다.

  *

  * 정적 멤버

  * 모든 객체가 공동적으로 사용하는 변수

  * 클래스명.변수명 으로 호출

  * 인스턴스 없이 클래스명으로 바로 불러서 사용할 수 있습니다.

  * 하나의 클래스에 하나의 변수만 사용가능합니다.

  * 인스턴스 보다는 클래스에 의지(연결)해서 사용합니다.

  * static을 붙여서 사용합니다.

  * new 없어도 쓸 수 있다.

  *

  * 사용시 주의사항

  * 인스턴스가 생성되지 않은 상테에서 호출되는 변수/메소드 이므로

  * 인스턴스 안에서만 사용되는 인스턴스 변수를 쓸 수 없습니다.

  * 정적 변수와 지역 변수만 사용할 수 있습니다.

  *

  * 정적 메소드에서 인스턴스 메소드를 호출하면 오류가납니다.

  *

  * 인스턴스 메소드로 객체가 생성되어야만 사용가능하기 때문입니다.

  *

  * 정적 메소드에서 정적 메소드 호출은 가능합니다.

  * 인스턴스 메소드에서 정적 메소드 호출 가능합니다.

  *

  * 정적 메소드는 this키워드를 쓸 수 없습니다ㅏ.

  * (this는 인스턴스 생성 후 씀) -> this가 참조할 인스턴스가 없습니다.

  *

  * final 붙인 상수는 모두가 변경없이 사용하는 상수....

  * 인스턴스를 만들지 않고 쓸 수 있으면 좋습니다.

  *

  * 그래서 final static을 붙입니다.

  *

  * */

 

 

 class Cat {

 static String name;

 int age;

 static double pi = 3.14195;

 

 public static void print() {

 

 }

 }

 

 

  • Cat 클래스:
    • static String name;: 정적(static) 멤버인 name은 클래스에 속하며, 여러 인스턴스가 이 값을 공유합니다.
    • int age;: 인스턴스 멤버인 age는 각각의 인스턴스가 자체적으로 가지는 값입니다.
    • static double pi = 3.14195;: 정적(static) 상수 멤버 pi는 클래스에 속하며, 모든 인스턴스에서 동일한 값을 갖습니다.

 

 public class Static01 {

 public static void main(String[] args) {

 Cat.name = "R2D2";// 인스턴스 생성 전에 사용가능

 Cat.name = "3PO";// 인스턴스 없이 클래스명으로 호출해서 사용가능

 Cat.pi = 3.14195;// 상수

 

 Cat cat = new Cat();

 Cat cat2 = new Cat();

 

 cat.age = 10;

 cat2.age = 120;

 

 System.out.println(cat.age);

 System.out.println(cat2.age);

 System.out.println(cat.name);

 System.out.println(cat2.name);

 

 }

 

 }

 

 

  • Static01 클래스:
    • public static void main(String[] args) 메서드는 프로그램의 시작점입니다.
    • Cat.name = "R2D2";: 클래스의 정적(static) 멤버 name에 직접 접근하여 값을 설정할 수 있습니다. 클래스의 인스턴스를 생성하지 않고도 클래스명으로 접근 가능합니다.
    • Cat.name = "3PO";: 클래스의 정적(static) 멤버 name에 새로운 값을 할당합니다.
    • Cat.pi = 3.14195;: 클래스의 정적(static) 상수 멤버 pi에 값을 할당합니다. 상수는 한 번 할당되면 변경할 수 없습니다.
    • Cat cat = new Cat();과 Cat cat2 = new Cat();로 두 개의 Cat 클래스 인스턴스를 생성합니다.
    • cat.age = 10;과 cat2.age = 120;로 각 인스턴스의 age 값을 설정합니다.
    • System.out.println(cat.age);와 System.out.println(cat2.age);로 각 인스턴스의 age 값을 출력합니다.
    • System.out.println(cat.name);과 System.out.println(cat2.name);으로 클래스의 정적(static) 멤버 name을 출력합니다. 정적(static) 멤버는 클래스의 모든 인스턴스가 공유하므로 동일한 값을 출력합니다.
  • 이전에 제시한 코드에서 cat과 cat2는 같은 클래스의 인스턴스이기 때문에 cat.name과 cat2.name은 동일한 정적(static) 멤버 name을 가리키게 됩니다. 즉, 클래스의 모든 인스턴스에서 name은 공유되기 때문에 어떤 인스턴스에서 값을 변경하면 다른 인스턴스에서도 같은 값을 가지게 됩니다.

 

 10

 120

 3PO

 3PO