[Java] static

2022. 10. 5. 14:55Dev.Program/Java & Spring

728x90

static 계속 이어서 설명 (복습)

======== 오늘날짜 프로젝트 만들기 JAVA0224 - Ex.java 만들기

static이 붙은 메서드에 대해 알아보자.

  • ⇒ 실행은 잘 되는데 노란 밑줄 그임. (정석적인 접근 방법이 아님!)

  • 정상 적인 접근 방법(클래스명.메서드()) → 결과는 같다

 

> static 메서드도 변수처럼 인스턴스 생성과 관계없이 클래스명만으로 접근 가능

  • 이렇게 인스턴스 생성 전인 위쪽으로 옮겨도 실행 된다! (오류 안남)

>

static 변수는 한놈이 바뀌는 순간 나머지도 다 바뀜! (이것만 주의하면 된다)

static 메서드는 제약이 걸림 → 밑에서 더 알아볼 거!

< static 메서드(= 정적 메서드) >

  • 메서드 선언 시 리턴타입 앞에 static 키워드를 붙여서 정의
  • 클래스가 메모리에 로딩될 때 static 변수와 함께 메모리에 로딩되므로 인스턴스 생성과 무관 ⇒ 클래스명만으로 접근이 가능
  • (클래스명.메서드명() 형태로 호출)

< static 메서드 사용 시의 주의사항 >

  • 인스턴스 생성 시점에서 생성되는 것들은 static 메서드 내에서 접근 불가능
  1. this 또는 super 사용 불가
    • ⇒ 원인 : static 메서드가 로딩되는 시점은 클래스가 로딩되는 시점이며 인스턴스 생성 전이므로 인스턴스 주소가 저장되는 레퍼런스가 없음
    • ⇒ 동일한 변수명 사용 시 해결책 : this.XXX 이나 super.XXX 대신 클래스명.XXX 사용으로 대체
  2. 인스턴스 변수 사용 불가
    • ⇒ 원인 : static 메서드가 로딩되는 시점은 클래스가 로딩되는 시점이며 인스턴스 변수는 인스턴스 생성 후에 메모리에 로딩되므로 static 메서드가 로딩되는 시점에서는 존재하지 않는 변수이다!
  3. 메서드 오버라이딩 불가

 

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 멤버와 인스턴스 멤버 메모리 할당 순서 >

  1. static 키워드가 선언된 모든 멤버가 메모리에 로딩됨
  2. static 멤버가 메모리에 로딩될 때 static 변수 a, c 에 check() 메서드 호출 후 리턴값이 할당되어야 하므로 check() 메서드 호출됨
    • ⇒ "call : 1" 출력 → "call : 3" 출력
  3. main() 메서드가 자동으로 호출됨
    • ⇒ "main() 메서드" 출력
  4. main() 메서드 내에서 Ex2 인스턴스 생성됨 ⇒ 인스턴스 변수 b 메모리에 로딩됨
  5. 인스턴스 변수 b 가 로딩될 때 check() 메서드 호출됨
    • ⇒ "call : 2" 출력

 

728x90