CodeGym/Java Blog/무작위의/게터 및 세터
John Squirrels
레벨 41
San Francisco

게터 및 세터

무작위의 그룹에 게시되었습니다
회원
안녕하세요! 이전 강의에서 메소드와 필드를 사용하여 자신만의 완전한 클래스를 선언하는 방법을 이미 배웠습니다. 오늘 수업에서는 Java의 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!");
   }
}
하지만 그렇습니다. 직장에 앉아 고양이를 나타내기 위해 이 Cat 클래스를 작성한다고 상상해 보십시오. 그리고 나서 집에 갑니다. 당신이 없는 동안 다른 프로그래머가 출근합니다. 그는 당신이 작성한 Cat 클래스를 사용하기 시작하는 자신의 Main 클래스를 만듭니다 .
public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       cat.name = "";
       cat.age = -1000;
       cat.weight = 0;
   }
}
그가 왜 그런 일을 했고 어떻게 그런 일이 일어났는지는 중요하지 않습니다(그 사람이 피곤하거나 충분한 수면을 취하지 않았을 수도 있습니다). 다른 문제가 있습니다. 현재 Cat 클래스는 필드에 미친 값을 할당할 수 있습니다. 결과적으로 프로그램에는 유효하지 않은 상태의 개체(예: -1000년 된 고양이)가 있습니다. 그렇다면 클래스를 선언할 때 어떤 오류를 범했을까요? 우리는 우리 학급의 데이터를 공개했습니다. 이름, 나이 및 체중 필드는 공개됩니다. 프로그램의 어디에서나 액세스할 수 있습니다. 간단히 Cat 개체를 생성하면 모든 프로그래머가 점( . ) 연산자를 통해 해당 데이터에 직접 액세스할 수 있습니다.
Cat cat = new Cat();
cat.name = "";
여기서는 이름 필드에 직접 액세스하고 해당 값을 설정합니다. 부적절한 외부 간섭으로부터 어떻게든 데이터를 보호해야 합니다. 그렇게 하려면 무엇이 필요합니까? 먼저 모든 인스턴스 변수(필드)는 private 한정자로 표시되어야 합니다. Private은 Java에서 가장 엄격한 액세스 한정자입니다. 이렇게 하면 Cat 클래스의 필드는 클래스 외부에서 액세스할 수 없습니다.
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 class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       cat.name = "";//error! The Cat class's name field is private!
   }
}
컴파일러는 이것을 보고 즉시 오류를 생성합니다. 이제 필드는 일종의 보호됩니다. 하지만 우리가 액세스를 너무 엄격하게 차단한 것으로 나타났습니다. 필요한 경우에도 프로그램에서 기존 고양이의 체중을 가져올 수 없습니다. 이것은 또한 옵션이 아닙니다. 그대로, 우리 클래스는 본질적으로 사용할 수 없습니다. 이상적으로는 일종의 제한된 액세스를 허용해야 합니다.
  • 다른 프로그래머는 Cat 개체를 만들 수 있어야 합니다.
  • 기존 개체에서 데이터를 읽을 수 있어야 합니다(예: 기존 고양이의 이름 또는 나이 가져오기).
  • 필드 값을 할당하는 것도 가능해야 합니다. 단, 이때 유효한 값만 허용되어야 합니다. 객체는 유효하지 않은 값(예: 연령 = -1000 등)으로부터 보호되어야 합니다.
그것은 요구 사항의 적절한 목록입니다! 실제로는 getter 및 setter라는 특수 메서드를 사용하여 이 모든 작업을 쉽게 수행할 수 있습니다.
게터 및 세터 - 2
이러한 이름은 "get"(즉, "필드 값을 가져오는 방법")과 "set"(즉, "필드 값을 설정하는 방법")에서 나옵니다. Cat 클래스에서 어떻게 보이는지 살펴보겠습니다 .
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) {
       this.name = name;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       this.age = age;
   }

   public int getWeight() {
       return weight;
   }

   public void setWeight(int weight) {
       this.weight = weight;
   }
}
보시다시피 매우 간단해 보입니다 :) 그들의 이름은 종종 "get"/"set"과 관련 필드의 이름으로 구성됩니다. 예를 들어 getWeight() 메서드는 호출된 객체의 가중치 필드 값을 반환합니다. 프로그램에서 다음과 같이 표시됩니다.
public class Main {

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5, 4);
       String smudgeName = smudge.getName();
       int smudgeAge = smudge.getAge();
       int smudgeWeight = smudge.getWeight();

       System.out.println("Cat's name: " + smudgeName);
       System.out.println("Cat's age: " + smudgeAge);
       System.out.println("Cat's weight: " + smudgeWeight);
   }
}
콘솔 출력:
Cat's name: Smudge
Cat's age: 5
Cat's weight: 4
이제 다른 클래스( Main )는 Cat 필드에 액세스할 수 있지만 getter를 통해서만 액세스할 수 있습니다. getter에는 공개 액세스 수정자가 있습니다. 즉, 프로그램의 어디에서나 사용할 수 있습니다. 그러나 값을 할당하는 것은 어떻습니까? 이것이 세터 메소드의 용도입니다.
public void setName(String name) {
   this.name = name;
}
보시다시피 그것들도 간단합니다. Cat 개체에서 setName() 메서드를 호출 하고 문자열을 인수로 전달하면 문자열이 개체의 이름 필드에 할당됩니다.
public class Main {

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5, 4);

       System.out.println("Cat's original name: " + smudge.getName());
       smudge.setName("Mr. Smudge");
       System.out.println("Cat's new name: " + smudge.getName());
   }
}
여기서 우리는 게터와 세터를 모두 사용하고 있습니다. 먼저 getter를 사용하여 고양이의 원래 이름을 가져와 표시합니다. 그런 다음 세터를 사용하여 새 이름("Mr. Smudge")을 할당합니다. 그런 다음 getter를 다시 한 번 사용하여 이름을 가져옵니다(정말로 변경되었는지 확인하기 위해). 콘솔 출력:
Cat's original name: Smudge
Cat's new name: Mr. Smudge
차이점은 무엇입니까? setter가 있더라도 필드에 유효하지 않은 값을 할당할 수 있습니다.
public class Main {

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5, 4);
       smudge.setAge(-1000);

       System.out.println("Smudge's age: " + smudge.getAge());
   }
}
콘솔 출력:
Smudge's age: -1000 years
차이점은 setter는 본격적인 메서드라는 것입니다. 그리고 필드와 달리 메서드를 사용하면 허용되지 않는 값을 방지하는 데 필요한 확인 논리를 작성할 수 있습니다. 예를 들어 음수가 연령으로 지정되는 것을 쉽게 방지할 수 있습니다.
public void setAge(int age) {
   if (age >= 0) {
       this.age = age;
   } else {
       System.out.println("Error! Age can't be negative!");
   }
}
이제 코드가 올바르게 작동합니다!
public class Main {

