Engineering Note

[Java] Access Modifier, Encapsulation 본문

Programming Language/Java

[Java] Access Modifier, Encapsulation

Software Engineer Kim 2022. 9. 9. 00:20

Access Modifier, Encapsulation

  • Package
  • Access modifier(private, default, protected, public)
  • Access modifier 사용 이유, 캡슐화
  • Getter, Setter 사용 이유

Package

  • 패키지, 클래스의 묶음
  • 클래스 또는 인터페이스를 포함시킬 수 있으며, 서로 관련된 클래스들끼리 그룹 단위로 묶음으로써 클래스를 효율적으로 관리할 수 있다.
  • 모든 클래스는 반드시 하나의 패키지에 포함 되어야 하고, 클래스명과 쉽게 구분하기 위해 소문자로 명명하는 것을 원칙으로 하고 있다.

Access modifier(접근 제한자)

  • 제한자(제어
  • 자) - 클래스, 변수, 또는 메서드의 선언부와 함께 사용되어 부가적인 의미를 부여함.
  • 접근 제한자 - public, protected, default, private
    • 접근 제한자는 한 번에 네 가지 중 하나만 선택해서 사용할 수 있다. 즉, 하나의 대상(변수,클래스, 메서드)에 대해서 public, private, protected, default를 함께 사용할 수 없다.
    • 접근 제한자의 접근 범위
    • public > proected > (default) > private
### public

- 접근 제한이 전혀 없는 것

### protected

- 패키지에 관계없이 상속 관계에 있는 자손 클래스에서 접근할 수 있도록 하는 것

### default

- 같은 패키지 내의 클래스에서만 접근이 가능하도록 하는 것

### private

- 가장 높은 제한을 두는 접근 제한자
- 같은 클래스 내에서만 접근 가능하도록 제한함

### 접근 제한자의 허용 범위

| 제한자 | 같은 클래스 | 같은 패키지 | 자손 클래스 | 전체 |
| --- | --- | --- | --- | --- |
| public | O | O | O | O |
| protected | O | O | O |  |
| (defalut) | O | O |  |  |
| private | O |  |  |  |

### 접근 제한자의 대상

| 대상 | 사용 가능 한 접근 제한자 |
| --- | --- |
| class | public, (default) |
| method | public, protected, (default), private |
| field(member variable) | public, protected, (default), private |
| local variable | X |

Access modifier 사용 이유

  • 클래스 내부에 선언된 데이터를 보호하기 위해서이다. - 캡슐화(encapsulation)
  • 외부에는 불필요한, 내부적으로만 사용하는 메서드 등을 감추어 복잡성을 낮출 수 있다.
    • class 내부에서 반복되는 로직을 추출하여 메서드로 만들었을 때, 해당 메서드는 private으로 선언하여 다른 클래스에서 접근을 제한할 수 있다. 이렇게 했을 때 이점은 해당 메서드를 수정했을 때, 오류 검사를 해야 하는 부분을 class 내부로 한정할 수 있다.

Getter, Setter 사용 이유

  • 접근이 제한된 필드에 값을 바꾸고, 불러오기 위해서 사용한다.
  • 외부에서 넣어주는 값에 오류가 있을 경우 내부에서 가공하여 객체의 무결성을 깨지는 일을 막을 수 있다.

실습

public 접근 제한자

  1. Time Class에서 public으로 선언한 필드(hour, minute, second)는 같은 클래스에서 접근 사용 가능
package modifier.exam001;

public class Time {
    public int hour;
    public int minute;
    public int second;

    public static void main(String[] args){
        Time pt = new Time();
        pt.hour = 10;
        pt.minute = 10;
        pt.second = 10;
    }
}
  1. Time Class에서 public으로 선언한 필드(hour, minute, second)는 같은 패키지에서 접근 사용 가능
package modifier.exam001;

public class TimeTest {
    public static void main(String[] args){
        Time pt = new Time();
        pt.hour = 10;
        pt.minute = 30;
        pt.second = 15;

        System.out.println("Time: " + pt.hour + ":" + pt.minute + ":" + pt.second);

    }
}
  1. Time Class에서 선언한 필드(hour, minute, second)는 다른 패키지에서 접근 사용 가능
package modifier.exam002;

import modifier.exam001.Time;

public class PublicTimeTest {
    public static void main(String[] args){
        Time t = new Time();
        t.hour = -1;
        t.minute = -1;
        t.second = -1;

        System.out.println("Time: " + t.hour + ":" + t.minute + ":" + t.second);
    }
}

