데이터 메모리 영역 = static(정적인) 메모리 영역
-stack,heap 메모리영역에 올라가기 전에 static 메모리영역이 더 빨리 뜬다.
음.. 예시를 들어보자
첫번째 예시)
만약 은행에서 번호표를 뽑는다고 가정한다면
프린터기 1번에서 1번째 뽑은 번호와 프린터기 1123번에서 2번째 뽑은 번호가 같으면 안되겟지요오
따라서 static이라는 영역에 놓고 공유할수 있도록 설계합니다.
==
private 접근제어방식으로 클래스 변수인 waitNumber가 1로 초기화 되어있다.
따라서 waitNumber는 static 메모리영역에 들어가게 되며 그 안에는 1이라는 것이 들어가게 된다.
이 waitNumber변수는 공유가 가능하게 된다.
만약???
static을 뺀다면?? 결과는 두 개의 객체가 다르기 때문에 프린터기는 각각 다르게 번호를 뽑는다.
두번째 예시를 봅시당.
==
속성에 int number = 0 이 static영역으로 들어갔고
각각 객체 학생1과 학생2를 만들었다 (매개변수가 뭔가 많지만 됐고) int number에 학생1은 값:1을 학생 2는 값:2를 넣었다
그런데 짜잔! 결과값은???? 둘다 2가 나왔다 대단해!!
ㅋ......
세번째 예시!)
얘는 좀 뭐가 많다...
잘라서 보자
==
serialNum 은 static 영역에 들어갔다 근데 아직 heap 영역에 객체를 만들지 않았다
그런데도 클래스이름.serialNum 으로 사용이 가능하다! 왜그럴까?
stack과 heap 메모리가 만들어지기전 static 영역이 먼저 만들어지기 때문이다!
접근 제어방식을 사용해 static 변수에 접근해서 값도 변경이 가능하다
(아직 객체를 만들지 않은 상태)
이번에는 serialNum 값을 반환하는 기능(getter 메소드)를 만들었다.
만약 static을 빼버린다면?
쓸 수가 없다 ㅎㅎ..
주의점!!
static 메소드 안에서 멤버 변수를 사용할수 없다!!!!
왜냐? 아직 heap영역엔 객체가 생성되기 전이기 때문이다.
그냥 static 메소드 안에서는 멤버 변수를 사용하지 말자 ㅎㅎ..
★ 싱글톤 패턴 (singleton pattern)
싱글톤 패턴이란?
● 프로그램에서 인스턴스가 단 한 개만 생성되어야 하는 경우 사용하는 디자인 패턴
● static 변수, 메서드를 활용하여 구현 할 수 있음
한마디로 인스턴스(객체)가 단 한개만 있어야 할때를 말한다.
예시)
==
1. 일단 생성자의 접근제어가 private이다.
2. 클래스 내부에 유일한 객체인 private 접근제어방식 +
static 클래스이름 참조변수이름 = new 클래스이름(); 로
인스턴스객체 생성과 동시에 초기화를 시켰다.
3. 메소드영역은 heap영역에 있는 객체를 오래 사용하지 않으면 garbage collecter가
먹어버릴수도 있으므로 객체가 null값이라면 다시 새로운 객체를 생성하도록 설계되어 있다.
그렇다면 접근할 수 있는 것은 public으로 된 static메소드 하나뿐이다.
일단 보아야 할것은 static이다.
① Company instance = new Company(); 는 메모리 영역에 각각
(instance = static 메모리 / new Company() = heap메모리)에 들어간다.
(instance는 인스턴스 주소가 담기게 된다.)
그러면 짜잔!
생성자도 못들어가 그렇다고 Company(클래스이름).instance로도 못들어간다?
객체 주소를 받을 수 있는 방법은?
② getter메소드로만 instance 주소값을 받을 수 있는 것이 된다.
또한 instance가 static이기에 static 메소드로 적어주어야 한다
메소드에 static을 적지 않았을때 주소값을 받지를 못한다. (오른쪽 메인)
오른쪽 naver , tenco , mata는 stack에 쌓인게 되고 메소드 return 값인 instance주소를 불러오게 된다.
한마디로 naver, tenco, mata는 같은 주소값을 가지게 되는것이다.
'JAVA' 카테고리의 다른 글
JAVA - 상속 (0) | 2023.08.07 |
---|---|
JAVA - 1차원 배열 (0) | 2023.08.04 |
JAVA - this의 특징들 (0) | 2023.08.02 |
JAVA - 접근 제어 방식 / getter 와 setter (0) | 2023.08.01 |
JAVA - 인스턴스, 생성자 (0) | 2023.07.31 |