   public static void main(String[] args) {

       Cat smudge = new Cat("Smudge", 5, 4);
       smudge.setAge(-1000);

       System.out.println("Smudge's age: " + smudge.getAge());
   }
}
콘솔 출력:
Error! Age can't be negative!
Smudge's age: 5 years
setter 내에서 유효하지 않은 데이터를 설정하려는 시도로부터 보호하는 제한을 만들었습니다. Smudge의 나이는 변경되지 않았습니다. 항상 게터와 세터를 만들어야 합니다. 필드가 취할 수 있는 값에 대한 제한이 없더라도 이러한 도우미 메서드는 해를 끼치지 않습니다. 다음과 같은 상황을 상상해 보십시오. 귀하와 귀하의 동료가 함께 프로그램을 작성하고 있습니다. 공용 필드가 있는 Cat 클래스를 만듭니다 . 모든 프로그래머가 원하는 대로 사용하고 있습니다. 그러던 어느 날 당신은 "젠장, 조만간 누군가 실수로 가중치에 음수를 할당할 수도 있습니다! 우리는 setter를 만들고 모든 필드를 비공개로 만들어야 합니다!"라고 깨닫습니다. 그렇게 하면 동료가 작성한 모든 코드를 즉시 깨뜨릴 수 있습니다. 결국, 그들은'직접 고양이 필드.
cat.name = "Behemoth";
그리고 이제 필드는 비공개이며 컴파일러는 많은 오류를 분출합니다!
cat.name = "Behemoth";//error! The Cat class's name field is private!
이 경우 처음부터 필드를 숨기고 getter 및 setter를 만드는 것이 좋습니다. 모든 동료가 사용했을 것입니다. 그리고 어떻게든 필드 값을 제한해야 한다는 것을 뒤늦게 깨달았다면 setter 내부에 수표를 작성했을 수도 있습니다. 그리고 누구의 코드도 깨지지 않을 것입니다. 물론 필드에 대한 액세스를 "읽기 전용"으로만 지정하려면 해당 필드에 대한 getter만 만들 수 있습니다. 메서드만 외부에서 사용할 수 있어야 합니다(예: 클래스 외부). 데이터는 숨겨야 합니다. 우리는 휴대폰과 비교할 수 있습니다. 일반적인 동봉된 휴대 전화 대신에 모든 종류의 돌출된 전선, 회로 등이 있는 열린 케이스가 있는 전화기를 받았다고 상상해 보십시오. 그러나 전화기는 작동합니다. 정말 열심히 회로를 찌르면 전화를 걸 수 있습니다. 하지만 당신은'
게터 및 세터 - 3
대신 제조업체에서 인터페이스를 제공합니다. 사용자는 올바른 숫자를 입력하고 녹색 통화 버튼을 누르면 통화가 시작됩니다. 그녀는 회로와 전선 내부에서 무슨 일이 일어나는지, 그들이 어떻게 일을 하는지는 신경 쓰지 않습니다. 이 예에서 회사는 전화기의 "내부"(데이터)에 대한 액세스를 제한하고 인터페이스(메서드)만 노출합니다. 그 결과, 사용자는 자신이 원하는 것(전화 걸기 기능)을 얻을 수 있으며 내부에 있는 어떤 것도 손상시키지 않을 것입니다. 배운 내용을 보강하려면 Java 과정에서 비디오 강의를 시청하는 것이 좋습니다.
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다