Programming/JAVA

제어자

gyu0 2020. 6. 13. 02:09

제어자는 클래스와 변수 그리고 메서드의 선언부에 사용되며 부가적인 의미를 부여한다.

제어자의 종류

  • 접근제어자 public protected default private
  • 그        외 static final abstract native transient synchronized volatile strictfp

사용시 주의사항

  • 클래스나 멤버변수 메서드에 주로 사용되나 여러자를 조합하는 것이 가능.
  • 하지만 접근제어자는 여러가지를 섞어서 쓸 수 없다.

1. static 

static 은 다뤘던 내용이다. '공통적인'이라는 의미를 가지고 있는데, 우리가 앞부분에서 인스턴스를 만들어 각각의 인스턴스에 서로 다른 값을 줬지만 static 이 붙은 변수나 메서드는 인스턴스 생성없이 사용이 가능하며 클래스가 로드 되자마자 메모리에 로드되는 것을 알 수 있었다. 앞에서 우리는 인스턴스를 사용하지 않는 메서드는 static메서드로도 고쳐보고 했었다. 기억이 안나면 다시 변수와 메서드로 가보자. 값을 공유하고 있는 static 은 공통적인 이라는 것을 알고있자.

 

2.final

마지막의, 변경이 될 수 없는 이라는 뜻이다. 거의 모든 것에 사용이 된다고 한다.

● 변수에 사용되면 변경할 수 없는 상수가 된다.

● 메서드에 사용되면 오버라이딩 할 수 없다.

● 클래스에 사용되면 자신을 확장하는 자손클래스를 정의하지 못한다.

 

class Card{
	final int NUMBER;
    final String KIND;
    static int width=100;
    static int height=250;
    
    Card(String kind, int num){
    	KIND=kind;
        NUMBER=num;
    }
    
    Card(){
    	this("HEART",1);
    }
    
    public String toString(){
    	return KIND+" "+NUMBER;
    }
class FinalCardTest{
	Card c = new Card("HEART",10);
    c.NUMBER=5;
    System.out.println(c.KIND);
    System.out.println(c.NUMBER);
    System.out.println(c);//System.out.println(c.toString());
}

잠깐... 코드블럭 쓸 수 있었잔아... 자주 애용해야겠다... 나만 모르고있었어...

 

▼  ● 변수에 사용되면 변경할 수 없는 상수가 된다. 

 

이런식으로 final 이라도 각각의 인스턴스에 대해서 final 변수의 값을 바꿔줄 수 있어.

책에 나온 내용인데 카드의 경우 52장의 카드가 있는데 카드의 값을 바꾸기보다는 카드의 순서를 바꾸라는 말이 있다.

그게 더 안전한 방법이다. 우리 그렇게 쓰자.

 

 

3.abstract

사전적의미로 추상적인 이라는 뜻이다.

정의는 메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않ㅇ느 추상 메서드를 선언하는데 사용된다.

 

● 클래스에 선언하게 하면 추상메서드가 클래스내에 선언되어있다.

메서드는 선언부만 작성하고 구현부는 작성하지 않은 추상메서드.

 

abstract class test{//추상클래스 추상메서드를 포함한 클래스라는 뜻
	abstract void testabstract(){ //선언부만 작성되고 구현부는 작성하지 않은 메서드라는 뜻
    }
}

제어자의 종류

  • 접근제어자 public protected default private
  • 그        외 static final abstract native transient synchronized volatile strictfp

이번 부터는 접근제어자다. 접근 제어자는 멤버와 클래스에 사용되어 밖에서 참조하지 못하게 제한 하는 것이다.

범위가 넓은 순 부터 나열 하자면 public > protected > default > private 순으로 나열할 수 있다.

 

public : 접근에 전혀 제한이 없다.

protected : 패키지에 관계없이 상속관계에 있는 자손클래스에서 접근할 수 있도록, 또는 같은 패키지 내에서도 접속 가능

                     (일부 default 기능도 존재하기도 함.)

default : 같은 패키지내의 클래스에서만 접근이 가능하도록 함.

private : 같은 클래스 내에서만 사용 되도록 제한.

 

  같은 클래스 같은 패키지 자손 클래스 전 체
public
protected  
default    
private      

접근제어자를 이용하게 되면 외부에서 접근 시도를 줄일 수 있고, 외부적으로 알려지면 불필요한 것들을 내부에 숨길 수도 있다. 또 만약에 나중에 코드 수정이 필요하다고 하면 메서드에 public 이 있으면 소스코드를 다 뒤져야 하는데 private라고 예를 들어 주기 되어 있으면 같은 클래스만 보면 된다. 이처럼 제어자 하나하나가 정말 큰 변화를 만든다고 한다. 나중에 실전 때 쓰는 버릇좀 들여야겠다.