logo

Java의 캡슐화

Java의 캡슐화는 객체 지향 프로그래밍(OOP)의 기본 개념으로, Java에서 클래스라고 하는 단일 단위 내에서 데이터와 해당 데이터에 대해 작동하는 메서드를 묶는 것을 의미합니다. Java 캡슐화는 외부 액세스로부터 클래스의 구현 세부 정보를 숨기고 클래스와 상호 작용하는 데 사용할 수 있는 공용 인터페이스만 노출하는 방법입니다.

자바 char을 int로 변환

Java에서는 클래스의 인스턴스 변수를 비공개로 선언하여 캡슐화를 수행합니다. 즉, 해당 변수는 클래스 내에서만 액세스할 수 있습니다. 인스턴스 변수에 대한 외부 액세스를 허용하기 위해 각각 인스턴스 변수의 값을 검색하고 수정하는 데 사용되는 getter 및 setter라는 공용 메서드가 정의됩니다. getter 및 setter를 사용하여 클래스는 자체 데이터 유효성 검사 규칙을 적용하고 내부 상태가 일관되게 유지되도록 할 수 있습니다.



Java 캡슐화 구현

다음은 Java 캡슐화를 사용한 예입니다.

자바








// Java Program to demonstrate> // Java Encapsulation> // Person Class> class> Person {> >// Encapsulating the name and age> >// only approachable and used using> >// methods defined> >private> String name;> >private> int> age;> >public> String getName() {>return> name; }> >public> void> setName(String name) {>this>.name = name; }> >public> int> getAge() {>return> age; }> >public> void> setAge(>int> age) {>this>.age = age; }> }> // Driver Class> public> class> Main {> >// main function> >public> static> void> main(String[] args)> >{> >// person object created> >Person person =>new> Person();> >person.setName(>'John'>);> >person.setAge(>30>);> >// Using methods to get the values from the> >// variables> >System.out.println(>'Name: '> + person.getName());> >System.out.println(>'Age: '> + person.getAge());> >}> }>

>

>

산출

Name: John Age: 30>

캡슐화 단일 단위로 데이터를 정리하는 것으로 정의됩니다. 이는 코드와 코드가 조작하는 데이터를 함께 묶는 메커니즘입니다. 캡슐화에 대해 생각하는 또 다른 방법은 이 쉴드 외부의 코드가 데이터에 액세스하는 것을 방지하는 보호 쉴드라는 것입니다.

  • 기술적으로 캡슐화에서는 클래스의 변수나 데이터가 다른 클래스로부터 숨겨지며 선언된 클래스의 멤버 함수를 통해서만 액세스할 수 있습니다.
  • 캡슐화와 마찬가지로 클래스의 멤버나 메서드를 비공개로 만들어 클래스의 데이터를 데이터 숨김 개념을 사용하여 다른 클래스로부터 숨기고, 클래스는 세부 정보를 제공하지 않고 최종 사용자나 세상에 노출됩니다. 추상화 개념을 사용한 구현 뒤에 있으므로 데이터 은닉과 추상화의 결합 .
  • 캡슐화는 클래스의 모든 변수를 비공개로 선언하고 클래스에 공개 메서드를 작성하여 변수 값을 설정하고 가져옴으로써 달성할 수 있습니다.
  • 이는 setter 및 getter 메소드로 더 자세히 정의됩니다.

캡슐화의 장점

  • 데이터 숨기기: 이는 구현 세부 사항을 숨겨 데이터 멤버의 액세스를 제한하는 방법입니다. 캡슐화는 데이터를 숨기는 방법도 제공합니다. 사용자는 클래스의 내부 구현에 대해 전혀 모릅니다. 클래스가 변수에 값을 저장하는 방법은 사용자에게 표시되지 않습니다. 사용자는 값을 setter 메소드에 전달하고 변수가 해당 값으로 초기화된다는 것만 알 수 있습니다.
  • 향상된 유연성: 요구 사항에 따라 클래스의 변수를 읽기 전용 또는 쓰기 전용으로 만들 수 있습니다. 변수를 읽기 전용으로 만들려면 위 프로그램에서 setName(), setAge() 등과 같은 setter 메서드를 생략해야 하며, 변수를 쓰기 전용으로 만들려면 다음을 생략해야 합니다. 위 프로그램에서 getName(), getAge() 등과 같은 메소드를 가져옵니다.
  • 재사용 성: 캡슐화는 재사용성을 향상시키고 새로운 요구 사항에 따라 쉽게 변경할 수 있습니다.
  • 테스트 코드는 쉽습니다. 캡슐화된 코드는 단위 테스트를 위해 테스트하기 쉽습니다.
  • 시스템의 세부 사항을 구현하는 프로그래머의 자유: 이는 프로그래머가 시스템의 세부 사항을 구현할 수 있는 자유를 제공한다는 캡슐화의 주요 장점 중 하나입니다. 프로그래머의 유일한 제약은 외부인이 볼 수 있는 추상 인터페이스를 유지하는 것입니다.

예를 들어: 텍스트 편집기 GUI의 편집 메뉴 코드 프로그래머는 처음에는 외부 버퍼 안팎으로 실제 화면 이미지를 복사하여 잘라내기 및 붙여넣기 작업을 구현할 수 있습니다. 나중에 이 구현이 불만족스러울 수도 있습니다. 선택 항목을 압축적으로 저장할 수 없고 텍스트와 그래픽 개체를 구분하지 않기 때문입니다. 프로그래머가 캡슐화를 염두에 두고 잘라내어 붙여넣기 인터페이스를 설계한 경우 기본 구현을 텍스트를 적절한 압축 형식의 텍스트 및 그래픽 개체로 저장하는 구현으로 전환하면 이 GUI와 인터페이스해야 하는 기능에 문제가 발생하지 않습니다. . 따라서 캡슐화는 적응성을 제공합니다. 왜냐하면 다른 부분에 부정적인 영향을 주지 않고 프로그램 부분의 구현 세부 사항을 변경할 수 있기 때문입니다.

