관리 메뉴

제뉴어리의 모든것

Chapter 7. 제어자 본문

JAVA/자바의정석

Chapter 7. 제어자

제뉴어리맨 2022. 7. 9. 15:54

제어자란?

변수나 메서드의 선언시 주로 쓰이는 키워드로써 쓰이는 대상의 권한이나 쓰임새에 대하여 나타낸다.



접근 제어자의 사용 이유

1. 불필요한 코드의 노출을 줄여서 캡슐화를 높임.

2. 외부에 노출되어 데이터가 무분별하게 수정되는 경우를 방지하므로 은닉화 높임.

 

 

제어자의 종류

  • 접근 제어자
    1. public
      모든 패키지, 클래스 에서 접근이 가능하다. 즉 접근 제한이 전혀 없다.

    2. private
      같은 클래스내에서만 접근 가능하다.
      자식 클래스에서 조차 접근 불가하다.
      즉, 해당 클래스 내에서만 접근 가능

    3. default (아무것도 붙이지 않았을때 기본값)
      같은 패키지내에서만 접근이 가능하다. (같은 폴더내에 동등한 레밸에 존재하여야한다. 접근하려는 클래스의 위치보다 하위에 존재하는 패키지거나 상위 패키지에서 존재하면 접근 불가하다)
      즉, 같은 폴더내의 클래들만 접근 가능.

    4. protected
      같은 패키지내에서와 다른 패키지여도 자손 클래스라면 접근이 가능하다.

  • 접근 범위의 넓이 표현 

    public > protected > default > private

    protected는 같은 패키지 + 다른 패키지여도 자손이면 가능하기 때문


  • 대상 별 사용 가능한 접근 제어자

    - 클래스 : public, default (protected는 왜 안될까 싶은 생각이 들기도 한다..클래스를 같은 패키지 내에서만 쓰고 싶은 경우도 있지 않을까...)

    - 멤버 메서드, 멤버 변수 : public, protected, default, private

    - 지역 변수 : 가능한 접근 제어자 없음 (사용의 의미가 없음)



  • 그 외 제어자
    1. static
      정적 변수, 정적 메서드라는 의미로써 나타내며 
      static 키워드가 없이 선언된 변수나 메서드는 일반변수(인스턴스변수, 지역변수), 메서드를 의미한다.
      정적변수의 특징은 
      컴파일시에 생성되어 클래스 영역의 공간을 할당받게 되고
      컴파일시에 생성되므로 해당 정적변수를 포함하는 클래스의 인스턴스가 생성되지 않더라도 사용 가능하다.
      그리고 해당 정적변수를 포함하는 클래스의 인스턴스들은 모두 같은 static 변수를 공유한다.
      정적 메서드의 특징은
      정적변수와 마찬가지로 컴파일시에 메소드 내용이 클래스 영역의 공간을 할당받게 되고
      컴파일시에 생성되므로 해당 정적변수를 포함하는 클래스의 인스턴스가 생성되지 않더라도 사용 가능하다.
      그러므로 정적 메서드 안에서는 객체 생성시에 함께 생성되는 인스턴스 변수나 인스턴스 메서드를 사용할 수 없다

    2. final
      사전적인 의미 "마지막의" 란 뜻처럼 더이상 변경 될 수 없는 마지막 변수, 혹은 마지막 메서드, 마지막 클래스란 의미이다.
      변수에 사용되면 변경 할 수 없는 상수가 되고, 메서드에 사용되면 오버라이딩(재정의)이 불가하다. 그리고 클래스에 사용되면 자손 클래스를 만들수가 없어진다.
      변수의 값을 변경 할 수 없는 상수라는 의미는 선언 이후 재할당이 불가하다는 것이다.
      그러므로 선언과 동시에 초기값을 할당해주는것이 일반적이지만, 생성자에서만 예외로 final 키워드의 변수의 값을 할당하여 줄 수 잇다.


    3. abstract
      사전적인 뜻인 "추상적인" 이란 의미처럼 해당 키워드를 사용한 대상은 구체적인 내용을 가지지 않고 전체적인 틀만을 제공한다.
      메서드에 사용되면 메서드의 선언만 가지게 되며 body 부분에 내용이 없다.
      클래스에 사용되면 클래스내에 abstract 메서드를 가지고 있음을 의미한다 (단 하나만 존재해도 abstract 키워드를 붙여야 하며, 일반 메서드도 포함 할 수 있다)
      그리고 abstract 클래스는 아직 추상적이고 미완성적인 클래스를 의미하므로 new 키워드를 사용하여 객체를 생성 할 수 없다. 반드시 해당 클래스를 상속 받은  클래스를 객체로 만들어서 사용하여야 한다.