[Java] 객체지향개념(OOP) 캡슐화와 정보은닉

2023. 9. 3. 12:03·JAVA-기초/JAVA기본
728x90
반응형
SMALL

🟰Index

  1. 캡슐화
    1. String 클래스의 캡슐화
  2. 정보 은닉(OOP의 핵심)
    1. 객체의 타입 은닉(업 캐스팅)
    2. 더욱 객체를 은닉(디자인 패턴)
    3. 객체의 필드 , 메서드 은닉(캡슐화)
    4. 구현 은닉(인터페이스)

캡슐화(Encapsulation)

내부를 가리는 캡슐화, 정보 은닉 개념중 하나

객체의 속성과 행위를 하나로 묶고, 외부로부터 내부를 감싸 숨겨 은닉한다.

외부의 잘못된 접근으로 값이 변하는 의도치 않는 동작을 방지하는 보효 효과도 가능하다.

대표적으로 **protected, default, private**의 접근제어자를 통해 구현 가능

유효하지 않은 숫자로 직접 변수를 변경하려는 시도를 내부에서 유효성 체크 로직을 통해 거를 수 있다.

  • [ ] String클래스의 캡슐화String클래스는 final로 선언되어 있기 때문에 상속은 불가능 하다.
  • String 데이터는 불변의 데이터라고 불리우는데 그 이유가 바로 캡슐화때문이다.

🟰 정보 은닉(OOP의핵심)

객체지향 언어적 요소를 활용하여 객체에 대한 구체적인 정보를 노출시키지 않는 것

  • [ ] 정보은닉기법 대표적 3가지 방법
    • [ ] 객체의 구체적인 타입 은닉(=업캐스팅)
    • [ ] 객체의 필드 및 메서드 은닉(=캡슐화)
    • [ ] 구현 은닉(=인터페이스 & 추상 클래스)
  • [ ] 정보 은닉은 추상화 개념과 연결되는 대목디자인 패턴과 같이 좋은 설계를 대표 할 만한 것들은, 정보 은닉 기법을 통해 얻는 이득을 극대화 하기 위해 만들어진 것이다.
  • 객체지향의 설계 원칙(SOLID)과 각종 객체지향 설계에 관련된 격언들도 역시 정보 은닉에 기반을 두었다
  • 보안적인 측면 뿐만 아니라, 알 필요가 없어 덜 알아도 되어 덜 공부하여도 간편하게 사용할 수 있게 된다는 것이다.
  • [ ] UpCasting을 통한 정보 은닉✅ 문제점
    1. Rectangle메서드를 수정할경우 메인메서드에서도 영향이 간다.
    2. 새로운 객체인 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을 직접 정의하여 메인메서드에서 사용하는 코드

⏬위 문제점을 해결한 코드

✅해결방안

  1. Shape이라는 추상클래스를 만들어 다형성의 효과를 이용해준다.
  2. Shape 추상 클래스에서 객체의 호환성을 위해 draw라는 추상메서드를 명시한다.
  3. 자식 클래스에서도 이를 실행하도록 하면 모두 공통분모를 갖게 되는 셈이다.
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으로 객체를 참조한다.

🟰더욱 객체를 은닉하는 방법(디자인 패턴)

  • [ ] 위 코드를 리팩토링(팩토리 패턴)코드의 예제
    • [ ] 개선점
      1. 구체적인 자식 객체를 생성하는 책임을 담당하는 ShapeFactory클래스를 새로 만들어 주었다.
      2. 이렇게 만들면 오로지 Shape 클래스와 Shape Factory클래스만으로 Rectangle,Triangle 클래스를 생성할 수 있게 된다.
      3. 구체적인 객체에 대한 정보 은닉이 가능하다.
      4. 은닉이 되면 될 수록, 객체의 교체나 변경이 쉬워지게 되어 결과적으로 개발 생산성이 향상되게 된다.

🟰객체의 필드 & 메서드 은닉(캡슐화)

