BackEnd/Java

[Java]OOP Static

Hojung7 2024. 7. 23. 12:20

1. static의 정의

 

1) 뜻 : 정적인 (움직임이 없다)

 

 2) 특징 : 공유

 

static 붙은 필드/메서드는 프로그램 실행 시 * 모두 static 영역에 할당되고

종료시 사라지게 됨

 

 -> 프로그램 실행 중에는 절대 없어지지 않음 == 정적

 

 <-> 객체가 생겼다/사라졌다 함 --> Heap 영역(동적)

 

 - static 붙은 필드 / 메서드는

 

**프로그램 실행 시**

 

클래스명.필드명 / 클래스명.메서드명() 이름으로

 

 static 영역에 할당(생성) 되어지고 어디서든 클래스명.필드명 / 클래스명.메서드명()으로

 

 호출 가능한 상태가 됨!!

 

stack 다시쓰기
Heap - 동적 메모리 영역
- 프로그램 실행 중 객체가 생성/소명하는 영역
- new 연산자를 이용해 클래스에 정의된 내용대로 객체(instance)를 생성

- 소멸 : Garbage Collection이 일정 시간 마다 사용되지 않는 객체를 소멸(메모리 반환)
Static - 정적 메모리 영역
- 프로그램 실행 시 static 키워드가 붙은 필드 / 메서드를 static 영역에 할당(생성)
- 어디서든 공유 가능 (단, public일 경우)

- 클래스명.필드명 / 클래스명.메서드명() 으로 호출

 

#예제

[기능]

package field.pkg3;

public class Korean {
	
	
	// 필드
	
	// static 변수 ( == 클래스 변수 )
	// -> 어디서든 접근 가능하게 public 작성
	
	public static int nationlCode = 82; // 국가코드

	public static int nationalCode;
	
	// 인스턴스 변수
	// -> 만들어진 인스턴스(객체)만 사용 가능한 변수
	// -> 캡슐화 원칙에 의해서 private 설정
	
	private String name;  // 이름
	private String id; 		// 주민 등록 번호

	
	// private 필드 간접 접근 방법 (getter/setter)
	
	// name의 getter
	public String getName() {
		return name;
	}
	
	// id의 getter
	public String getId() {
		return id;
	}
	
	// name의 setter
	public void setName(String name) {
		// 매개 변수 : 전달 받은 값을 저장하는 변수
		// this : (해당 클래스) 해당 객체
		this.name = name;
	}
	// id의 setter
	public void setId(String id) {
		this.id = id;
	}
	
}

 

[실행1]

package field.pkg3;

public class StaticTestRun {
		public static void main(String[] args) {
			
			// Korean 객체 2개 생성
			
			Korean k1 = new Korean();
			
			k1.setName("김철수");
			k1.setId("991004-1234567");
					
			Korean k2 = new Korean();
			k2.setName("박영희");
			k2.setId("991004-1234567");
			
			//--------------------------------------------------
			
			System.out.println("[생성된 객체의 필드 값 확인]");
			
			System.out.printf("k1 : %d / %s / %s \n", k1.nationlCode, k1.getName(), k1.getId() );
			
			System.out.printf("k2 : %d / %s / %s \n", k2.nationlCode, k2.getName(), k2.getId() );
            
            //--------------------------------------------------
		
			System.out.println("\n\n[static 변수 값 변경 확인]");
			
			// static은 값을 공유하고 있기 때문에
			// 한 번만 바꾸면 공유하는 모든 객체의 값이 변경된다!!
			
			k1.nationlCode = 10;
	             // k2.nationalCode = 10; // 불필요한 코드
			
			System.out.printf("k1 : %d / %s / %s \n", k1.nationlCode, k1.getName(), k1.getId() );
			
			System.out.printf("k2 : %d / %s / %s \n", k2.nationlCode, k2.getName(), k2.getId() );
	     }
}

 

#결과

 

[실행2] 

// 왜 k1.nationalCode / k2.nationalCode에 노란줄이 떠있을까??
			
			// The static field Korean.nationalCode
			// should be accessed in a static way
			
			//-> 정적 방식으로 접근하는 게 좋아~
			// -> static 영역에 생성된 이름으로 호출하는 게 좋다!
			System.out.println("\n\n");
			
			System.out.println("[static에 선언된 이름 사용하기]");
			
			System.out.println("Korean.nationalCode : " + Korean.nationlCode);
			
			System.out.println("-- 값 변경 --");
			
			Korean.nationalCode = 1; 
			System.out.println("Korean.nationalCode : " + Korean.nationalCode);
			System.out.println(k1.nationalCode);
			System.out.println(k2.nationalCode);

 

#결과

 

2. final 변수

 

final 변수 == 상수

 

static 변수 == 공유하는 변수

 

// static fianl 또는 final static

→  공유 가능한 상수

 

 무슨 용도??

 

 전체적으로 사용되면서 변하면 안되는 값

 

ex)

Math.PI (원주율)

Integer.MAX_VALUE (int 최대값)

Integer.MIN_VALUE (int 최소값)

	System.out.println(Math.PI);
	System.out.println(Integer.MAX_VALUE);
	System.out.println(Integer.MIN_VALUE);

#결과

 

'BackEnd > Java' 카테고리의 다른 글

[Java]매개 변수의 다형성 (Polymorphism)  (0) 2024.07.30
[Java]OOP 메서드(method)  (0) 2024.07.25
[Java]OOP_필드(Field)  (1) 2024.07.23
[Java]OOP_클래스  (1) 2024.07.23
[Java]객체지향언어(OOP) 정의 및 Account  (0) 2024.07.23