이 글은 패스트 캠퍼스 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 강의를 듣고 공부한 내용을 바탕으로 정리한 글입니다.
1. 접근 제어 지시자 (access modifier)
접근 제어 지시자란, 클래스 외부에서 클래스의 멤버 변수, 메서드, 생성자를 사용할 수 있는지 여부를 지정하는 키워드입니다.
private
: 같은 클래스 내부에서만 접근 가능합니다. 외부 클래스에서는 당연히 접근할 수 없고, 상속 관계의 클래스에서도 접근할 수 없습니다.
default
: 접근 제어 지시자를 아무것도 명시하지 않는다면 같은 클래스 내부에서만 접근 가능합니다. 상속 관계라도 패키지가 다르면 접근이 불가능합니다.
protected
: 같은 패키지나 상속관계의 클래스에서 접근할 수 있고, 그 외의 외부에서는 접근할 수 없게하는 키워드입니다.
public
: 클래스의 외부 어디에서나 접근 할 수 있습니다.
2. 정보 은닉 (information hiding)
private
으로 선언된 멤버 변수(필드)에 대해 접근하고 수정할 수 있는 메서드를 public
으로 제공하여 변수에 대한 제한을 제어합니다. 변수 자체를 public
으로 공개하는 것보다 변수를 제한적으로 제공할 수 있습니다. 이런 정보 은닉은 일반적으로 get()
, set()
메서드(getter, setter라고도 부름)를 통해 구현합니다.
예시를 살펴보도록 하겠습니다.
Date 클래스안에 day, month, year 멤버 변수가 있습니다. 이들의 대한 정보 은닉을 구현해보도록 하겠습니다.
참고로 인텔리제이에서는 이렇게 getter와 setter를 자동으로 작성해주는 기능도 제공해주고 있습니다.
public class Date {
private int day;
private int month;
private int year;
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
}
멤버변수는 모두 private
으로 정의해서 외부에서 함부로 접근할 수 없도록하고, 각각의 멤버변수에 대한 getter와 setter를 public
으로 정의했습니다.
이때 month와 day를 set할 때, 유효하지 않은 값으로 설정하지 못하도록 제한하는 코드를 set 메서드에 추가해보도록 하겠습니다.
public class Date {
private int day;
private int month;
private int year;
private boolean isValid;
...
public void setDay(int day) {
if (day < 1 || day > 31)
isValid = false;
else
this.day = day;
}
...
public void setMonth(int month) {
if (month < 1 || month > 12)
isValid = false;
else
this.month = month;
}
...
}
day와 month의 set 메서드에서 if 문으로 유효한 값인지 검사 후, 불린형 private 멤버 변수 isValid의 값을 설정해줍니다. 이렇게 함으로써 사용자가 올바르게 변수 값을 설정할 수 있도록 합니다.
3. 캡슐화(encapsulation)
정보은닉을 활용해서 캡슐화를 해보겠습니다. 꼭 필요한 정보와 기능만 외부에 공개하고, 대부분의 멤버 변수와 메서드는 감춘채 외부에 통한된 인터페이스만을 제공하여 일관된 기능을 구현하도록 합니다. (각각의 메서드나 멤버 변수에 접근함으로써 발생하는 오류를 최소하할 수 있습니다.)
레포트 만들기 예제를 보겠습니다.
public class MakeReport {
StringBuffer buffer = new StringBuffer();
private String line = "===========================================\n";
private String title = " 이름\t 주소 \t\t 전화번호 \n";
private void makeHeader()
{
buffer.append(line);
buffer.append(title);
buffer.append(line);
}
private void generateBody()
{
buffer.append("James \t");
buffer.append("Seoul Korea \t");
buffer.append("010-2222-3333\n");
buffer.append("Tomas \t");
buffer.append("NewYork US \t");
buffer.append("010-7777-0987\n");
}
private void makeFooter()
{
buffer.append(line);
}
public String getReport()
{
makeHeader();
generateBody();
makeFooter();
return buffer.toString();
}
}
public class TestReprt {
public static void main(String[] args) {
MakeReport report = new MakeReport();
String builder = report.getReport();
System.out.println(builder);
}
}
메인 함수를 보면 아주 간결하죠? 그리고 객체와 메서드가 하는 역할이 아주 명확하고 본인의 기능에만 충실합니다. MakeReport
클래스를 사용하는 사용자는 MakeReport
클래스 내부가 어떻게 구현되어있는지는 모른채, 객체를 생성하고 getReport()
메서드가 레포트를 만들어주는 함수라는 것만을 알고 레포트를 생성할 수 있습니다.
자신이 만든 클래스를 본인만 쓰는 경우는 거의 없을 것입니다. 다른 사람들과 협업할 때에는 자신이 만든 클래스를 다른 사람이 가져다 쓰는 경우가 있을텐데, 이 경우 다른 사람이 내 코드를 전부 알지 못하므로 객체를 올바르게 잘 사용할 수 있도록 해주는 것까지 나의 몫입니다.
이렇게 객체지향 프로그래밍에서 정보 은닉은 외부에서 접근 가능한 최소한의 정보만 공개함으로써 객체의 오류를 방지하여 클라이언트 객체가 더 효율적으로 객체를 활용할 수 있도록 해줍니다.
'Java' 카테고리의 다른 글
[JAVA 객체지향프로그래밍] 상속 (0) | 2022.12.27 |
---|---|
[JAVA 객체지향프로그래밍] static과 싱글톤 패턴 (0) | 2022.12.23 |
[JAVA 객체지향프로그래밍] this (0) | 2022.12.22 |
[JAVA 객체지향프로그래밍] 생성자 (constructor) (0) | 2022.12.22 |
[JAVA 객체지향프로그래밍] 개요 + 객체지향프로그래밍의 구현 (0) | 2022.12.22 |
댓글