protected 접근 제한자

  • modifier.exam001 패키지에 속한 Time Class, 필드 속성은 protected로 선언
package modifier.exam001;

public class Time {
    protected int hour;
    protected int minute;
    protected int second;

    public static void main(String[] args){
        Time pt = new Time();
        pt.hour = 10;
        pt.minute = 10;
        pt.second = 10;
    }
}
  • modifier.exam002 패키지에 속한 자손 클래스 ChildProtectedTimeTest 에서 필드에 접근가능
package modifier.exam002;

import modifier.exam001.Time;

public class ChildProtectedTimeTest extends Time{

    public static void main(String[] args){

        ChildProtectedTimeTest ct = new ChildProtectedTimeTest();

        ct.hour = 10;
        ct.minute = 10;
        ct.second = 30;
    }
}
  • Time Class와 같은 패키지에 속한 TimeTest Class 에서 Time의 필드에 접근 가능
package modifier.exam001;

public class TimeTest {
    public static void main(String[] args){
        Time pt = new Time();
        pt.hour = 10;
        pt.minute = 30;
        pt.second = 15;

        System.out.println("Time: " + pt.hour + ":" + pt.minute + ":" + pt.second);

    }
}

(default) 접근 제한자

  1. Time Class에서 (default)로 선언한 필드(hour, minute, second)는 같은 클래스에서 접근 사용 가능
package modifier.exam001;

public class Time {
    int hour;
    int minute;
    int second;

    public static void main(String[] args){
        Time pt = new Time();
        pt.hour = 10;
        pt.minute = 10;
        pt.second = 10;
    }
}

2.Time Class에서 (default)로 선언한 필드(hour, minute, second)는 같은 패키지에서 접근 사용 가능

package modifier.exam001;

public class TimeTest {
    public static void main(String[] args){
        Time pt = new Time();
        pt.hour = 10;
        pt.minute = 30;
        pt.second = 15;

        System.out.println("Time: " + pt.hour + ":" + pt.minute + ":" + pt.second);

    }
}

private 접근 제한자

  1. private으로 선언한 필드는 같은 Class에서만 접근 가능
package modifier.exam001;

public class Time {
    private int hour;
    private int minute;
    private int second;

    public static void main(String[] args){
        Time pt = new Time();
        pt.hour = 10;
        pt.minute = 10;
        pt.second = 10;
    }
}
  1. private으로 Class의 필드를 캡슐화 하면서도 외부에서 필드를 사용 가능 하도록 하기 위해서는 메서드를 이용할 수 있다. getter 메서드를 통해서 필드의 값을 가져오고, setter 메서드를 통해서 필드에 값을 대입할 수 있다. 그리고, setter 메서드를 통해 변수에 잘못된 값을 대입하는 것을 방지할 수도 있다.
package modifier.exam003;

public class PrivateTime {
    private int hour;
    private int minute ;
    private int second;

    public int getHour() {
        return hour;
    }

    public void setHour(int hour) {
        if(hour < 0 || hour > 23) return;
        this.hour = hour;
    }

    public int getMinute() {
        return minute ;
    }

    public void setMinute(int minute ) {
        if(minute  < 0 || minute  > 59) return;
        this.minute  = minute ;
    }

    public int getSecond() {
        return second;
    }

    public void setSecond(int second) {
        if(second  < 0 || second  > 59) return;
        this.second = second;
    }

}
package modifier.exam003;

public class PrivateTimeTest {
    public static void main(String[] args) {
        PrivateTime privateTime = new PrivateTime();

//        privateTime.time = 10;
        privateTime.setHour(-1);
        privateTime.setMinute(-1);
        privateTime.setSecond(-1);

        System.out.println("Time:" + privateTime.getHour() +":" + privateTime.getMinute() + ":" + privateTime.getSecond());

        privateTime.setHour(10);
        privateTime.setMinute(30);
        privateTime.setSecond(11);

        System.out.println("Time:" + privateTime.getHour() + ":" + privateTime.getMinute() + ":" + privateTime.getSecond());

    }
}

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

[Java] 변수의 종류  (0) 2022.09.15
[Java] Inheritance  (0) 2022.09.09
[Java] Object Oriented Programming  (0) 2022.09.09
[Java] Dependency  (0) 2022.09.02
Window에 Java 파일 여러개 설치 feat batch  (0) 2022.08.03
Comments