객체지향 프로그래밍 III

노영조 ㅣ 2023. 2. 9. 23:56

제어자

  • 제어자 - 클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미 부여
  • 접근 제어자 - public, protected, default, private
  • 그 외 - static, final, abstract, native, transient, synchronized, volatile, strictfp
  • 하나의 대상에 여러 제어자를 같이 사용가능(접근 제어자는 하나만)
  • 순서는 상관없지만 관례적으로 접근제어자를 제일 왼쪽에 사용
public class ModifierTest {
	public static final int WIDTH = 200;
    
    public static void main(String[] args) {
    	System.out.println("WIDTH = " + WIDTH);
    }
}
  • static - 클래스의, 공통적인

 

  • final - 마지막의, 변경될 수 없는

       - final이 사용될 수 있는 곳 : 클래스, 메서드, 멤버변수,  지역변수

       - 대표적인 final 클래스 : String(보안 문제), Math(static메서드의 집합이라 상속x)

 

  • abstract - 추상의, 미완성의

       - abstract가 사용될 수 있는 곳 : 클래스, 메서드

abstract class AbstractTest {     // 추상 클래스(추상메서드를 포함한 클래스)
	abstract void move();         // 추상메서드(구현부가 없는 메서드)
}

AbstractTest a = new AbstractTest; // 추상클래스는 완성되지않은 메서드가 존재함으로 인스턴스
                                   // 생성불가

 

접근 제어자

  • 접근제어자 - 클래스, 멤버변수, 메서드, 생성자에 사용되어 외부에서 접근하지 못하도록 제한하는 역할
  • private - 같은 클래스 내에서만 접근이 가능하다.
  • protected - 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능하다.
  • (default) - 같은 패키지 내에서만 접근이 가능하다. default임을 알리기위해 실제로 default를 붙이지는 않는다.                               접근제어자가 지정되어있지 않다면 접근 제어자가 default임을 뜻한다.
  • public - 접근제한이 전혀 없다.

 

 

캡슐화와 접근 제어자

  • 접근 제어자를 사용하는 이유

        1. 외부로부터 데이터를 보호하기 위해서

           - 데이터가 유효한 값을 유지하도록, 또는 비밀번호와 같은 데이터를 외부에서 함부로 변경하지 못하도록

             하기 위해서는 외부로 부터 접근을 제한하는 것이 필요하다. 이것을 데이터 감추기(data hiding)라고 하며,

             객체지향개념의 캡슐화(encapsulation)에 해당하는 내용이다.

        2. 외부에는 불필요한, 내부적으로만 사용되는, 부분을 감추기 위해서

           - 클래스 내에서만 사용되는, 내부 작업을 위해 임시로 사용되는 멤버 변수나 부분작업을 처리하기 위한

             메서드 등의 멤버들을 클래스 내부에 감추기 위해서이다. 외부에서 접근할 필요가 없는 멤버들을 private으로

             지정하여 외부에 노출시키지 않음으로써 복잡성을 줄일 수 있다. 이것 역시 캡슐화에 해당한다.

public class Time {
	public int hour;    // 0~24의 값을 가져야한다.
    public int minute;
    public int second;
}

Time t = Time();
t.hour = 25;           // 잘못된 값을 지정해도 막을 방법이 없다.
public class Time {
    private int hour;      // 접근 제어자를 private으로 사용하여 외부에서
    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;
    }
}

 - 만약 상속을 통해 확장될 것이 예상되는 클래스라면 멤버의 접근 제한을 주되 자손클래스에서 접근이 가능하는 것이           가능하도록 하기위해 private 대신 protected를 사용한다.

'Java' 카테고리의 다른 글

컬렉션 프레임워크II  (0) 2023.03.27
Collections Framework  (0) 2023.03.08
객체지향 프로그래밍 IV  (0) 2023.02.22
객체지향 프로그래밍II  (0) 2023.01.25
객체지향 프로그래밍  (0) 2023.01.12