Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

codingfarm

제어자(modifier) 본문

Programming Language/JAVA

제어자(modifier)

scarecrow1992 2021. 3. 7. 22:28

1. 제어자란?

  • 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.
  • 하나의 대상에 대해 여러 제어자를 조합하여 쓰는것이 가능하다.
    • 한번에 네 가지 중 하나만 선택해서 사용할 수 있다.
    • ex) public과 private를 함께 쓸 수 없다.
  • 접근제어자와 그 외의 제어자로 나뉜다.
    • 접근 제어자 - public, protected, default, private
    • 그 외          - static, final, abstract, native, transient, synchronized, volatile, strictfp

 


2. static

  • 의미 : '클래스의', '공통적인'
  • 사용될 수 있는 곳 - 멤버변수, 메섣, 초기화 블럭
제어자 대상 의미
static 멤버변수 - 모든 인스턴스에 공통적으로 사용되는 클래스 변수
- 인스턴스를 생성하지 않고도 사용 가능
- 클래스가 메모리에 로드될 때 생성된다.
메서드 - 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다.
- static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
jpackage project_1;
 
class StaticTest {
    static int width;
    static int height;
    
    static {
        width = 200;
        height = 120;
    }
    
    static int max(int a, int b) {
        return a > b ? a: b;
    }
    
    static float ratio() {
        return (float)height / (float)width;
    }
}
 
public class Hello {
    public static void main(String[] args) {
        System.out.println(StaticTest.width);            // 200
        System.out.println(StaticTest.height);            // 120
        System.out.println(StaticTest.max(100,200));    // 200
        System.out.println(StaticTest.ratio());            // 0.6
        
    }    
}
cs

 


3. final

  • 의미 : '마지막의', '변경될 수 없는'
  • 대상 - 클래스, 메서드, 필드, 지역변수
제어자 대상 의미
final 클래스 - 변경될 수 없는 클래스. 확장될 수 없는 클래스
- final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다.
메서드 - 변경될 수 없는 메서드
- final로 지저된 메서드는 오버라이딩을 통해 재정의 될 수 없다.
멤버변수 - 값을 변경할 수 없는 상수가 된다.
지역변수
1
2
3
4
5
6
7
8
final class FinalTest{                // 조상이 될 수 없는 클래스
    final int MAX_SIZE = 10;        // 값을 변경할 수 없는 멤버변수 (상수)
    
    final int getMaxSize() {        // 오버라이딩할 수 없는 메서드 (변경 불가)
        final int LV = MAX_SIZE;    // 값을 변경할 수 없는 지역변수 (상수)
        return MAX_SIZE;
    }
}
cs

 

  • final이 붙은 변수의 경우 상수이므로 선언과 동시에 초기화를 진행하지만, 인스턴스 변수의 경우 생성자에서 초기화 되도록 할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package project_1;
 
 
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;
    }    
}
 
public class Hello {
    public static void main(String[] args) {
        Card c0 = new Card();
        Card c1 = new Card("CLOVER"2);
        Card c2 = new Card("SPADE"3);
        Card c3 = new Card("DIA"4);        
    }    
}
cs

 


5. abstract

  • 의미 : '미완성'
  • 메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않은 추상메서드를 선언하는데 사용
  • 클래스내에서 추상메서드가 존재한다는것을 명확히 지칭하는데 쓰인다.
  • 대상 : 클래스, 메서드
제어자 대상 의미
abstract 클래스 클래스 내에 추상메서드가 선언되어 있음을 의미
메서드 선언부만 작성하고 구현부는 작성하지 않은 추상메서드임을 통보
1
2
3
abstract class AbstractTest{    // 추상클래스((추상메서드를 포함한 )
    abstract void move();        // 추상메서드(구현부가 없는 메서드)
}
cs

 

 


6. 접근 제어자(aceess modifier)

  • 해당하는 멤버 또는 클래스에 대한 외부에서의 접근 권한을 설정한다.
  • 대상 : 클래스, 멤버변수, 메서드, 생성자
  • protected - 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서만 접근 가능하다.
  • public      - 접근 제한이 전혀 없다.
  • default     - 같은패키지 내에서만 접근 가능
  • private     - 같은 클래스 내에서만 접근 가능.
