이것이 자바다 6장 -13, 14

오늘·2021년 3월 8일
0

Java

목록 보기
15/42

6.13 접근 제한자

  • 보통 main()메소드를 가지지 않은 클래스는 외부 클래스에서 이용할 목적으로 설계된 라이브러리 클래스이다. 이러한 클래스를 설계할 때에는 외부에서 접근할 수 있는 멤버와 접근할 수 없는 멤버로 구분하여 필드, 생성자, 메소드를 설계하는 것이 바람직하다.
  • 접근 제한자는 4가지 종류가 있다.
  1. public
    : 말 그대로 공개한다는 의미를 가지고 있다. 외부 클래스가 자유롭게 사용할 수 있는 공개적인 멤버를 만든다
  2. protected
    : 같은 패키지 또는 자식 클래스에서만 사용할 수 있는 멤버를 만든다.
  3. private
    : 단어 뜻 그대로 개인적인것이다. 외부에 노출되지 않는 멤버를 만든다.
  4. default
    : 같은 패키지에 소속된 클래스에서만 사용할 수 있는 멤버를 만든다.

6.13.1 클래스의 접근 제한

클래스에 적용할 수 있는 제한자는 public과 default 단 두가지이다.

// default 접근 제한
class 클래스 { ... }

// public 접근 제한
public class 클래스 { ... }
  1. default 접근 제한
    클래스 선언시 public을 생략했다면 클래스는 자동으로 default 접근 제한을 가진다. 이 경우 같은 패키지에서는 아무런 제한 없이 사용할 수 있지만 다른 패키지에서는 사용할 수 없도록 제한된다.

  2. public 접근 제한
    클래스 선언시 public 을 붙였다면 public 접근 제한을 가진다. 이 경우 같은 패키지 뿐 아니라 다른 패키지에서도 아무런 제한 없이 사용할 수 있다.

생성자의 접근 제한

객체를 생성하기 위해서는 new 연산자로 생성자를 호출해야 한다. 하지만 어디에서나 호출할 수 있는 것은 아니다. 생성자가 어떤 접근 제한을 갖느냐에 따라 호출 가능 여부가 결정된다.

필드와 메소드의 접근 제한

필드와 메소드를 선언시 고려해야 할 사항은 클래스 내부에서만 사용할 것인지, 패키지 내에서만 사용할 것인지. 아니면 다른 패키지에서도 사용할 수 있도록 할 것인지를 결정해야한다.


Getter 와 Setter 메소드

-외부에서 마음대로 읽고 변경할 경우 객체의 무결성이 깨어질 수도 있기 때문에, 일반적으로 객체 지향 프로그래밍에서 객체의 데이터는 객체 외부에서 직접적으로 접근하는 것을 막는다.
-데이터는 외부에서 접근할 수 없도록 막고, 메소드는 공개해 외부에서 메소드를 통해 데이터에 접근하도록 유도한다. 이러한 역할을 하는 메소드가 Setter이다.

private int speed;
// 데이터(변수)는 외부에서 접근할 수 없도록 private 제한자

...

public void setSpeed(double speed) {
	if(speed < 0) {
    	this.speed = 0;
        return;
    } else {
    	this.speed = speed;
    }
}
// 외부에서 메소드를 통해 접근하도록 public 제한자
// 매개값이 음수일 경우 speed 필드에 0으로 저장하고, 메소 실행 종료

외부에서 객체의 데이터를 읽을 때도 메소드를 사용하는 것이 좋다. 이런 경우 메소드로 필드값을 가공한 후 외부로 전달하면 된다. 이런 메소드가 바로 Getter

double getSpeed() {
	double km = speed * 1.6;
    	return km;
}
// 필드값인 마일을 km 단위로 환산 후
// 계산 결과를 외부로 리턴

이렇게 클래스를 선언할 때 가능하다면 필드는 private로 선언하여 외부로부터 보호하고, 필드에 대한 Setter 와 Getter 메소드를 작성해 필드값을 안전하게 변경/사용하는 것이 좋다.

(1)
private 타입 fieldName;

// Getter
//메소드 이름 : get+필드이름(첫문자는 대문자)
public 리턴 타입 getFieldName() { 
	return fieldName;
}

// Setter
//메소드 이름 : set+필드이름(첫문자는 대문자)
public void setFieldName(타입 fieldName) { 
	this.fieldName = fieldName;
}

------------------------------------------------------------

(2) 필드 타입이 boolean일 경우
private boolean stop;

// Getter
public boolean isStop() {
//boolean의 경우 get으로 시작하지 않고 is로 시작한다
	return stop;
}

// Setter
public void setStop(boolean stop) {
	this.stop = stop;
}

만약 외부에서 필드값을 읽을 수만 있고 변경하지 못하게 하려면 Getter 메소드만 선언해도 좋고, Setter 메소드를 private 제한을 갖도록 선언해도 좋다.

ex

(1)
package getter_setter;

public class Car {
	private int speed;
	private boolean stop;
    	// 필드값을 private로 접근제한
	
	
	// 메소드로 spped 값을 처리할수 있게끔함
	public int getSpeed() {
		return speed;
	}
	public void setSpeed(int speed) {
		this.speed = speed;
	}
	
	
	// 메소드로 stop 처리
	public boolean getStop() {
		return stop;
	}
	public void setStop(boolean stop) {
		this.stop = stop;
	}
}



(2)
package getter_setter;

public class Carbusiness {
	public static void main(String[] args) {
		Car myCar = new Car();
		
		// myCar.speed = 120;
		// 스피드 값은 private이기 때문에 직접 접근 불가

		//메소드로 집어넣습니다
		myCar.setSpeed(120);
		
		
		// 직접 값 출력 못함. 
		//System.out.println(myCar.speed);
		// 메소드 통해 접근
		System.out.println(myCar.getSpeed());
	}
}

//getter setter은 이클립스에서 자동 작성되게 할 수도 있다. (Sourse)부분에 있고, 필요한 필드값만 선택하면 해당 필드값으로 작성이 된다. 당연 메소드 내용 변경은 셀프

0개의 댓글