[Java] static
2022. 10. 5. 14:55ㆍDev.Program/Java & Spring
728x90
static 계속 이어서 설명 (복습)
======== 오늘날짜 프로젝트 만들기 JAVA0224 - Ex.java 만들기
static이 붙은 메서드에 대해 알아보자.
- ⇒ 실행은 잘 되는데 노란 밑줄 그임. (정석적인 접근 방법이 아님!)
- 정상 적인 접근 방법(클래스명.메서드()) → 결과는 같다
> static 메서드도 변수처럼 인스턴스 생성과 관계없이 클래스명만으로 접근 가능
- 이렇게 인스턴스 생성 전인 위쪽으로 옮겨도 실행 된다! (오류 안남)
>
static 변수는 한놈이 바뀌는 순간 나머지도 다 바뀜! (이것만 주의하면 된다)
static 메서드는 제약이 걸림 → 밑에서 더 알아볼 거!
< static 메서드(= 정적 메서드) >
- 메서드 선언 시 리턴타입 앞에 static 키워드를 붙여서 정의
- 클래스가 메모리에 로딩될 때 static 변수와 함께 메모리에 로딩되므로 인스턴스 생성과 무관 ⇒ 클래스명만으로 접근이 가능
- (클래스명.메서드명() 형태로 호출)
< static 메서드 사용 시의 주의사항 >
- 인스턴스 생성 시점에서 생성되는 것들은 static 메서드 내에서 접근 불가능
- this 또는 super 사용 불가
- ⇒ 원인 : static 메서드가 로딩되는 시점은 클래스가 로딩되는 시점이며 인스턴스 생성 전이므로 인스턴스 주소가 저장되는 레퍼런스가 없음
- ⇒ 동일한 변수명 사용 시 해결책 : this.XXX 이나 super.XXX 대신 클래스명.XXX 사용으로 대체
- 인스턴스 변수 사용 불가
- ⇒ 원인 : static 메서드가 로딩되는 시점은 클래스가 로딩되는 시점이며 인스턴스 변수는 인스턴스 생성 후에 메모리에 로딩되므로 static 메서드가 로딩되는 시점에서는 존재하지 않는 변수이다!
- 메서드 오버라이딩 불가
2. 인스턴스 변수 사용 불가
⇒ 위에 static 메서드 사용 시의 주의사항에 적힌 원인 잘 보기
- → static 메서드에서 인스턴스 변수 접근하면 오류 생김(빨간 밑줄)
- 오류창 : static 안에서 non-static 필드인 normalVar을 참조할 수 없다는 말
< 자바 프로그램 실행 과정 >☆
0. 소스 코드 작성 및 컴파일(번역) 후 클래스 실행
1. 클래스 로딩 ⇒ static 변수 및 메서드가 메모리에 로딩됨
2. main() 메서드 실행 (자동 실행)
3. 인스턴스 생성 ⇒ 인스턴스 변수 및 메서드가 메모리에 로딩됨
4. (인스턴스 내의) 메서드 호출(실행) ⇒ 메서드 내의 로컬 변수가 메모리에 로딩됨
5. 결과 출력됨
- 실행 과정 중 1번에서 staticMethod() 로딩되고, 3번 인스턴스 생성될 때 normalVar이 로딩되는데 로딩되는 시점이 다르기 때문에 오류남. (normalVar은 아직 생성 전)
1. this 또는 super 사용 불가
⇒ 위에 static 메서드 사용 시의 주의사항에 적힌 원인 잘 보기
- Setter 만 자동완성 만들기 ( Alt + Shift + S → R )
- 우리가 평소 만들던 대로 this. 하면 오류남!
- this. 에는 자기 자신 인스턴스 주소값이 저장됨.
- static 은 class 가 생성될 때 만들어진다. static이 메모리에 로딩 될 때는 인스턴스가 만들어지기 전! 그러므로 this. 는 아직 생성 전이라 저 시점에서는 존재하지 않음. (super 도 마찬가지!)
- 일반 메서드에서 static 메서드도 호출 가능 ( 지금은 필요X )
- static 메서드에서 일반 메서드도 호출 불가능(인스턴스 변수도 접근 불가)
☆☆☆ 생성되는 시점을 잘 생각해보면 호출가능/불가능 을 판별할 수 있다!! 공부하기!!!
3. 메서드 오버라이딩 불가
- StaticMethod 를 상속받는 StaticMethodChild 만들고 오버라이딩 자동완성 켜보기
- 오버라이딩 창 보면 staticMethod() 는 안보인다
- 이렇게 새로 정의하는 문법으로는 사용 가능
- Override 어노테이션(@~~)을 붙이는 순간 오류남!
- (자바 입장에서는 오버라이딩 할 게 없기 때문)
>> 참고
- public static void staticMethod() { } 주석 처리 후에
- main 에서 부르면 부모꺼 부를 수는 있음(상속 받았기 때문에)
- public static void staticMethod() { } 주석을 다시 풀고
- 호출 할 때에는 staticMethod() 자신꺼만 있음(오버라이딩 된 거 아닌 새로 만든거)
<<
======== Ex2.java 만들기
static 생성과 인스턴스 생성 시점 차이(순서)를 알아보자.
- 선생님 따라치기
- : 실행창
> 프로그램 시작하자마자 메모리에 로딩 되는거 : 4개 (static 붙은애들 다!)
- 이런 순서로 진행 됨.
- 좀 더 자세하게 풀어쓰면 아래와 같다.
< static 멤버와 인스턴스 멤버 메모리 할당 순서 >
- static 키워드가 선언된 모든 멤버가 메모리에 로딩됨
- static 멤버가 메모리에 로딩될 때 static 변수 a, c 에 check() 메서드 호출 후 리턴값이 할당되어야 하므로 check() 메서드 호출됨
- ⇒ "call : 1" 출력 → "call : 3" 출력
- main() 메서드가 자동으로 호출됨
- ⇒ "main() 메서드" 출력
- main() 메서드 내에서 Ex2 인스턴스 생성됨 ⇒ 인스턴스 변수 b 메모리에 로딩됨
- 인스턴스 변수 b 가 로딩될 때 check() 메서드 호출됨
- ⇒ "call : 2" 출력
728x90
'Dev.Program > Java & Spring' 카테고리의 다른 글
[Java] 추상(Abstract) 클래스/메서드 (0) | 2022.10.05 |
---|---|
[Java] 싱글톤 디자인 패턴(Singleton Design Pattern) / final 키워드 (0) | 2022.10.05 |
[Java] instanceof 연산자/다형성/자바프로그램실행과정/static (0) | 2022.10.05 |
[Java] 형변환(Type Casting) - 업캐스팅/다운캐스팅 (0) | 2022.10.05 |
[Java] 메서드 오버라이딩(Overriding) (1) | 2022.10.05 |