이거 아님
요근래 개념 정리의 중요성을 정말 절실히 느끼고 있다...!
그런 김에 velog에 개념 정리를 하러 들어왔다.
이번 글에서 다룰 개념은 '캡슐화'이다!💊💊💊
캡슐화는 관련이 있는 변수와 함수를 하나의 클래스로 묶고, 외부에서 쉽게 접근하지 못하도록 은닉하는 것이다.
외부에서 내부의 정보에 직접 접근하거나 변경할 수 없고, 객체가 제공하는 필드와 메소드를 통해서만 접근이 가능하다.
- 유지보수나 확장 시 오류의 범위를 최소화한다.
- 객체 내 정보 손상과 오용을 방지한다.
- 데이터가 변경되어도 다른 객체에 영향을 미치지 않는다. (독립성이 좋다.)
- 최종으로 정리된 결과를 사용할 수 있다. (이식성이 좋다.)
- 객체를 모듈화할 수 있다.
캡슐화를 하기 위해서는 접근제어자를 통한 설계가 잘 이루어져야 한다. 이럴때 사용하는 제어자들의 종류를 알아보자.
Default | Public |
---|---|
동일 패키지의 클래스에만 인스턴스(객체)를 생성 가능하다. | 다른 패키지에서도 인스턴스(객체)를 생성 가능하다. |
이 부분은 글로 구구절절 설명하기 보단 표 하나가 더 도움이 될 것 같아서 직접 그려서 올린다!
즉, 접근 허용 가능 범위 순서는 이렇게 정리할 수 있다.
public > default > protected> private
다음은 각 메소드 접근 제어자의 사용 예시이다.
public class Everywhere {
public String var = "누구든지 허용"; // public 필드
public String getVar() { // public 메소드
return this.var;
}
package test;
public class SameClass {
protected String sameVar = "다른 패키지에 속하는 자식 클래스까지 허용"; // protected 필드
}
다른 패키지에 속하는 자식 클래스도 접근이 허용된다.
package test.other;
import test.SameClass; // test 패키지의 SameClass 클래스를 불러들여 포함시킴.
public class ChildClass extends SameClass {
public static void main(String[] args) {
SameClass = new SameClass();
System.out.println(sp.sameVar); // 다른 패키지에 속하는 자식 클래스까지 허용
}
}
package test;
public class SamePackage {
String sameVar = "같은 패키지는 허용"; // default 필드
}
같은 패키지에 속한 클래스에서만 접근이 허용된다.
package test;
public class SameClass {
String var = "다른 패키지는 접근 불가"; // default 필드
public static void main(String[] args) {
SamePackage sp = new SamePackage();
System.out.println(sp.sameVar); // 같은 패키지는 허용
}
}
public class SameClass {
private String var = "같은 클래스만 허용"; // private 필드
private String getVar() { // private 메소드
return this.var;
}
}
Private를 사용하여 멤버 변수로의 접근을 제어한다는 내용을 위에서 다뤄보았다.
하지만 Getter와 Setter를 사용한다면 Private로 선언된 인스턴스 필드에 접근할 수 있다.
Getter와 Setter를 언제 사용하는지?
- 멤버 변수의 정보 보기와 변경의 접근제어자를 다르게 하고 싶을 때
- 멤버 변수를 바꿀 때 조건을 추가하고 싶을 때
- 사용자가 원하는 데이터가 직접 저장되어 있는 게 아닌 계산을 해야만 하는 상황일 때
그럼 이것들이 각각 어떤 특징을 가졌는지 정리해보도록 하자!
게터(Getter):
초기화된 멤버 변수를 return할 때 사용한다.
- 반드시 소문자 get을 접두사로 사용한다.
- get 다음에 이어지는 단어의 첫번째 글자는 반드시 대문자로 작성한다.
- 반드시 리턴값이 있어야 한다 (void 불가)
- 매개변수가 없어야 한다.
세터(Setter):
멤버 변수를 매개 변수로 초기화한다.
- 반드시 소문자 set을 접두사로 사용
- set 다음에 이어지는 단어의 첫번째 글자는 반드시 대문자로 작성한다.
- 반드시 리턴값이 없어야 한다 (무조건 void 사용)
- 반드시 매개변수가 있어야한다.
public class Vehicle {
private String color;
// Getter
public String getColor() {
return color;
}
// Setter
public void setColor(String c) {
this.color = c;
}
}
Vehicle 클래스에 선언된 String 타입 변수인 Color는 private 속성이기 때문에 접근할 수 없다.
다만 Getter를 사용하여 color값을 반환하고 Setter를 사용하여 color를 매개변수로 초기화하면, main 메소드에서 color값을 쉽게 변경할 수 있는 것이다!
public static void main(String[] args) {
Vehicle v1 = new Vehicle();
v1.setColor("Red");
System.out.println(v1.getColor());
}
// Outputs "Red"
Getter와 Setter는 이후 제네릭 클래스를 구현할 때 이용하기도 하니 참고하자!
이렇게 한번 쭉 정리해보니 머릿속이 정돈되는 느낌이다. 앞으로 더 부지런해지자!! 파이팅! 👍