728x90
반응형
🟰Index
- 캡슐화
- String 클래스의 캡슐화
- 정보 은닉(OOP의 핵심)
- 객체의 타입 은닉(업 캐스팅)
- 더욱 객체를 은닉(디자인 패턴)
- 객체의 필드 , 메서드 은닉(캡슐화)
- 구현 은닉(인터페이스)
캡슐화(Encapsulation)
내부를 가리는 캡슐화, 정보 은닉 개념중 하나
객체의 속성과 행위를 하나로 묶고, 외부로부터 내부를 감싸 숨겨 은닉한다.
외부의 잘못된 접근으로 값이 변하는 의도치 않는 동작을 방지하는 보효 효과도 가능하다.
대표적으로 **protected, default, private**의 접근제어자를 통해 구현 가능
유효하지 않은 숫자로 직접 변수를 변경하려는 시도를 내부에서 유효성 체크 로직을 통해 거를 수 있다.
- [ ] String클래스의 캡슐화String클래스는 final로 선언되어 있기 때문에 상속은 불가능 하다.
- String 데이터는 불변의 데이터라고 불리우는데 그 이유가 바로 캡슐화때문이다.
🟰 정보 은닉(OOP의핵심)
객체지향 언어적 요소를 활용하여 객체에 대한 구체적인 정보를 노출시키지 않는 것
- [ ] 정보은닉기법 대표적 3가지 방법
- [ ] 객체의 구체적인 타입 은닉(=업캐스팅)
- [ ] 객체의 필드 및 메서드 은닉(=캡슐화)
- [ ] 구현 은닉(=인터페이스 & 추상 클래스)
- [ ] 정보 은닉은 추상화 개념과 연결되는 대목디자인 패턴과 같이 좋은 설계를 대표 할 만한 것들은, 정보 은닉 기법을 통해 얻는 이득을 극대화 하기 위해 만들어진 것이다.
- 객체지향의 설계 원칙(SOLID)과 각종 객체지향 설계에 관련된 격언들도 역시 정보 은닉에 기반을 두었다
- 보안적인 측면 뿐만 아니라, 알 필요가 없어 덜 알아도 되어 덜 공부하여도 간편하게 사용할 수 있게 된다는 것이다.
- [ ] UpCasting을 통한 정보 은닉✅ 문제점
- Rectangle메서드를 수정할경우 메인메서드에서도 영향이 간다.
- 새로운 객체인 Square나 Triangle을 추가로 구현하고 Rectangle대신 Triangle을 사용하는 경우 메인 메서드에 있는 초기화 코드부터 메서드 사용 코드를 통째로 바꾸어 주어야 한다.
lass Rectangle{ public void rectangle(){ System.out.println("rectangle"); } } class Myclass { // ... public void method() { Rectangle rectangle = new Rectangle(); // Rectangle 객체 생성 rectangle.rectangle(); // Myclass 클래스는 Rectangle 클래스에 의존적인 코드 } }
- 자식 객체 타입을 은닉함으로써 얻는 효과가 있기 때문 (다형성) ⏬Rectangle을 직접 정의하여 메인메서드에서 사용하는 코드
⏬위 문제점을 해결한 코드
✅해결방안
- Shape이라는 추상클래스를 만들어 다형성의 효과를 이용해준다.
- Shape 추상 클래스에서 객체의 호환성을 위해 draw라는 추상메서드를 명시한다.
- 자식 클래스에서도 이를 실행하도록 하면 모두 공통분모를 갖게 되는 셈이다.
abstract class Shape{
abstract public void draw(); // 하나의 공통 메소드로 각 자식 클래스 고유의 메서드 동작이 실행되도록 추상화
}
class Rectangle extends Shape{
public void draw(){
rectangle();
}
private void rectangle(){
System.out.println("rectangle");
}
}
class Triangle extends Shape{
public void draw(){
triangle();
}
private void triangle(){
System.out.println("triangle");
}
}
public class Myclass {
// ...
public void method() {
Shape shape = new Rectangle(); // 다형성
shape.draw(); // "rectangle" - 구체적인 Rectangle 객체 타입에 의존적이지 않게 되고 추상 통합 타입인 Shape 클래스에 의존적이게 되었다
}
}
- [ ] 개선점업 캐스팅을 통해 객체의 타입과 메서드를 은닉할 수 있다.Rectangle의 생성 코드 이후에는 어떤 코드도 Rectangle에 의존하지 않는다.
- 해당 클래스에 대한 객체를 만들어서 사용하는 다른 클래스들은 변동에 영향을 받지 않는다.
- shape클래스의 draw()메서드만 호출함으로써, Rectangle 클래스와 관련된 메서드 private void rectangle()이 직접적으로 호출되지 않은것
- 상위 타입인 Shape클래스 참조 변수인 shape으로 객체를 참조한다.
🟰더욱 객체를 은닉하는 방법(디자인 패턴)
- [ ] 위 코드를 리팩토링(팩토리 패턴)코드의 예제
- [ ] 개선점
- 구체적인 자식 객체를 생성하는 책임을 담당하는 ShapeFactory클래스를 새로 만들어 주었다.
- 이렇게 만들면 오로지 Shape 클래스와 Shape Factory클래스만으로 Rectangle,Triangle 클래스를 생성할 수 있게 된다.
- 구체적인 객체에 대한 정보 은닉이 가능하다.
- 은닉이 되면 될 수록, 객체의 교체나 변경이 쉬워지게 되어 결과적으로 개발 생산성이 향상되게 된다.
- [ ] 개선점
🟰객체의 필드 & 메서드 은닉(캡슐화)
✅Process클래스의 코드
- [ ] 문제점
- 이 클래스 객체를 사용하는 코드에 대해서는 모두 3개의 메서드에 대해 의존하게 된다.
- Process객체를 수정하거나 제거하게 될 경우 수정이 발생했을때 process클래스 자원을 사용하는 클래스에 대해 방대한 코드 수정을 해야 한다는 뜻이기도 하다.
- 불필요하게 많은 수의 메서드를 노출시키면, 호출 순서에 대한 연관관계에 대해 유추하는데 어려움이 생기고, 중요도를 유추하는데도 어려움을 겪는다.
class Process{
public void init(){}
public void process(){}
public void release(){}
}
✅개선 코드
class Process{
private void init(){} // 은닉 메서드
private void process(){} // 은닉 메서드
private void release(){} // 은닉 메서드
public void work(){ // 공개 메서드
init(); // 은닉한 메서드 실행
process();
release();
}
}
- [ ] 개선점
- 개별 메서드 호출 순서를 workd()에서 정해주고 있어 적은 학습량으로 쉽게 사용이 가능하다.
- 메서드들을 은닉함으로써 객체의 세부 내용을 덜 노출시키게 되어 보안에도 효과가 있다.
🟰 구현 은닉(인터페이스)
위 클래스는 은닉 메서드와 공개 메서드로 구분되고 통합적으로 관리하기 위해서
자바에서는 클래스와 유사하게 상속 가능한 타입이면서 구체적인 구현을 배제한 **인터페이스**를 만들어 메서드 추상화를 통해 상속 시킬 공개 메서드를 통합적으로 관리하게 되었다.
interface InterProcess {
public void work(); // 추상 메소드
}
class Process implements InterProcess {
private void init(){} // 은닉 메서드
private void process(){} // 은닉 메서드
private void release(){} // 은닉 메서드
public void work(){ // 공개 메서드 + 메소드 구체화
init();
process();
release();
}
}
public class Main {
public static void main(String[] args) {
InterProcess c = new Process(); // 인터페이스 역시 상위 클래스 타입 처럼 이용될 수 있다
c.work();
}
}
- [ ] 개선점
- Process타입을 InterProcees인터페이스에 할당 할 수 있다. (다형성)
- 캡슐화를 통해 공개 메서드를 최소화 하고 인터페이스의 추상 메서드와 연동이 되면서, Process클래스의 기능이 작동하는데 업캐스팅으로 인한 멤버 제한과 같은 제한 요소는 없어진다.
- 이렇게 인터페이스를 사용하면 실질적 클래스 간의 의존관계가 없어지면서 기능 확장에 제약이 줄어든다.
728x90
반응형
'JAVA-기초 > JAVA기본' 카테고리의 다른 글
[자료구조 - Graph 와 DFS] Graph와 DFS란? (0) | 2024.02.24 |
---|---|
자바(java) - Optional이란? (2) | 2023.12.06 |
객체지향 프로그래밍 5가지 설계 원칙, SOLID- 단일책임의 원칙 (64) | 2023.08.12 |
자바(Java) - 쓰레드란? start와 run의차이 (0) | 2023.04.03 |
자바(Java) 참조변수의 형변환(업캐스팅/다운캐스팅) (0) | 2023.02.09 |