지난번 접근제한자(Access modifier)에 이어서 이번글에서는
캡슐화(Encapsulation)에 대해서 알아보겠습니다.
캡슐화의 개념을 알기 위해서는 접근제한자에 대한
이해가 필수입니다.
아래 접근제한자에 대한 설명글 링크를 참고해주세요!
https://jaythecode.tistory.com/14
자바(JAVA) 기초 함께 알아보자(14) - 접근제한자(Access modifier) public/private
지난번 자바 클래스(class) / 객체(Object)와 인스턴스(Instance)에 이어서이번글에서는 접근제한자(Access modifier)에 대해서 알아보겠습니다. 여러분들은 자바를 하면서 public이 무엇을 뜻하는지 생각
jaythecode.tistory.com
캡슐화 (Encapsulation)
캡슐화(Encapsualtion)는 클래스 내의 변수(attribute)에 유저가
직접 접근하는 것을 제한하기 위해서 사용됩니다.
유저가 직접 변수에 접근해서 값을 변경할 수 있다면
보안적인 측면이나 코드 안정성에 큰 문제가 생길 수 있습니다.
따라서 클래스내의 변수는 접근제한자를 private으로 할당하고
변수에 접근할 수 있는 public 메소드를 따로 만들어서 사용합니다.
이를 캡슐화(encapsulation)라고 부릅니다.
아래의 예시를 보면서 자세히 알아보겠습니다.
class Emploee{
public String name;
public int salary;
public String department;
Emploee(String name, int salary, String department){
this.name = name;
this.salary = salary;
this.department = department;
}
@Override
public String toString(){
return "Name: " + this.name + " | Department: " + this.department + " | salary: " + this.salary;
}
}
class Company{
public static void main(String[] args){
Emploee mark = new Emploee("Mark", 8000, "IT");
System.out.println(mark);
// salary변경
mark.salary = 10000;
System.out.println(mark);
}
}
아래 사진은 console에 출력되는 결과입니다.
보시는 것과 같이 변수(attribute)를 public으로 설정할 경우
간단하게 변수의 값(value)을 조작하는 것이 가능합니다.
그렇다면 private으로 설정했을 때는 어떻게 진행되는지
한번 살펴보도록 하겠습니다.
class Emploee{
private String name;
private int salary;
private String department;
Emploee(String name, int salary, String department){
this.name = name;
this.salary = salary;
this.department = department;
}
@Override
public String toString(){
return "Name: " + this.name + " | Department: " + this.department + " | salary: " + this.salary;
}
}
class Company{
public static void main(String[] args){
Emploee mark = new Emploee("Mark", 8000, "IT");
System.out.println(mark);
// salary변경
mark.salary = 10000;
System.out.println(mark);
}
}
변수들을 private으로 설정하자 아래와 같이 mark.salary에서 오류가
발생합니다.
이는 private으로 인해 변수에 직접적인 접근이 안된다는 것을
의미합니다.
private인 변수들도 코드를 작성하다 보면 값을 설정해야 할 때도 있고
값을 불러와야 할 경우들도 있습니다.
그렇다면 이런 경우에는 어떻게 해야 할까요?
정답은 getter와 setter 메소드를 사용하는 것입니다.
Getter & Setter 메소드
getter(accessor) 와 setter(mutator) 메소드는 이름에서 보이는 것과 같이
값을 설정하거나 값을 불러오는 것을 도와주는 메소드입니다.
아래 예시를 보면서 자세히 알아보겠습니다.
class Emploee{
private String name;
private int salary;
private String department;
Emploee(String name, int salary, String department){
this.name = name;
this.salary = salary;
this.department = department;
}
public String getName(){
return this.name;
}
public int getSalary(){
return this.salary;
}
public String getDepartment(){
return this.department;
}
public void setDepartment(String newDepartment){
this.department = newDepartment;
}
@Override
public String toString(){
return "Name: " + this.name + " | Department: " + this.department + " | salary: " + this.salary;
}
}
class Company{
public static void main(String[] args){
Emploee mark = new Emploee("Mark", 8000, "IT");
System.out.println("Name: " + mark.getName());
System.out.println("Salary: " + mark.getSalary());
System.out.println("Department: " + mark.getDepartment());
// Mart Department setter로 변경
mark.setDepartment("Marketing");
System.out.println("New Department: " + mark.getDepartment());
}
}
위와 같이 필요한 변수에 getter와 setter메소드를 만들어
아래와 같이 유의미한 변화를 가져올 수 있습니다.
이처럼 getter와 setter를 사용하면 private으로 설정한 변수에도
접근하여 값을 불러오거나 수정하는 것이 가능합니다.
getter(Accessor)를 작성하는 방법은 다음과 같습니다.
public 데이터타입(String, int, ... ) 메소드명(get~~~) (){
return this.변수명;
}
메소드명은 통상적으로 get변수명으로 작성하니 참고 부탁드립니다.
그리고 값을 return 받아야 하므로 데이터 타입을 지정하고
{ } 안에는 return this.변수명을 적어야 합니다.
setter(Mutator)를 작성하는 방법은 다음과 같습니다.
public void 메소드명(set~~~) (데이터타입 변수명1){
this.변경할 변수 = 변수명1;
}
이 메소드는 아무것도 반환(return) 하지 않으므로 void를 붙여야 합니다.
메소드명은 통상적으로 set변수명으로 작성됩니다.
또한 ( ) 안에는 변경할 변수의 데이터 타입에 맞는 변수를
작성해야 합니다.
{ } 안에서는 this.변경할 변수 = 변수명1; 과 같은 코드를 작성하여
성공적으로 변수의 값을 변경할 수 있습니다.
지금까지 캡슐화(Encapsulation)에 대해서 알아보았습니다.
객체지향 프로그램에서 다양한 클래스를 작성하고
그 안에서 변수의 무분별한 접근을 막는 캡슐화는
선택이 아닌 필수입니다!
올바른 getter와 setter의 사용으로 잘 짜인 클래스를 작성하는데
조금이나마 도움이 되길 바랍니다!
다음 글에서는 Arraylist에 대해서 알아보겠습니다.
'자바(JAVA) 기초 함께 알아보자' 카테고리의 다른 글
자바(JAVA) 기초 함께 알아보자(17) - Array(배열)과 ArrayList의 차이 (2) | 2024.10.19 |
---|---|
자바(JAVA) 기초 함께 알아보자(16) - ArrayList(배열) (0) | 2024.10.07 |
자바(JAVA) 기초 함께 알아보자(14) - 접근제한자(Access modifier) public/private (0) | 2024.10.04 |
자바(JAVA)기초 함께 알아보자(13) - 자바 클래스(class) / 오브젝트&인스턴스(object & instance) (2) | 2024.09.29 |
자바(JAVA) 기초 함께 알아보자(12) - Scanner클래스 와 입력 (0) | 2024.09.28 |