티스토리 뷰
포스팅에 앞서 내용이 틀릴 수 있습니다.
해당 부분 지적 감사히 받습니다.
static에 대해 자세히 알아보자.
저번 시간에 static이 붙은 요소들은 객체 생성 시 힙영역이 아니라 메서드 영역의 메모리가 관리된다고 배웠었다.
우리는 다른 클래스의 요소를 가져다 쓰기 위해 객체를 항상 생성했었다.
그런데 객체를 생성하면 힙 영역에 들어간다고 하지 않았나?
자 그러면 어느 시점에 다른 class의 static 변수가 메서드 영역에 적재될까?
바로 해당 class를 참조하는 시점부터 적재된다.
아래 예시 코드를 보면 된다.
static2 Class
public class static2 {
static int a = 1;
}
static1 Class
public class static1 {
public static void main(String[] args) {
System.out.println(static2.a);
}
}
객체를 생성할 필요 없이 바로 ClassName 참조로 접근이 가능하며, 이 순간부터 메서드 영역에 적재되는 것이다.
그렇다면 이러한 static을 사용하는 이유가 무엇일까?
개발자의 의도에 따라 모두 이유가 다르겠지만, 하나의 예제를 통해 사고를 적립해 보자.
Class static2
package a;
public class static2 {
static int count;
static2(){
count++;
}
}
Class static1
package a;
public class static1 {
public static void main(String[] args) {
static2 s1 = new static2();
static2 s2 = new static2();
static2 s3 = new static2();
static2 s4 = new static2();
System.out.println(a.static2.count);
}
}
객체가 몇 개가 생성되었는지 확인하기 위해 위와 같이 사용할 수 있다.
또한 아래와 같이 접근할 수도 있다.
System.out.println(a.static2.count);
패키지명. Class명. 클래스변수명으로도 접근이 가능하다.
static이 붙은 요소는 인스턴스 요소로의 접근이 불가능하다.
여기서 나의 호기심이 발동했다.
진짜 방법이 없을까?
방법이 있더라
test1 Class
public class test1 {
public test1(){
System.out.println("호출");
}
public static void main(String[] args) {
Data data = new Data();
static2 s2 = new static2();
s2.dataCountPlus(data);
static2.showCount(data);
}
}
Data Class
public class Data {
int count2 = 0;
public void print() {
System.out.println("안녕 나는 메소드를 출력하는 메소드야");
}
}
static2 Class
public class static2 {
public static void dataCountPlus(Data data){
data.count2++;
}
public static void showCount(Data data){
System.out.println(data.count2);
}
}
static2 Class에서 static으로 선언된 dataCountPlus 메서드의 매개변수를 바로 Data 타입으로 받는 것이다..
물론 궁금증을 해결하기 위해 억지로 만든 코드라 실용 가능성에 대해서는 아직 잘 모르겠지만,
static 요소더라도 결국 어디선가 생성된 인스턴스의 참조값을 넘겨주면 static 메서드에서 멤버변수에 접근할 수 있다.
실행 결과
안 되는 게 어딨어 ㅋㅋ
주소값에 대해 중요성을 다시금 느낀다.
오늘은 주말이라 자바 강의를 켜놓고, 멈춰가며 포스팅을 작성 중이었는데,, 바로 영상 뒷부분에서 내 궁금증을 언급해 주며 된다고 해주셨다..
뿌듯하다.
++ 참조 값이 넘어오는 경우에는 static이고 인스턴스고 상관없이 접근 가능하다.
자 static에 접근하려면 앞에 클래스명. 메서드명() 이런 식으로 접근하는 것이 가능하다고 했었다.
근데 만약 프로그램이 크고 static 요소에 접근하는 횟수가 많다면, 계속 class 명을 앞에 붙여주는 것이 지저분하지 않을까?
이런 경우를 위해서 import를 사용할 수 있다.
import static a.static2.dataCountPlus;
이런 식으로 import static 패키지명. Class명. 메서드명으로 바로
dataCountPlus();
static 메서드에 접근할 수 있게 된다.
코드가 훨씬 깔끔해졌다.
또한
import static a.static2.*;
이렇게 *을 넣어 사용도 가능하다.
static2 Class의 모든 정적 요소에 Class명 없이 접근이 가능해진 것이다.
마찬가지로 static 변수에도 적용된다.
'기술스택 > 자바(Spring)' 카테고리의 다른 글
자바 상속(Inheritance) (4) | 2025.02.09 |
---|---|
자바 final (1) | 2025.02.08 |
자바 메모리 구조 - 메서드, 스택, 힙 영역 (2) | 2025.02.08 |
자바 접근제한자(Access Modifier) + 캡슐화(Encapsulation) (1) | 2025.02.07 |
자바 NullPointException (1) | 2025.02.05 |
- Total
- Today
- Yesterday
- webhacking.kr
- 상품을 구매한 회원 비율 구하기 파이썬
- static
- 자바
- 백준 피보나치 수열
- 김영한
- los 15단계
- zixem
- extends
- 스프링
- 코딩테스트 준비
- 김영한 실전 자바 기초
- 상속
- 백준 피보나치
- 프로그래머스
- 김영한 실전 자바 기본
- 기술스택
- samron
- 김영한 실전 자바 중급
- Los
- 프로그래머스 상품을 구매한 회원 비율 구하기 파이썬
- ys.k
- java
- los 15
- 프로그래머스 상품을 구매한 회원 비율 구하기
- lord of sql
- 코딩테스트
- 백준
- samron3
- spring
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 |