제어자 같은 클래스 같은 패키지 자손 클래스 전체
public O O O O
protected O O O  
default O O    
private O      

 

대상에 따라 사용가능한 접근 제어자는 아래와 같다.

대상 사용가능한 접근 제어자
클래스 public, (default)
메서드 public, protected, (default), private
멤버변수
지역변수 없음

 


7. 접근 제어자를 이용한 캡슐화

  • 접근제어자를 통해 캡슐화를 실현할 수 있다.
    •  캡슐화(encapsulation)
      • 필드와 메서드의 모듈화
      • 정보 은닉(data hiding)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Time {
    private int hour;
    private int minute;
    private int second;
    
    public int getHour() { return hour; }
    public void setHour(int hour) {
        if (hour < 0 || hour > 23return;
        this.hour = hour;
    }
    
    public int getMinute() { return minute; }
    public void setMinute(int minute) {
        if (minute < 0 || minute > 59return;
        this.minute = minute;
    }
    
    public int getSecond() { return second; }
    public void setSecond(int second) {
        if (second < 0 || second > 59return;
        this.second = second;
    }
    
}
cs
  • 시간을 나타내는 필드와 이를 제어할 메서드를 class 단위로 묶음으로써 모듈화 구현
  • 주요 필드들을 private로 지정함으로써 정보은닉을 구현

 

 


8. 생성자의 접근 제어자

  • 생성자에 접근 제어자를 사용함으로써 인스턴스의 생성을 제한할 수 있다.
  • 보통 생성자의 접근 제어자는 클래스의 접근제어자와 같지만, 다르게 지정할 수도 있다.
1
2
3
4
5
6
class Singleton {
    private Singleton() {
        // ...
    }
    // ...
}
cs
  • 생성자의 접근 제어자를 private로 지정하면, 외부에서 인스턴스를 생성할 수 없게된다.
  • 그래도 클래스 내부에서는 인스턴스의 생성이 가능하다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Singleton {
    // ...
    private static Singleton s =new Singlton();
    
    private Singleton() {
        // ...
    }
    
    // 인스턴스를 생성하지 않고도 호출할 수 있어야 하므로 static 이어야 한다.
    public static Singleton getInstance() {
        return s;
    }
    
    // ...    
}
cs
  • 대신 인스턴스를 생성해서 반환해주는 public 메서드를 제공함으로써 외부에서 이 클래스의 인스턴스를 사용하도록 할 수 있다.
  • 이 메서드는 public인 동시에 static이어야 한다.
    • 인스턴스 없이 함수를 호출할 수 있어야 하므로 static 이어야 한다.

 

 


9. 제어자(modifier)의 조합

  • static, final, abstract 이외에 다양한 접근 제어자가 있다. 우선은 이정도만 알아둔다.
대상 사용가능한 제어자
클래스 public, (default), final, abstract
메서드 모든 접근 제어자, final, abstract, static
멤버변수 모든 접근 제어자, final, static
지역변수 final

 

  • 제어자 조합 사용시 주의사항
  1. 메서드에 static과 abstract를 함께 사용할 수 없다.
    • static 메서드는 몸통이 있는 메서드에만 사용할 수 있기 때문이다.
  2. 클래스에 abstract와 final을 동시에 사용할 수 없다.
    • 클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미이고, abstract는 상속을 통해 완성되어야 한다는 의미이므로 서로 모순되기 때문이다.
  3. abstract 메서드의 접근 제어자가 private일 수 없다.
    • abstract 메서드는 자손클래스에서 구현해주어야 하는데 접근 제어자가 private이면, 자손 클래스에서 접근 할 수 없기 때문이다.
  4. 메서드에 private와 final을 같이 사용할 필요는 없다.
    • 접근 제어자가 final 혹은 private인 메서드는 오버라이딩될 수 없기 때문이다. 이 둘 중 하나만 사용해도 충분하다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Programming Language > JAVA' 카테고리의 다른 글

추상클래스(abstract class)  (0) 2021.03.11
다형성(polymorphism)  (0) 2021.03.10
super  (0) 2021.01.07
오버라이딩(overriding)  (0) 2021.01.07
상속(inheritance)  (0) 2021.01.07
Comments