CodeGym/Java Blog/무작위의/Java의 액세스 한정자
John Squirrels
레벨 41
San Francisco

Java의 액세스 한정자

무작위의 그룹에 게시되었습니다
회원
안녕! 오늘 강의에서는 액세스 수정자의 개념에 대해 알아보고 이를 사용하는 방법의 예를 살펴보겠습니다. 물론 '익숙해지다'라고 말하는 것은 옳지 않습니다. 이전 수업에서 이미 대부분의 항목에 익숙합니다. 만일을 대비하여 가장 중요한 점에 대한 기억을 되살리자. 수정자 액세스는 대부분 코드의 다른 부분에 대한 액세스를 규제하는 키워드입니다. 왜 '가장 자주'? 그 중 하나는 키워드를 사용하지 않고 기본적으로 설정되기 때문입니다 :) Java에는 4개의 액세스 수정자가 있습니다. 가장 제한적인 것부터 가장 '관대한' 것까지 순서대로 나열합니다.
  • 사적인;
  • 기본값(패키지 표시);
  • 보호;
  • 공공의.
각각을 살펴보고 유용할 수 있는 경우를 식별해 보겠습니다. 그리고 우리는 예를 줄 것입니다 :)

개인 한정자

액세스 한정자.  개인, 보호, 기본, 공개 - 2private 은 가장 제한적인 액세스 한정자입니다. 단일 클래스 내에서 데이터 및 메서드의 가시성을 제한합니다. getter 및 setter에 대한 강의에서 이 수정자를 알고 있습니다. 이 예를 기억하십니까?
public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }
}

public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       cat.name = "";
       cat.age = -1000;
       cat.weight = 0;
   }
}
우리는 이전 수업에서 그것을 고려했습니다. 우리는 여기서 심각한 실수를 저질렀습니다. 데이터를 공개하여 동료 프로그래머가 필드에 직접 액세스하고 해당 값을 변경할 수 있도록 했습니다. 게다가... 이 값은 확인 없이 할당되었습니다. 이것은 우리 프로그램이 나이가 -1000세이고 가중치가 0인 ""이라는 이름의 고양이를 생성할 수 있음을 의미합니다. 이 문제를 해결하기 위해 우리는 getter 및 setter를 사용했으며 개인 수정자를 사용하여 데이터에 대한 액세스를 제한했습니다.
public class Cat {

   private String name;
   private int age;
   private int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       // input parameter check
       this.name = name;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       // input parameter check
       this.age = age;
   }

   public int getWeight() {
       return weight;
   }

   public void setWeight(int weight) {
       // input parameter check
       this.weight = weight;
   }
}
기본적으로 필드에 대한 액세스를 제한하고 getter 및 setter를 구현하는 것이 비공개 방식의 가장 일반적인 예입니다.실제 작업에 사용될 것입니다. 즉, 이 수정자의 주요 목적은 프로그램에서 캡슐화를 달성하는 것입니다. 그런데 이것은 필드에만 적용되는 것은 아닙니다. 프로그램에 매우 복잡한 기능을 구현하는 메서드가 있다고 상상해 보십시오. 예를 들어 무엇을 제안할 수 있습니까? readDataFromCollider() 메서드가 데이터 주소를 입력으로 받아들이고, Large Hadron Collider에서 바이트 형식으로 데이터를 읽고, 이 데이터를 텍스트로 변환하고, 파일에 쓰고, 인쇄한다고 가정해 보겠습니다. 코드는 말할 것도 없고 메서드에 대한 설명도 무섭게 보입니다. :) 코드를 더 읽기 쉽게 만들려면 메서드의 복잡한 논리를 한 곳에 모두 작성하지 않는 것이 가장 좋습니다. 대신 기능을 별도의 메서드로 분리해야 합니다. 예를 들어, readByteData()메서드는 데이터 읽기를 담당하고, convertBytesToSymbols() 메서드는 충돌체에서 읽은 데이터를 텍스트로 변환하고, saveToFile() 메서드는 수신된 텍스트를 파일에 저장하고, printColliderData() 메서드는 데이터 파일을 인쇄합니다. 결국 우리의 readDataFromCollider() 메서드는 훨씬 간단해집니다.
public class ColliderUtil {

   public void readDataFromCollider(Path pathToData) {
       byte[] colliderData = readByteData(pathToData);
       String[] textData = convertBytesToSymbols(colliderData);
       File fileWithData = saveToFile(textData);
       printColliderData(fileWithData);
   }

