Java Study #9

allzeroyou·2022년 2월 4일
0

Java

목록 보기
9/14

1. 접근 지정자

자바 제어자(modifier)는 클래스, 필드 ,메서드, 생성자 등에게 어떠한 특징을 부여하는 문법 요소.
'쓴 커피', '맛있는 사과'와 같이 커피, 사과(클래스나 멤버)를 꾸며 주는 형용사 쯤으로 생각.
접근 지정자는 자바 제어자의 한 종류로, 클래스, 멤버, 생성자 앞에 위치할 수 있으며, 사용 범위를 정의하는 역할
접근 지정자는 멤버(필드, 메서드, 이너클래스)와 생성자.
즉, 클래스의 내부 구성 요소 4가지 앞에 붙어 있는 때와 클래스 자체에 붙어 있는 때를 나눠 생각해야.

1-1. 멤버 및 생성자의 접근 지정자

멤버 및 생성자에는 public, protected, default(또는 package), private라는 4가지의 접근 지정자 사용 가능.
이때 접근 지정자는 필드나 메서드 또는 생성자 앞에 위치.
만약 아무것도 지정 안할때는 default 접근 지정자가 자동으로 설정됨.
4가지 접근 지정자 중 public의 사용 범위가 가장 넓으며 private이 가장 좁음.

접근 범위
public > protected > default > private

  • private
    자신의 클래스 내부에서만 사용할 수 있는 접근 지정자.
    같은 멤버끼리만 사용가능
  • default
    같은 패키지 안의 모든 클래스에서 사용할 수 있는 접근 지정자
    package 접근 지정자라고도 함
  • protected
    같은 패키지의 모든 클래스에서 사용가능
    default와 다른 점은 다른 패키지의 자식 클래스 안에서 사용할 수 있음.
  • public
    동일 패키지의 모든 클래스에는 물론, 다른 패키지의 모든 클래스에도 접근 가능
    어디에서나 사용 가능

1-2. 클래스의 접근 지정자

클래스에서는 public, default 접근 지정자만 사용 가능.
class 키워드 앞에 public이 있거나 없거나임.
마찬가지로 default 클래스는 같은 패키지 내에서만 사용 가능. public 클래스는 다른 패키지에서도 사용 가능.
클래스를 default로 지정 -> 다른 패키지에서 임포트 불가.

1-3. 클래스의 접근 지정자와 생성자 접근 지정자의 연관성

클래스에 생성자가 없을 때 컴파일러는 기본 생성자를 자동으로 추가.
이때 자동으로 추가되는 생성자의 접근 지정자는 클래스의 접근 지정자에 따라 결정.
클래스가 public 이라는 것은 다른 패키지에서 임포트 가능, 패키지가 public이라는 것은 생성자를 호출해 객체생성 가능.

  • 생성자를 정의하지 않았을 때, 클래스가 public이면 자동으로 추가되는 생성자도 public
    따라서, 클래스와 생성자에 모두 public 접근 지정자 O
    다른 패키지에서 클래스를 임포트, 생성자 호출 가능

  • 클래스가 default이면 자동으로 추가되는 생성자도 default
    다른 패키지에서는 임포트 불가. 생성자 또한 default이므로 호출 불가.
    클래스가 임포트 되지 않으면 생성자는 접근 지정자와 상관없이 호출 자체 불가.(클래스 내부에 생성자 존재)

  • 클래스가 public 접근 지정자인데 생성자는 default 접근 지정자로 정의
    다른 패키지에서 임포트 가능 but 생성자를 호출 불가. 객체 자체 생성 불가.

  • 클래스가 default이고 생성자가 public이면 다른 패키지에서 임포트 불가. 생성자가 public이라도 다른 패키지에서 클래스 자체가 인식 불가. 객체 생성 x

2. static 제어자

static은 클래스의 멤버(필드, 메서드, 이너클래스)에 사용하는 제어자.
클래스의 멤버를 다른 클래스 내에서 사용하기 위해 가장 먼저 클래스의 인스턴스를 생성해야 햇음.
인스턴스 안에 있을 때 사용할 수 있는 상태가 되는 멤버를 인스턴스 멤버라고 함.
인스턴스 멤버는 static이 붙지 않은 것.
static이 붙은 멤버를 정적 멤버라고 함.

  • 정적 멤버는 인스턴스의 생성없이 클래스명.멤버명만으로 바로 사용가능

2-1. 인스턴스 필드와 정적 필드

인스턴스 필드를 사용하기위해 먼저 인스턴스를 생성한 후 참조 변수명.인스턴스 필드명과 같이 사용 가능.
인스턴스 필드인 m의 저장공간은 인스턴스 내부에 생성.
m을 사용하기 위해서는 반드시 인스턴스를 먼저 생성해야.
또한 저장 공간이 힙 메모리에 위치 -> 해당 저장 공간에 값을 읽거나 쓰기 위해서는 참조 변수명을 사용해야 함.

반면 정적 필드는 클래스명.정적필드명처럼 사용
정적 필드인 n은 클래스 내부에 저장 공간을 지니고 있기 때문에 인스턴스 생성 없이 바로 사용 가능.
이때 인스턴스 내부에 정적 필드인 n도 존재. 다만 n의 실제 저장공간은 정적 영역 내부에 있으며, 인스턴스 내부의 n은 실제 정적 필드의 저장 공간의 참조값만을 포함.
=> 따라서 인스턴스 필드처럼 참조 변수명으로 사용 가능

  • 기억해야 할 정적 필드의 특징
    정적 필드는 객체 간 공유 변수의 성질이 있음
    인스턴스 필드와 정적 필드의 메모리 구조상 차이를 정확히 알아야 함.






📕 참고문헌) Do it! 자바 완전 정복!
profile
모든 건 zero 부터, 차근차근 헛둘헛둘

0개의 댓글