자동차 관련된 기능들이 한 클래스에 모여 있을 때
허나 Person 클래스와 강하게 결합 되어 있을 때 캡슐화를 하면 자율성과 응집도를 높이고
느슨한 결합이 가능하다.
❓캡슐화를 하는 이유
1. 데이터 보호의 목적
2. 내부적으로만 사용되는 데이터에 대한 불필요한 외부 노출
-> 정보 은닉
외부로부터 객체의 속성과 기능이 함부로 변경되지 못하게 막고
데이터가 변경되더라도 다른 객체에 영향을 주지 않기에 독립성 확보.
자바에서 캡슐화를 수행하기 위한 핵심적인 수단으로 접근제어자와 Getter Setter 메서드를 중심으로 학습.
🔎패키지는 클래스들을 그룹 단위로 묶어 효과적으로 관리하기 위한 목적을 가지고 있다.
패키지의 장점
1. 클래스의 충돌을 방지해준다.
ex) 같은 이름의 클래스가 있다해도 각각 다른 패키지에 소속되어 있다면 이름명으로 충돌이 안된다.
🔎Import문
import문은 다른 패키지 내의 클래스를 사용하기 위해 사용된다.
🔎 제어자 : 클래스, 필드, 메서드, 생성자 등에 부가적인 의미를 부여하는 키워드이다.
ex) '파란 하늘' , '붉은 노을' 에서 파란과 붉은처럼 명사를 꾸며주는 형용사와 같은 역할
![](https://velog.velcdn.com/images/dydaks7878/post/1e0fa757-a565-4c80-9c75-039786c485d6/image.png
※기타제어자는 static, final, abstract 키워드가 주로 사용된다.
🔎 접근제어자
public(접근 제한 없음) > protected(동일 패키지, 하위 패키지) > default(동일 패키지) > private(동일크래스)
※변수명 앞에 아무런 접근제어자가 없는 경우 default가 해당 변수의 접근 제어자가 된다.
package package1; // 패키지명 package1
//파일명: Parent.java
class Test { // Test 클래스의 접근 제어자는 default
public static void main(String[] args) {
Parent p = new Parent();
// System.out.println(p.a); // 동일 클래스가 아니기 때문에 에러발생!
System.out.println(p.b);
System.out.println(p.c);
System.out.println(p.d);
}
}
public class Parent { // Parent 클래스의 접근 제어자는 public
private int a = 1; // a,b,c,d에 각각 private, default, protected, public 접근제어자 지정
int b = 2;
protected int c = 3;
public int d = 4;
public void printEach() { // 동일 클래스이기 때문에 에러발생하지 않음
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
}
}
// 출력값
2
3
4
동일한 패키지, 클래스여야만 private 변수 접근이 가능하다.
package com.sparta.algorithm.practice2;
public class child extends com.sparta.algorithm.practice.Parent {
public void printEach(){
System.out.println(a); // 에러
System.out.println(b); // 에러
System.out.println(c);
System.out.println(d);
}
}
public class Test2 {
public static void main(String[] args) {
Parent p = new Parent();
// System.out.println(p.a); // public을 제외한 모든 호출 에러!
// System.out.println(p.b);
// System.out.println(p.c);
System.out.println(p.d);
}
다른패키지의 하위클래스에 접근 가능한 protected(c)와 어디서든 접근이 가능한 public(d)에는 접근이 가능하다.
Test2 클래스에서는 상속받은 클래스가 아니기에 protected(c) 접근이 불가능
기억해야할 것은
접근 제어자를 통해 외부로부터 데이터를 보호하고, 불필요하게 데이터가 노출되는 것을 방지한다.
왜 getter, setter이 나오게 된걸까?
캡슐화의 목적을 달성하면서도 데이터의 변경이 필요한 경우를 위해서.
ex) private 접근제어자가 있는 객체의 변수의 데이터 값을 추가하거나 수정하고 싶을 때
public class Worker {
private String name;// 변수의 은닉화. 외부로부터 접근 불가
private int age;
private int id;
public String getName() { // 멤버 변수의 값
return name;
}
public int getAge() {
return age;
}
public int getId() {
return id;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
if(age < 1) return;
this.age = age;
}
public void setId(int id) {
this.id = id;
}
}
public static void main(String[] args) {
Worker worker = new Worker();
worker.setName("김코딩");
worker.setAge(30);
worker.setId(5);
String name = worker.getName();
System.out.println("근로자의 이름은 : " + name);
int age = worker.getAge();
System.out.println("근로자의 나이는 : " + age);
int Id = worker.getId();
System.out.println("근로자의 Id는 : " + Id);
}
// 출력값
근로자의 이름은 김코딩
근로자의 나이는 30
근로자의 ID는 5
setter 메서드는 외부에서 메서드에 접근하여 조건에 맞을 경우 데이터 값을 변경 가능하게 한다.
getter 메서드는 설정한 변수 값을 읽어오는데 사용한다.
이렇게 setter와 getter 메서드를 활용하면 데이터를 효과적으로 보호하면서도 의도하는 값으로 값을 변경하여 캡슐화를 보다 효과적으로 달성할 수 있습니다.