   public byte[] readByteData(Path pathToData) {

       // Reads data in bytes
   }

   public String[] convertBytesToSymbols(byte[] colliderDataInBytes) {

       // Converts bytes to characters
   }

   public File saveToFile(String[] colliderData) {

       // Saves read data to a file
   }

   public void printColliderData(File fileWithColliderData) {

       // Prints data from the file
   }
}
그러나 인터페이스에 대한 강의에서 기억할 수 있듯이 사용자는 외부 인터페이스에만 액세스할 수 있습니다. 그리고 우리의 4가지 방법은 그것의 일부가 아닙니다. 그것들은 도우미 메서드입니다. 우리는 코드의 가독성을 개선하고 4개의 서로 다른 작업을 하나의 메서드에 넣지 않기 위해 만들었습니다. 사용자에게 이러한 메서드에 대한 액세스 권한을 부여할 필요가 없습니다. 사용자가 콜라이더로 작업할 때 convertBytesToSymbols() 메서드 에 액세스할 수 있는 경우 메서드에 혼란스러워하고 그것이 무엇을 위한 것인지 궁금할 것입니다. 어떤 바이트가 변환됩니까? 저들은 어디서 왔어요? 왜 텍스트로 변환합니까? 이 메서드에서 실행되는 로직은 사용자에게 노출되는 인터페이스의 일부가 아닙니다. readDataFromCollider()메서드는 인터페이스의 일부입니다. 그렇다면 이 네 가지 '내부' 메서드로 무엇을 해야 할까요? 오른쪽! 개인 한정자를 사용하여 액세스를 제한하십시오. 이렇게 하면 각 개별 메서드의 논리를 알 필요가 없는 사용자를 혼란스럽게 하지 않고 클래스 내에서 평화롭게 작업을 수행할 수 있습니다.
public class ColliderUtil {

   public void readDataFromCollider(Path pathToData) {
       byte[] colliderData = readByteData(pathToData);
       String[] textData = convertBytesToSymbols(colliderData);
       File fileWithData = saveToFile(textData);
       printColliderData(fileWithData);
   }

   private byte[] readByteData(Path pathToData) {
       // Reads data in bytes
   }

   private String[] convertBytesToSymbols(byte[] colliderDataInBytes) {
       // Converts bytes to characters
   }

   private File saveToFile(String[] colliderData) {
       // Saves read data to a file
   }

   private void printColliderData(File fileWithColliderData) {
       // Prints data from the file
   }
}

보호된 수정자

다음으로 가장 제한적인 수식어는 protected 입니다 . 보호된액세스 한정자.  개인, 보호, 기본, 공개 - 3 액세스 한정자 로 표시된 필드 및 메서드는 다음과 같이 표시됩니다.
  • 우리와 같은 패키지에 포함된 모든 클래스 내에서;
  • 우리 클래스를 상속하는 모든 클래스 내에서.
처음에는 이것이 언제 필요할지 상상하기 어렵습니다. 놀라지 마세요. private 보다 protected 의 사용 사례가 훨씬 적고 매우 구체적입니다. 일부 인텔리전스 서비스의 비밀 에이전트를 나타내는 AbstractSecretAgent 추상 클래스와 이 클래스 및 해당 하위 항목을 포함하는 top_secret 패키지가 있다고 상상해 보십시오 . FBISecretAgent , MI6SecretAgent , MossadSecretAgent 등과 같은 구체적인 클래스는 이를 상속합니다. 추상 클래스 내에서 에이전트 카운터를 구현하려고 합니다. 프로그램 어딘가에 새 에이전트가 생성되면 증가합니다. 패키지 top_secret;
public abstract class AbstractSecretAgent {

   public static int agentCount = 0;
}
하지만 우리 요원들은 비밀입니다! 이것은 그들과 다른 누구도 그들 중 얼마나 많은 것이 존재하는지 알아야 한다는 것을 의미합니다. 보호된 수정자를 agent_counter 필드 에 쉽게 추가할 수 있습니다 . 그런 다음 top_secret 패키지 에 있는 다른 비밀 에이전트 클래스 및 다른 클래스의 인스턴스가 해당 값을 얻을 수 있습니다.
public abstract class AbstractSecretAgent {

   protected static int agent_counter = 0;
}
그리고 그것은 protected 수정자가 필요한 일종의 특수 작업입니다 :)

패키지 표시 수정자

