본문 바로가기
Study/Java

캡슐화

by _비니_ 2023. 8. 7.

위의 MotorBike 클래스가 가진 문제점

  • MotorBikeRunner 클래스가 직접적으로 MotorBike의 인스턴스 변수에 접근할 수 있다는 것.
  • MotorBikeRunner 별개의 클래스이기 때문에 좋지 않음.

이 때 필요한 개념이 캡슐화

캡슐화란?

요약 객체지향프로그래밍에서의 중요한 특징 중 하나로
연관된 데이터와 함수를 논리적으로 묶어놓고,
외부에서 쉽게 접근하지 못 하도록 은닉하는 것.

쉽게 얘기하면, 이 클래스만이 특정 클래스의 데이터에 접근해야 한다는 개념이라고 생각하면 된당!!

 

  • 클래스는 특정 클래스의 데이터를 직접적으로 바꿀 수 없고, 상태를 바꾸고자 한다면, 해당 클래스에서 수행하는 메서드를 통해야 함.

 

접근 제어자

 

캡슐화는 접근 제어자를 통해 변수나 메서드의 사용 권한을 설정할 수 있다.

private < default < protected < public

위 순서로 많은 접근을 허용한다.

 

예시를 통해 하나씩 알아보자

private

 

 

변수를 private으로 만들면 클래스 외부에서는 접근할 수 없다

즉 MotorBike 클래스 밖에서 speed 변수에 접근할 수 없는 것 !!

위 코드 보면 speed 컴파일 오류를 확인할 수 있음

 

그럼 어떻게 접근해야 할까?

 

MotorBike.java

 

MotorBikeRunner.java

 

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