✅Process클래스의 코드

  • [ ] 문제점
    1. 이 클래스 객체를 사용하는 코드에 대해서는 모두 3개의 메서드에 대해 의존하게 된다.
    2. Process객체를 수정하거나 제거하게 될 경우 수정이 발생했을때 process클래스 자원을 사용하는 클래스에 대해 방대한 코드 수정을 해야 한다는 뜻이기도 하다.
    3. 불필요하게 많은 수의 메서드를 노출시키면, 호출 순서에 대한 연관관계에 대해 유추하는데 어려움이 생기고, 중요도를 유추하는데도 어려움을 겪는다.
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();
    }
}
  • [ ] 개선점
    1. 개별 메서드 호출 순서를 workd()에서 정해주고 있어 적은 학습량으로 쉽게 사용이 가능하다.
    2. 메서드들을 은닉함으로써 객체의 세부 내용을 덜 노출시키게 되어 보안에도 효과가 있다.

🟰 구현 은닉(인터페이스)

위 클래스는 은닉 메서드와 공개 메서드로 구분되고 통합적으로 관리하기 위해서

자바에서는 클래스와 유사하게 상속 가능한 타입이면서 구체적인 구현을 배제한 **인터페이스**를 만들어 메서드 추상화를 통해 상속 시킬 공개 메서드를 통합적으로 관리하게 되었다.

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();
    }
}
  • [ ] 개선점
    1. Process타입을 InterProcees인터페이스에 할당 할 수 있다. (다형성)
    2. 캡슐화를 통해 공개 메서드를 최소화 하고 인터페이스의 추상 메서드와 연동이 되면서, Process클래스의 기능이 작동하는데 업캐스팅으로 인한 멤버 제한과 같은 제한 요소는 없어진다.
    3. 이렇게 인터페이스를 사용하면 실질적 클래스 간의 의존관계가 없어지면서 기능 확장에 제약이 줄어든다.

 

728x90
반응형
SMALL

'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
'JAVA-기초/JAVA기본' 카테고리의 다른 글
  • [자료구조 - Graph 와 DFS] Graph와 DFS란?
  • 자바(java) - Optional이란?
  • 객체지향 프로그래밍 5가지 설계 원칙, SOLID- 단일책임의 원칙
  • 자바(Java) - 쓰레드란? start와 run의차이
공부하고 기억하는 공간
공부하고 기억하는 공간
IT 비전공자로 시작하여 훌륭한 개발자가 되기 위해 공부하고 있는 공간입니다. 틀린 내용이나 부족한 부분이 있으면 댓글로 알려주세요 바로 수정하겠습니다.
  • 공부하고 기억하는 공간
    IT - railroad
    공부하고 기억하는 공간
  • 전체
    오늘
    어제
    • 분류 전체보기 (329)
      • 면접 준비 (45)
        • OS (6)
        • Spring Security (0)
        • Java (3)
        • DB (11)
        • Network (3)
      • ElasticSearch (5)
      • Kafka (5)
      • Spring (60)
        • Spring Cloud (7)
        • Security6 (5)
        • JPA (12)
        • 프로젝트 리팩토링 회고록 (4)
        • Logging (8)
        • Batch (2)
      • Redis (17)
        • Redis 개념 (8)
        • Redis 채팅 (5)
        • Redis 읽기쓰기 전략 (1)
      • AWS (11)
      • 리눅스 (29)
        • 리눅스 마스터 2급 (5)
        • 네트워크(기초) (7)
        • 리눅스의 이해 (6)
        • 리눅스의 설치 (2)
        • 리눅스 운영 및 관리 (6)
      • JAVA-기초 (16)
        • JAVA기본 (11)
        • Design Pattern (5)
      • JSP (27)
        • JSP 기본 개념 (10)
        • JSP (1)
      • SQL (1)
      • TIL (36)
      • 문제 풀이 (39)
        • Programmers (9)
        • 백준 문제풀이 (28)
      • JavaScript (10)
      • HTML (17)
      • Ngrinder (1)
        • Ngrinder 문서 정리 (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      Springframework
      자바 알고리즘
      자바 면접질문
      jsp기초
      레디스
      jsp request
      스프링프레임워크
      HTML
      redis 채팅
      자바 반복문
      Til
      리눅스
      프로그래머스
      JavaScript
      redis
      java
      JSP
      자바 면접
      springsecurity
      자바기초
      CSS
      Spring Data Redis
      spring redis
      JS
      자바
      Spring
      리눅스마스터2급
      리눅스마스터2급정리
      백준
      자바스크립트
    • 최근 댓글

    • 최근 글

    • 250x250
    • hELLO· Designed By정상우.v4.10.3
    공부하고 기억하는 공간
    [Java] 객체지향개념(OOP) 캡슐화와 정보은닉
    상단으로

    티스토리툴바