위의 MotorBike 클래스가 가진 문제점
- MotorBikeRunner 클래스가 직접적으로 MotorBike의 인스턴스 변수에 접근할 수 있다는 것.
- MotorBikeRunner 별개의 클래스이기 때문에 좋지 않음.
이 때 필요한 개념이 캡슐화
캡슐화란?
요약 객체지향프로그래밍에서의 중요한 특징 중 하나로
연관된 데이터와 함수를 논리적으로 묶어놓고,
외부에서 쉽게 접근하지 못 하도록 은닉하는 것.
쉽게 얘기하면, 이 클래스만이 특정 클래스의 데이터에 접근해야 한다는 개념이라고 생각하면 된당!!
- 클래스는 특정 클래스의 데이터를 직접적으로 바꿀 수 없고, 상태를 바꾸고자 한다면, 해당 클래스에서 수행하는 메서드를 통해야 함.
접근 제어자
캡슐화는 접근 제어자를 통해 변수나 메서드의 사용 권한을 설정할 수 있다.
private < default < protected < public
위 순서로 많은 접근을 허용한다.
예시를 통해 하나씩 알아보자
private
변수를 private으로 만들면 클래스 외부에서는 접근할 수 없다
즉 MotorBike 클래스 밖에서 speed 변수에 접근할 수 없는 것 !!
위 코드 보면 speed 컴파일 오류를 확인할 수 있음
그럼 어떻게 접근해야 할까?
setSpeed, getSpeed를 이용해 접근해야 한다!
입력할 때는 set, 가져올 때는 get
void setSpeed(int speed) {
this.speed = speed;
}
- setSpeed : 메소드 이름
- int speed : 입력된 매개변수
- this.speed : member 클래스 내에 있는 private int speed
int getSpeed() {
return speed;
}
- getSpeed : 메소드 이름
- return : 반환
- speed : member 클래스 내에 있는 private int speed에 저장되어 있는 값
default
접근 제어자를 따로 설정하지 않으면 default 접근 제어자가 자동으로 설정되어
동일한 패키지 안에서만 접근이 가능하다!
package house;
public class HousePark {
String lastname = "park";
}
- 위 코드에서 lastname은 default로 설정됨.
package house;
public class HouseLee {
String lastname = "lee";
public static void main(String[] args) {
HousePark park = new HousePark();
System.out.println(park.lastname);
}
}
- 둘이 package가 같으므로 HouseLee 클래스에서 default 접근 제어자로 설정된 HousePark의 lastname에 접근할 수 있는 것이다!!
Protected
동일 패키지의 클래스 또는 해당 클래스를 상속 받은 클래스에서만 접근이 가능하다 !
package house;
public class HousePark {
protected String lastname = "park";
}
package house.person;
import house.HousePark;
public class hyeonbinPark extends HousePark {
public static void main(String[] args) {
hyeonbinPark hbp = new hyeonbinPark();
System.out.println(hbp.lastname);
}
}
- 둘은 패키지는 다르지만 hyeonbinPark 클래스의 패키지가 HousePark 클래스를 상속했고,
- HousePark의 lastname 변수의 접근 제어자는 protected 이므로 접근이 가능한 것!!
Public
public 접근 제어자가 붙은 변수나 메서드는
어떤 클래스에서도 접근이 가능하다 !-!
package house;
public class HousePark {
protected String lastname = "park";
pucblis String msg = "This is public message";
}
- HousePark의 msg 변수의 접근 제어자는 public 이므로 어떤 클래스에서도 접근이 가능하다.
import house.HousePark;
public class Sample {
public static void main(String[] args) {
HousePark housePark = new HousePark();
System.out.println(housePark.msg);
}
}
- 즉 다음과 같이 코드를 작성할 수 있다.
캡슐화의 장점
왜 데이터는 메서드를 거쳐서만 외부에 노출돼야 할까?
- 예를 들어 setSpeed를 -100이라고 하자. 하지만 차의 속도가 -100일 수는 없음.
- 여기에서 메서드를 사용하면, 이런 일을 막아줄 논리를 만들 수 있다
- 메서드를 통해 특정 개체에 들어갈 수 있는 것과 없는 것을 메서드를 통해 검증하는 것이 캡슐화의 주요 기능!!
- 실행하면 속도 -100의 변화는 실행되지 않는 것을 확인할 수 있다. ( 예외 떠넘기기는 다음에 배움 )
속도가 증가하는 increaseSpeed 연산을 만들어 중복 제거 => 캡슐화 2단계
캡슐화는 객체 지향 프로그래밍에서 정말 기본적이고 중요한 개념이라고 할 수 있다.
캡슐화의 개념을 잘 이해하고 사용하는 것이 중요!!★★★
다음에는 객체 지향 프로그래밍에서 캡슐화만큼 중요한 추상화에 대해 공부해보려 한당
'Study > Java' 카테고리의 다른 글
추상화 (인터페이스, 추상 클래스) (0) | 2023.08.08 |
---|---|
자바 객체 지향 프로그래밍 소개 (0) | 2023.08.07 |
Refactoring (0) | 2023.08.07 |
Eclipse 다운로드 & 단축키 (0) | 2023.08.07 |
Java 설치 & 환경 변수 설정 (0) | 2023.08.05 |