본문 바로가기

플밍 is 뭔들/JAVA

[자바] 제어자(Modifier)

※ 제어자란?
클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.
제어자의 종류는 크게 접근 제어자와 그 외의 제어자로 나눌 수 있다.


※ static
'클래스의' 또는 '공통적인'의 의미를 담고있다.  멤버변수, 메서드, 초기화 블럭에 사용 가능하다.

  1. 멤버변수에서 사용될 때
        - 클래스 안에서 맴버변수에 사용되면 클래스 변수로써 인스턴스와 상관없이 같은 값을 갖게 된다.

  1. 메서드에서 사용될 때
        - 메서드에서 사용되면 인스턴스를 생성하지 않고도 호출이 가능한 메서드가 된다. 
          이 static메서드 내에는 인스턴스멤버들을 직접 사용할 수 없다. 인스턴스 멤버를 사용하지 않는 메서드는 
          static을 붙여서 static을 붙여서 static메서드로 선언하는 것을 고려해 보도록 하자.
          가능하면 static메서드로 하는 것이 인스턴스를 생성하지 않고도 호출이 가능해서 더 편리하고 속도도 더 빠르다.

  1. 초기화 블럭에서 사용될 때
        - static초기화 블럭은 클래스가 메모리에 로드될 때 단 한번만 수행되며, 주로 클래스변수를 초기화하는데 
    주로 사용된다.


※ final
'마지막의' 또는 '변경될 수 없는'의 의미를 담고있다. 
변수에 사용되면 변경할 수 없는 상수가 되며, 메서드에 사용되면 오버라이딩을 할 수 없게 되고 클래스에 사용되면 자신을 확장하는 자손클래스를 정의하지 못하게 된다.

ex)
final class FinalTest {  //조상이 될 수 없는 클래스
    
    final int NUMBER = 10  //값을 변경할 수 없는 멤버변수(상수)

    final void getNumber(){  //오버라이딩을 할 수 없는 메서드(메서드 변경 불가)
        final int num = NUMBER;  //값을 변경할 수 없는 지역변수(상수)
        return NUMBER;
    }
}


※ abstract
'미완성'의 의미를 담고 있다.
메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않는 추상메서드를 선언하는데 사용.
클래스 내에서 사용되어 클래스 내에 추상메서드가 존재한다는 것을 쉽게 알 수 있게 한다.     
클래스와 메서드에서 사용된다.
추상클래스에 대한 설명은 뒤에 더 자세히 다루겠다. 이부분에선 간단한 개념과 형태만 알고가자.

ex)
abstract class AbstractTest{  //추상클래스(추상메서드가 포함되어 있는 클래스)

    public void method1(){
        ...
    }

    public void method2(){
        ...
    }

    abstract void abstractMethod(); //추상메서드(구현부가 없다);
}




※ 접근 제어자
멤버 또는 클래스에 사용되어, 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다.
접근 제어자의 종류로는 public, protected, default, private이 있다.

  1. public - 접근제한이 없음

  1. default - 같은 클래스, 같은 패키지 내에서만 접근 가능
                       메서드나 클래스에 접근 제어자가 지정되어 있지 않다면 default이다.

  1. protected - 같은 클래스, 같은 패키지, 자손 클래스에서만 접근 가능

  1. private - 같은 클래스 내에서만 접근 가능


※ 접근 제어자를 이용한 캡슐화
접근 제어자를 사용하는 이유는 클래스 내부에 선언된 데이터를 외부로부터 데이터를 보호하기 위해서이다. 
외부에서는 불필요한, 내부적으로만 사용되는, 부분을 감추기 위해서 사용된다. 이렇게 데이터를 감추는 것을 캡슐화라고 
한다.
외부에서 접근할 필요가 없는 멤버들은 private로 지정하여 외부에 노출시키지 않으므로써 복잡성을 줄이고 데이터를 보호한다.

ex) 
멤버변수에 직접 접근하기 보단 멤버변수에는 private으로 접근 제어자를 지정해 놓고 getter(), setter() 메서드를 이용하여 
변수들을 컨트롤한다.


※ 생성자의 접근제어자
생성자에 접근 제어자를 사용하는 이유는 인스턴스의 생성을 제한하기 위해서이다.
생성자에 private을 지정하면 외부에서는 이 클래스의 인스턴스를 생성할 수 없지만, 해당 클래스 내부에서는 인스턴스를 생성할 수 있다. 그리고 인스턴스를 리턴해주는 getter()메서드를 만들어 주므로써 외부에서 이 클래스의 인스턴스를 사용할 수 있게 한다.
이처럼 인스턴스를 직접 생성하지 못하게 하여 인스턴스의 숫자를 제한 할 수 있다.
단 이때 클래스안에서 생성된 인스턴스를 외부에서 접근하게 하기 위해선 메서드에 static을 줘야한다.

ex)
public class Animal {
      public static Animal animal;
      
      private Animal(){
            animal = new Animal();
      }
      
      public static Animal getInstace(){
            
            if(animal == null){
                  animal = new Animal();
            }
            
            return animal;
      }
}

public static void main(String[] args) {
      // TODO Auto-generated method stub
      Animal a1 = new Animal(); //에러발생, 인스턴스 생성 불가
      Animal a2 = Animal.getInstace(); 
}


'플밍 is 뭔들 > JAVA' 카테고리의 다른 글

[자바] 추상클래스 (Abstract Class)  (0) 2017.09.18
[자바] 다형성 (Polymorphism)  (0) 2017.09.18
[자바] 상속  (0) 2017.09.11
[자바] 오버로딩 / 오버라이딩  (0) 2017.09.11
[자바] 클래스  (0) 2017.09.11