1. static (정적) 멤버
1) static 변수나 메소드는 static 메모리 구역에 따로 고정적(정적)으로 할당되어 관리됨. 그래서 이 static 필드는 클래스가 공통으로 사용할 수 있음. (클래스에 고정된 필드와 메소드. 정적 필드, 정적 메소드 라고도 함)
2) 객체 내부에 존재하지 않고 메소드 영역에 고정되어 존재. (객체를 생성하지 않고 클래스로 바로 접근해서 사용함)
3) static 메서드는 객체 생성 없이 사용 가능하기 때문에 인스턴스 변수 사용 불가능.
4) static 자체가 고정의 의미와 공유의 의미를 가지고 있어서 객체마다 공유하여 사용 가능함.
5) static 멤버 선언 : 필드 또는 메소드를 선언할 때 static 키워드를 붙이면 됨.
6) static 멤버 사용 : 객체 생성 없이 '클래스이름.메서드이름()'으로 호출. ex) Math.random(), Math.round()
7) static 생성시 메모리 구조 알아보기
- 우리가 항상 쓰던 new 연산자로 객체를 생성하는 것은 heap 영역에 저장되어 프로그램이 실행하는 중간에 메모리를 할당함. 그래서 메서드가 끝나서 쓸 일이 없어지면 자바의 가비지 컬렉터(GC)에 의해서 메모리에서 수거됨.
- 하지만 static 은 프로그램이 실행 전 먼저 메모리에 잡히게 되고 프로그램이 종료될 때 해제됨. 즉, heap 의 영역보다 나중에 정리 된다는 뜻. (이 때 '프로그램 실행 전' 이라고 하는 것은 프로그램이 메모리에 적재되고 명령어를 수행하기 전을 뜻하는 것.)
- 아래 그림을 보면 static 은 가장 먼저 메모리에 적재되어 정적(static)으로 존재하기 때문에 static 멤버나 메서드는 클래스의 객체 생성없이 클래스 이름만 가지고도 사용할 수 있음.
- '정적 메서드에서는 정적 메서드나 정적 변수만 사용할 수 있고, 멤버 변수는 사용할 수 없다.' 는 말의 뜻도 바로 이런 이유에서임. (정적 메서드가 할당 될 때 멤버 변수는 프로그램 실행 전 할당 되기 전이므로)
2. 인스턴스 멤버
1) 객체 생성 후 '참조변수.메서드이름()' 으로 호출
2) 메서드 내에서 인스턴스 변수 사용 가능
3. 인스턴스 멤버 선언 vs static 멤버 선언 의 기준
1) 필드
- 객체마다 가지고 있어야 할 데이터 => 인스턴스 필드
- 공용적인 데이터 => static 메소드 (필수 요소는 아니지만 메모리 절약 가능)
2) 메소드
- 인스턴스 필드로 작업해야 할 메소드 => 인스턴스 메소드 (객체가 있다거나 등의 이유)
- 인스턴스 필드를 사용하지 않는 메소드 => static 메소드
4. static 메소드와 static 블록 작성시 주의할 점
1) 객체가 없어도 실행할 수 있기 때문에, 블록 내부에 인스턴스 멤버를 사용할 수 없음.
2) 그렇기 때문에 인스턴스 메서드를 호출할 수 없음. (반대로 인스턴스 메서드는 static 메서드 호출 가능)
2) 객체 자신의 참조인 this 를 사용할 수 없음.
참고 : [한빛미디어] 이것이 자바다 (신용권의 Java 프로그래밍 정복) Chapter 6.클래스
참고 : [도우출판] JAVA의 정석(3ND EDITION)-자바의 정석 최신 Java 8.0 포함 Chapter 6.객체지향 프로그래밍 |
참고 : https://reakwon.tistory.com/187?category=300670
'JAVA' 카테고리의 다른 글
생성자 super() vs 참조변수 super (0) | 2022.08.28 |
---|---|
상속과 포함 (0) | 2022.08.28 |
접근 제어자와 캡슐화 (0) | 2022.08.28 |
클래스 구성 요소 (필드, 생성자, 메소드) (0) | 2022.08.28 |
생성자 this() vs 참조변수 this (0) | 2022.08.28 |
댓글