목록의 다음은 패키지 표시 수정자라고 도 하는 기본 수정자입니다 . Java는 기본적으로 모든 필드와 메서드에 키워드를 적용하므로 키워드로 표시되지 않습니다. 코드에 다음을 작성하는 경우:
int x = 10
x 변수 는 이 패키지를 볼 수 있는 액세스 권한을 갖습니다 . 그것이 무엇을 하는지 기억하기 쉽습니다. 기본적으로 기본값 은 보호 상속 입니다. :) 보호 수정자와 마찬가지로 적용이 제한됩니다. 대부분의 경우 기본 액세스는 패키지에 있는 다른 모든 클래스의 기능을 구현하지 않는 일부 유틸리티 클래스가 있는 패키지에서 사용됩니다. 예를 들어 보겠습니다. '서비스' 패키지가 있다고 상상해 보십시오. 여기에는 데이터베이스와 함께 작동하는 다양한 클래스가 포함되어 있습니다. 예를 들어 데이터베이스에서 사용자 데이터를 읽는 UserService 클래스인 CarService 가 있습니다.동일한 데이터베이스에서 자동차 데이터를 읽는 클래스와 특정 유형의 객체와 작동하고 데이터베이스에서 해당 데이터를 읽는 다른 클래스.
package services;

public class UserService {
}

package services;

public class CarService {
}
그러나 데이터베이스의 데이터가 한 형식으로 되어 있고 다른 형식으로 필요한 경우가 쉽습니다. 데이터베이스의 사용자 생년월일이 <TIMESTAMP WITH TIME ZONE>으로 저장되어 있다고 상상해 보십시오...
2014-04-04 20:32:59.390583+02
...대신 가장 간단한 객체인 java.util.Date가 필요합니다 . 이 문제를 해결하기 위해 서비스 패키지 내에서 특수 매퍼 클래스를 만들 수 있습니다 . 데이터베이스의 데이터를 친숙한 Java 개체로 변환하는 역할을 합니다. 간단한 도우미 클래스입니다. 일반적으로 모든 클래스를 public class ClassName 으로 선언 하지만 필수 사항은 아닙니다. 헬퍼 클래스를 단순히 Mapper 클래스 로 선언할 수 있습니다 . 이 경우 여전히 작업을 수행하지만 서비스 패키지 외부의 누구에게도 표시되지 않습니다 !
package services;

class Mapper {
}


package services;

public class CarService {

   Mapper mapper;
}
기본 추론은 다음과 같습니다. 패키지 외부에 있는 사람이 해당 패키지의 클래스에서만 작동하는 도우미 클래스를 확인해야 하는 이유는 무엇입니까?

공개 수정자

그리고 마지막으로 공개 수식어입니다! CodeGym에 대한 학습 첫날 public static void main(String[] args) 를 처음 실행했을 때 이 수정자를 만났습니다 . 액세스 한정자.  개인, 보호, 기본, 공개 - 4이제 인터페이스에 대한 강의를 공부했으므로 인터페이스의 목적이 분명해졌습니다 :) 결국 public 수식어는 사용자에게 무언가를 제공하기 위해 만들어졌습니다. 예를 들어 프로그램의 인터페이스입니다. 러시아어 텍스트를 영어로 번역할 수 있는 번역 프로그램을 작성했다고 가정합니다. 필요한 모든 논리를 구현하는 translate(String textInRussian) 메서드를 만들었습니다 . public 이라는 단어로 이 메서드를 표시했으며 이제 인터페이스의 일부가 되었습니다.
public class Translator {

   public String translate(String textInRussian) {

       // Translates text from Russian to English
   }
}
이 메서드를 화면의 '번역' 버튼에 바인딩하면 완료됩니다! 누구나 사용할 수 있습니다. public 한정자 로 표시된 코드 부분은 최종 사용자를 위한 것입니다. 실생활의 예를 들면 private은 TV 내부에서 일어나는 모든 과정을 위한 것이고 public 은 TV를 관리하기 위해 사용하는 리모컨의 버튼을 위한 것입니다. 게다가 사용자는 텔레비전이 어떻게 구성되어 있고 어떻게 작동하는지 알 필요가 없습니다. 리모컨은 on() , off() , nextChannel() , previousChannel() , incrementVolume() , reduceVolume() 등 의 공용 메서드 집합입니다.배운 내용을 보강하려면 Java 과정에서 비디오 강의를 시청하는 것이 좋습니다.
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다