일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- SpringBoot 2
- 수학
- Easy
- input
- Kadane's Algorithm
- scanner
- JAVA11
- 사칙연산
- array
- R
- 자바 스레드 실행 순서 제어
- hash table
- heroku
- 자바입력
- 카데인 알고리즘
- 자바 thread 실행 순서 제어
- Today
- Total
DeFacto-Standard IT
[Java] static 키워드 본문
클래스 메서드는 static method라고 한다. static 키워드를 붙인 method이다.
반대로 static 키워드를 붙이지 않으면 인스턴스 메서드라고 한다.
static키워드를 붙이면 인스턴스를 생성하지 않아도 클래스명.메서드명과 같이 호출할 수 있다.
static 키워드에 대한 설명은 다음과 같다.
1. 멤버변수 중 모든 인스턴스에 공통적으로 사용하는 것들에 사용
생성된 각 인스턴스는 독립적이므로, 각 인스턴스 변수들은 서로 다른 값을 가진다. 그러나 한 클래스의 메서드의 호출 횟수라던지 (여러 인스턴스라도 같은 클래스라면 증가)의 경우에는 모든 인스턴스에서 같은 값을 가져야 하므로 static변수를 설정해야 한다.
2. static 변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
클래스가 메모리에 올라갈 때 이미 자동적으로 생성되기 때문
3. static 메서드는 인스턴스 변수를 사용할 수 없다.
static method는 인스턴스 생성 없이 호출이 가능하다. 그 이유는 2번과 같다. 이는 다르게 말하면, 인스턴스 생성이 안된 상태에서 호출하기 때문에, 인스턴스를 생성해야 만들어지는 인스턴스 변수는 호출할 수 없다는 말이 된다.
당연히, 반대로 인스턴스 메서드는 static 변수를 사용하는 것이 가능하다.
4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면 static을 붙이는 것을 고려한다.
메서드 호출시간이 짧아지기 때문에 효율이 좋다. 인스턴스 메서드는 실행 시 호출할 메서드를 찾는 과정이 필요하므로 시간이 더 소요된다.
5. 이것은 main함수가 static으로 지정되는 것과도 연관성이 있다.
클래스멤버와 인스턴스 멤버간의 참조와 호출
인스턴스 멤버가 존재하는 시점에서, 클래스 멤버는 항상 존재하지만
클래스 멤버가 존재하는 시점에서는 인스턴스가 생성되지 않았을 가능성이 있다
따라서 인스턴스 변수에 static 변수의 값을 넣는 것은 가능하지만
static 변수에 인스턴스 변수의 값을 넣는 것은 불가능하다.
만약 static 변수에 인스턴스 변수의 값을 넣으려면 다음과 같이 해야한다.
class User{
int num = 10;
static int staticNum = new User().num;
}
Singleton Pattern
싱글톤 패턴은 java에서 어디에서나 호출할 수 있으며 해당 클래스에 대한 인스턴스를 어플리케이션에서 단 한개만 생성하는 것을 보장하는 패턴을 말한다. 이는 멀티 쓰레드 환경에서 여러 객체를 생성하지 않아야 할 때 사용되기도 하지만, 반대로 멀티 쓰레드 환경에서 가장 신경을 많이 써야하기도 한다.
그 이유는 OS에서 Context-Switching, Thread와 관련이 있다. Thread가 여러 개인 상황을 멀티 쓰레드하고 부르고 이 쓰레드는 각각 동작하기 때문에, 단순히 if문을 사용하여 인스턴스의 생성을 제어한다면 Context-Switching 시에 2개의 객체가 생성될 여지가 있으므로 synchronized 키워드를 써서 동기화한다.
static을 쓰는 패턴이므로 자세한 것은 디자인 패턴을 공부하길 바란다.
'Java > Basic' 카테고리의 다른 글
[Java] 접근제어자를 사용하여 캡슐화를 하는 이유 (1) | 2017.10.01 |
---|---|
[Java] Method Overloading, Method Signature, Method Type (0) | 2017.09.19 |
[Java] 메모리 영역 3가지 (0) | 2017.09.19 |
[Java] Math.random() 랜덤으로 숫자, 문자 얻기 (0) | 2017.09.19 |