일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- collection framework
- 자바 List
- JSR - 380
- 오라클 DROP
- annotation
- 자바
- 스프링 파라미터 추출
- 오라클 TRUNCATE
- 자바스크립트
- properties 파일 주입
- Spring Cookie
- DDL TRUNCATE
- Spring 커맨드 객체
- JSR - 303
- 자바오류
- Mybatis 오류
- 코드로 배우는 스프링 웹 프로젝트
- Dependency Injection
- Spring
- properties 변수
- 스프링 인터셉터
- Spring MVC Interceptor
- properties 파일
- DDL DROP
- 오라클 CREATE
- Spring MVC5 기본 세팅
- Spring 객체로 주입받기
- ddl alter
- Spring message
- Servlet cookie
- Today
- Total
개발이좋아
[Java] static 변수와 static 메서드 본문
static 변수 즉, 정적 변수는 변수를 여러 클래스에서 공통으로 사용해야 할 때 쓰는 변수이다.
여러 클래스에서 사용해야 할 변수는 예를 들어 하나의 클래스에 선언한 변수 값을 그 클래스의 여러 인스턴스를 생성할 때마다 변수 값을 공유해가며 변수의 값을 증가시키거나 감소시킬 때 유용하게 쓰인다.
Card클래스를 만들고 Card클래스의 인스턴스를 여러 개 생성했을 때 클래스에 선언한 카드 넘버 속성 값을 자동으로 증가시키거나 감소시키는 등 변수의 값을 여러 인스턴스에서 공유가 가능한 것이 정적 변수 (static변수)이다.
또 한 static변수는 인스턴스가 생성과 상관없이 static변수가 먼저 생성되어 인스턴스를 생성하지 않고도 클래스 이름으로 바로 접근하여 사용할 수 있다.
static 변수 선언
static 변수의 선언은 자료형 앞에 static 예약어를 붙여서 선언한다. 아래의 코드가 선언 예이다.
public static int cardNum = 10000;
static 변수 사용
위에서 static변수는 값을 공유한다고 하였다. 여러 인스턴스를 만들고 각 인스턴에서 static변수 값을 증가시켰을 때 증가된 값은 그 클래스로 생성한 모든 인스턴스에 적용된다.
위의 사진은 static 변수를 선언한 클래스이다.
신용카드 등에는 카드 번호가 있는데 이 카드 번호는 카드를 발급할 때마다 카드번호가 증가될 것이다.
위의 사진도 Card클래스의 인스턴스가 생성될 때마다 카드번호가 증가하는 예제이다.
멤버 변수로 static 변수인 cardNum과 고객이름, 고객 카드번호를 나타내는 변수가 선언되어 있으며 생성자에서 고객 이름을 매개변수로 받고 customerCardNum(고객 카드번호) 변수에 cardNum(카드 번호)를 대입하고 있다.
그 후 cardNum값이 1 증가한다. 즉 인스턴스를 생성할 때마다 카드 넘버가 증가하는 것이다.
그 후에 showCardInfo메서드에서 카드 정보를 출력해 주는 기능이 구현되어 있다.
그 후 main메서드 안에서 Card 클래스를 생성하고 각 각 생성된 인스턴스의 참조 변수로 showCardInfo( ) 메서드를 호출하고 있다.
결과는 아래와 같다.
고객 카드번호(customerCardNum)의 값이 1씩 증가한 모습을 볼 수 있다.
위 예제어서 볼 수 있듯 static변수는 인스턴스에서 값을 공유한다. 그 이유는 스택 메모리에 있는 참조 변수가 데이터 영역에 선언된 동일한 static변수의 메모리를 가리키고 있기 때문이다.
static 변수는 인스턴스를 생성할 때마다 만들어지는 것이 아닌 클래스를 선언할 때 특정 메모리에 저장되어 모든 인스턴스가 공유하는 변수이다. 인스턴스보다 먼저 생성되기 때문에 인스턴스를 생성하지 않고도 클래스의 이름으로 접근할 수 있다.
위와 같이 인스턴스를 생성하지 않고도 클래스 이름으로 바로 접근할 수 있다.
static 메서드
static 메서드는 static 예약어를 사용한 메서드로 '클래스 메서드' 라고도 한다.
접근제한자 static 자료형 메서드이름( ) { }
static 메서드는 위와 같은 형식으로 선언하며 주의할 점은 static 메서드 안에는 인스턴스 변수를 사용할 수 없다.
그 이유는 간단한데 static메서드는 인스턴스가 생성되기 전에 먼저 생성되기 때문이다. 즉 먼저 생성되는 static 메서드에 아직 생성되지 않은 클래스의 인스턴스 변수를 사용할 수 없는 것이다. 이는 변수의 유효 범위와 관련이 있다.
위 와 같이 static 메서드 안에 인스턴스 변수를 사용하려 하면 에러가 발생한다.
static 메서드 또한 static 변수와 마찬가지로 인스턴스를 생성하지 않고도 클래스의 이름으로 바로 접근하여 호출할 수 있다.
본 포스팅은 필자가 공부한 것을 정리해놓은 것으로 오류가 존재할 수 있습니다.
참고:Do it! java 프로그래밍 입문
'Java' 카테고리의 다른 글
[Java] 싱글톤 패턴 (Singleton Pattern) (0) | 2019.12.14 |
---|---|
[Java] 변수 유효 범위 (0) | 2019.12.12 |
[Java] Wrapper 클래스, 오토박싱과 언박싱 (0) | 2019.12.10 |
[Java] toString( ) 메서드와 equals(Object obj) 메서드 (0) | 2019.12.09 |
[Java] 템플릿 메서드 (Template Method) (0) | 2019.12.08 |