Java 캡슐화의 단점

  • 특히 적절하게 사용하지 않으면 복잡성이 증가할 수 있습니다.
  • 시스템 작동 방식을 이해하기가 더 어려워질 수 있습니다.
  • 구현의 유연성이 제한될 수 있습니다.

Java의 데이터 캡슐화를 보여주는 예

예시 1:

다음은 위 주제의 구현입니다.

자바




// Java Program to demonstrate> // Java Encapsulation> // fields to calculate area> class> Area {> >int> length;> >int> breadth;> >// constructor to initialize values> >Area(>int> length,>int> breadth)> >{> >this>.length = length;> >this>.breadth = breadth;> >}> >// method to calculate area> >public> void> getArea()> >{> >int> area = length * breadth;> >System.out.println(>'Area: '> + area);> >}> }> class> Main {> >public> static> void> main(String[] args)> >{> >Area rectangle =>new> Area(>2>,>16>);> >rectangle.getArea();> >}> }>

>

>

산출

Area: 32>

예시 2:

EncapsulateDemo 클래스의 변수에 액세스하는 프로그램은 다음과 같습니다.

자바

이진 트리 우편 주문 순회




모니터 크기를 결정하는 방법

// Java program to demonstrate> // Java encapsulation> class> Encapsulate {> >// private variables declared> >// these can only be accessed by> >// public methods of class> >private> String geekName;> >private> int> geekRoll;> >private> int> geekAge;> >// get method for age to access> >// private variable geekAge> >public> int> getAge() {>return> geekAge; }> >// get method for name to access> >// private variable geekName> >public> String getName() {>return> geekName; }> >// get method for roll to access> >// private variable geekRoll> >public> int> getRoll() {>return> geekRoll; }> >// set method for age to access> >// private variable geekage> >public> void> setAge(>int> newAge) { geekAge = newAge; }> >// set method for name to access> >// private variable geekName> >public> void> setName(String newName)> >{> >geekName = newName;> >}> >// set method for roll to access> >// private variable geekRoll> >public> void> setRoll(>int> newRoll) { geekRoll = newRoll; }> }> public> class> TestEncapsulation {> >public> static> void> main(String[] args)> >{> >Encapsulate obj =>new> Encapsulate();> >// setting values of the variables> >obj.setName(>'Harsh'>);> >obj.setAge(>19>);> >obj.setRoll(>51>);> >// Displaying values of the variables> >System.out.println(>'Geek's name: '> + obj.getName());> >System.out.println(>'Geek's age: '> + obj.getAge());> >System.out.println(>'Geek's roll: '> + obj.getRoll());> >// Direct access of geekRoll is not possible> >// due to encapsulation> >// System.out.println('Geek's roll: ' +> >// obj.geekName);> >}> }>

>

>

산출

Geek's name: Harsh Geek's age: 19 Geek's roll: 51>

예시 3:

위 프로그램에서 Encapsulate 클래스는 변수가 private으로 선언되어 캡슐화됩니다. getAge(), getName() 및 getRoll()과 같은 get 메소드는 공개로 설정되며 이러한 메소드는 이러한 변수에 액세스하는 데 사용됩니다. setName(), setAge(), setRoll()과 같은 setter 메소드도 공개로 선언되어 변수 값을 설정하는 데 사용됩니다.

다음은 정의된 예제의 구현입니다.

자바




// Java Program to demonstrate> // Java Encapsulation> class> Name {> >// Private is using to hide the data> >private> int> age;> >// getter> >public> int> getAge() {>return> age; }> >// setter> >public> void> setAge(>int> age) {>this>.age = age; }> }> // Driver Class> class> GFG {> >// main function> >public> static> void> main(String[] args)> >{> >Name n1 =>new> Name();> >n1.setAge(>19>);> >System.out.println(>'The age of the person is: '> >+ n1.getAge());> >}> }>

>

>

산출

The age of the person is: 19>

예시 4:

다음은 Java 캡슐화의 구현입니다.

자바

Desktop.ini가 뭐죠?




// Java Program to demonstrate> // Java Encapsulation> class> Account {> >// private data members to hide the data> >private> long> acc_no;> >private> String name, email;> >private> float> amount;> >// public getter and setter methods> >public> long> getAcc_no() {>return> acc_no; }> >public> void> setAcc_no(>long> acc_no)> >{> >this>.acc_no = acc_no;> >}> >public> String getName() {>return> name; }> >public> void> setName(String name) {>this>.name = name; }> >public> String getEmail() {>return> email; }> >public> void> setEmail(String email)> >{> >this>.email = email;> >}> >public> float> getAmount() {>return> amount; }> >public> void> setAmount(>float> amount)> >{> >this>.amount = amount;> >}> }> // Driver Class> public> class> GFG {> >// main function> >public> static> void> main(String[] args)> >{> >// creating instance of Account class> >Account acc =>new> Account();> >// setting values through setter methods> >acc.setAcc_no(90482098491L);> >acc.setName(>'ABC'>);> >acc.setEmail(>'[email protected]'>);> >acc.setAmount(100000f);> >// getting values through getter methods> >System.out.println(> >acc.getAcc_no() +>' '> + acc.getName() +>' '> >+ acc.getEmail() +>' '> + acc.getAmount());> >}> }>

>

>

산출

90482098491 ABC [email protected] 100000.0>