제어자는 클래스, 변수 또는 메소드 선언부에 함께 사용하여 의미를 부여해주는 역할을 한다 크게 두가지로 나누어 진다.
- 접근제어자 : public, protected, default, private
- 일반 제어자 : static, final, abstract, native,synchronized,...
제어자는 클래스나 멤버변수, 메소드에 주로 사용되며, 하나의 대상에 대해 여러 제어자를 조합해 사용할 수 있다. 단 접근 제어자는 한번에 네가지 중 하나만 선택해 사용할 수 있다.
대표적인 일반 제어자
1. static : 멤버변수, 초기화블록 , 메소드
static은 클래스의, 공통적인 이라는 의미를 가지고 있다. 이는 클래스 변수 혹은 클래스 메소드를 선언할 때 사용한다. 그리고 한가지 더, 초기화 블록에도 static을 붙여 클래스 멤버변수에 대한 초기화를 해주기도 한다. 클래스 변수 / 메소드는 인스턴스를 생성하지 않고도 사용할 수 있으며, 인스턴스 변수, 인스턴스 메소드를 사용할 수 없다. 또한 클래스 변수는 모든 인스턴스가 동일한 값을 공유하게된다
2. final : 클래스, 메소드,멤버변수, 지역변수
final은 마지막의 변경될수 없는의 의미를 가지고 있다. 이 제어자를 변수에 쓰면 상수가 되며, 메소드에 사용하면 오버라이딩을 할 수 없게 된다. 또한 클래스에 사용을 하면 자손클래스를 정의할 수 없게된다.
상수는 처음 선언하면, 초기화를 같이 하는것이 일반적이다. 하지만 자바에서는 final제어자가 붙은 멤버변수에 대해 생성자를 통해 최초 초기화를 할 수 있다.
class Card{
final int NUMBER;
final String Kind;
// 생성자를 통한 상수 최초 초기화
Card(String Kind, int NUMBER){
this.Kind = Kind;
this.NUMBER = NUMBER;
}
Card(){
this("HEART",1);
}
@Override
public String toString(){
return "Kind : " + this.Kind + "Number : " + this.NUMBER;
}
}
public class finalmodifier {
public static void main(String[] args){
Card a = new Card();
System.out.println(a);
}
}
3. abstract 메소드, 클래스
abstract는 추상, 미완성이라는 의미를 가지고 있다.이는 메소드의 선언부만 작성하고, 실제 수행은 구현하지 않은 추상 메소드,추상클래스를 선언하는데 사용된다. 추상클래스 같은 경우에는 미완성 클래스 이므로 인스턴스를 생성할 수 없다.
abstract class AbstractTest{
abstract void move();
}
public class absCls {
AbstractTest a = new AbstractTest();// Error
}
추상 클래스는 상속을 받아 일부의 원하는 메소드만 오버라이딩 해도 된다는 장점이 있다. (선택적 상속)
접근 제어자
접근제어자는 멤버 또는 클래스에 사용되어 해당 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다. 기본적으로 어떠한 접근제어자도 없으면 default라는 의미이며, default에 대해서는 딱히 표시를 하지 않는다. 접근 제어자에는 아래와 같은것들이 있다
- private : 같은 클래스 내에서만 접근 가능
- default : 같은 패키지 내에서만 접근가능
- protected : 같은 패키지 내에서 + 다른 패키지에서 자신을 상속받은 자식 클래스에서 접근이 가능하다
- public : 어디에서나 접근이 가능하다
접근범위를 넓은 순위부터 나열하면 아래와 같다
public > protected > default > private
접근제어자를 사용하는 이유는 크게 두가지이다
- 외부로부터 데이터를 보호하기 위해
- 외부에는 불필요하고, 내부적으로만 사용되는 부분을 감추기 위해서
예를 들어 시계 클래스가 있다고 하자. 시간, 분, 초에 대한 정보는 함부로 바꿔서는 안된다. 다만 이 시간 분 초에 대한 정보를 조회할 수 있어야한다. 이런경우 시간 분 초를 private변수로 선언을 하고, 이 시간 분 초 값을 불러오거나, 조정하는 것에 대해서는 public메소드를 사용하여 간접적으로 다룰수 있도록 할 수 있다.
class Time{
private int Hour;
private int Minute;
private int Second;
Time(int Hour, int Minute, int Second){
this.Hour = Hour;
this.Minute = Minute;
this.Second = Second;
}
Time(){
this(00,00,00);
}
public int getHour() {
return Hour;
}
public int getMinute(){
return Minute;
}
public int getSecond() {
return Second;
}
public void setHour(int hour) {
if(hour < 0 || hour > 23){
return;
}
else{
Hour = hour;
}
}
public void setMinute(int minute) {
if(minute < 0 || minute > 59){
return;
}
else{
Minute = minute;
}
}
public void setSecond(int second) {
if(second < 0 || second > 59){
return;
}
else {
Second = second;
}
}
@Override
public String toString(){
String msg = this.getHour() + " : " + this.getMinute() + " : " + this.getSecond();
return msg;
}
}
public class modifier {
public static void main(String[] args){
Time t = new Time();
Time t2 = new Time(10,30,20);
t.setHour(t.getHour() + 1);
t2.setHour(t2.getHour() + 1);
System.out.println(t);
System.out.println(t2);
}
}
통상적으로 멤버변수의 값을 읽어오는 메소드 선언시 get(멤버변수)형식으로 하고, 멤버변수 값을 변경할때는 set(멤버변수 이름)으로 한다. 암묵적이 규칙이며, 각각 getter,setter이라고 부른다.
'Language > Java' 카테고리의 다른 글
[Java] 추상화란? (0) | 2022.01.04 |
---|---|
[Java] 다형성(polymorphism) (0) | 2022.01.04 |
[Java]super (1) | 2021.12.28 |
[Java]오버라이딩(Overriding) (0) | 2021.12.28 |
[Java]Java toString()메소드?? (0) | 2021.12.28 |