[JAVA] 접근제어자(Access Modifier)-(2)

Soo·2023년 8월 28일
0

지난번 정리 했었던 접근 제어자(Access Modifier)에 대해 추가적으로 더 정리해보려고 한다.

접근 제어자(Access Modifier)

코드를 작성할 때, 다른 누군가가 쓰게 할 클래스는 구성요소 중 일부만 밖으로 공개할 수 있도록 할 수 있다. 그러한 이유는 사용 중 오용이나 혼란을 방지하기 위해서이다. 이를 캡슐화(encapsulation)이라고도 한다.

지난 편에서도 언급했듯이 접근 지정자는 상황에 따라 아래와 같이 사용할 수 있다.

이와 같이 클래스의 특정 요소를 감추는 이유는 몇 가지가 있는데, 아래와 같다.

  • 정보의 은닉이라고 하지만, 이는 사실상 특정 요소를 '감추는 것'이 아니라 작성자의 의도대로 사용하도록 하기 위함이라고 볼 수 있다.
  • 쓰라고 의도한 기능만 공개(IDE의 자동완성 등)하여 혼란을 방지
    (내부적으로 수많은 필드들이 사용된다면? 제한이 오히려 편의를 제공한다.)
  • 필드에 부적절한 값이 적용되는 등의 오용 방지
  • 다른 클래스와 복합적으로 사용될 경우 혼선 방지(ex 스마트폰 - PC 연결은 USB 케이블로만)
  • 기타 다양한 이유..

Getter 와 Setter

  • Getter와 Setter의 사용 :
    객체지향 프로그래밍에서 객체의 데이터는 객체 외부에서 직접적으로 접근하는 것을 막는다. 그 이유는 객체 데이터를 외부에서 마음대로 읽고 변경할 경우, 객체의 무결성이 깨질 수 있기 때문이다. 이를 위해 객체 지향 프로그래밍에서는 메소드를 통해 데이터를 변경하는 방법을 선호한다. 이처럼 데이터를 변경하는 메소드가 Getter와 Setter가 하는 역할이다.

  • 데이터는 외부에서 접근하지 않도록 막고, 메소드는 공개해서 외부에서 메소드를 통해 데이터에 접근하도록 유도한다. (이는 메소드는 매개값을 검증해서 유효한 값만 데이터로 저장할 수 있기 때문!)

이러한 역할을 하는 메소드는 바로 Setter이다.

ex) 자동차 속도를 setSpeed()메소드로 변경할 경우, 아래와 같이 코드를 작성할 수 있다.

void setSpeed(double speed) {
	if(speed < 0) {
    	this.speed = 0;
        return;
	} else {
    	this.speed = speed;
        }
}    
  • 외부에서 객체의 데이터를 읽을 때에도 메소드를 사용하는 것이 좋다.

객체 외부에서 객체 필드값을 사용하기 부적절한 경우가 있다. 이런 경우, 메소드로 필드값을 가공 후에 외부로 전달할 수 있다.

이러한 역할을 하는 메소드는 Getter이다.

ex) 자동차 속도를 mile에서 km단위로 환산해서 외부로 리턴하는 getSpeed()

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

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

to be continued..

profile
Soogineer's Devlog

0개의 댓글