2016-10-02 3 views
-4

어제 제가 while 루프에 관한 질문에 this을 물었더니 setter를 사용하여 내 메인 메소드에서 "correct"를 true로 설정해야한다고 들었습니다. 나는 세터와 게터에 대한 연구를했고 나는 완전히 잃어 버렸습니다. 그들이 정확히 무엇을하고이 상황에서 어떻게 사용합니까?Java 루프가 setter를 필요로합니다

편집 : Ben Wainwright에게 감사드립니다.

홈페이지 방법 :

while (lives > 0 && correct == false) { 
    startTime = System.currentTimeMillis(); 
    timeObject.time2(); 
    levelinfoObject.levelInfo(currentlevel); 
    timeObject.time1(); 
    levelinfoObject.livesInfo(lives); 
    timeObject.time1(); 
    levelinfoObject.skipsInfo(skips); 
    timeObject.time2(); 
    questionsObject.questionOne(lives, correct, choice, skips, currentlevel)   
} 

질문 질문 클래스의 하나의 방법은 : 자바, 특히 OO 내이 몇 가지 기초의 빈약 한 이해를 가지고있는 것처럼

public void questionOne(int lives, boolean correct, String choice, int skips, int currentlevel) { 

    Scanner scanner = new Scanner(System.in); 

    System.out.println(" "); 
    System.out.println("Question: If there are 6 apples in a tree and you take 4, how many do you have?"); 

    timeObject.time2(); 

    System.out.println("A: 3"); 
    System.out.println("B: 4"); 
    System.out.println("C: 2"); 
    System.out.println("D: 6"); 

    while (correct == false && lives > 0) { 

     choice = scanner.nextLine(); 

     switch(choice) { 
     case "a": 
      System.out.println("WRONG! Try again."); 
      lives = lives - 1; 
      break; 
     case "b": 
      System.out.println("CORRECT! You have the 4 you took obviously."); 
      correct = true; 
      break; 
     case "c": 
      System.out.println("WRONG! Try again."); 
      lives = lives - 1; 
      break; 
     case "d": 
      System.out.println("WRONG! Try again."); 
      lives = lives - 1; 
      break; 
     case "skip": 
      if (skips > 0) { 
       System.out.println("You have skipped level " + currentlevel + "!"); 
       skips = skips - 1; 
       correct = true; 
      } 

      else { 
       System.err.println("You do not have any skips left!"); 
      } 
      break; 
     default: 
      System.err.println("Please type an answer."); 
      break; 
     } 
    } 
+0

세터와 게터 올바른 변수에 액세스하는 questionsObject에이 게터에 액세스 할 수 있습니다, 적어도 게터를 만들 때마다 반에 설명되어 있습니다 괜찮은 튜토리얼, 그들이 무엇인지 모르는 것에 대한 당신의 변명은 무엇입니까? – Kayaman

+0

게터와 설정자는 클래스의 변수에 대한 접근 자 및 변경자입니다. 이것들은 OOP (캡슐화)의 표준입니다. –

+0

글쎄 @ 카야 만 나의 "변명"은 내가 이해하지 못한다는 것이다. 위에서 말했듯이 나는 그들에 대해 배우려고 노력했지만 이해하지 못합니다. 누군가가 뭔가 문제가있을 수 있음을 이해하는 것은 너무 미친 짓입니다. – KobiF

답변

1

좋아, OOP (101), 이미이 물건을 알고 있다면 사과를하지만, 기본 접근 방식에 다시 것 같다 수도 도움이 되길.

대부분의 객체 지향 프로그래밍과 마찬가지로 Java에서는 '클래스'로 정의 된 '객체'를 주로 다루고 있습니다. 객체는 프로그램 내에서 '메소드'(사물)와 '속성'을 가진 특정 유형의 '사물'의 인스턴스입니다.

자동차의 경우를 생각해 봅시다. 특정 차량은 빨간색 또는 노란색 일 수 있습니다. 3 ~ 5 개의 문이있을 수도 있습니다. 이것들은 속성입니다. 마찬가지로 자동차는 운전과 같은 일을 할 수 있습니다. 결정적으로, 우리는 차가 그것을 작동시키는 방법을 알 필요가 없습니다, 우리는 단지 페달을 눌러야 만합니다. 우리의 Java 객체에서도 마찬가지입니다. 우리는 내부 작업에 대해 실제로 신경 쓰지 않습니다. 우리가해야할 일은 drive() 메서드를 호출하는 것입니다. 아래에서 'car'객체이 생성되고 색상이 지정되면 'drive'메서드가 호출됩니다.

Car c = new Car(); 
car.colour = Car.Colour.RED; 
car.drive(); 

'클래스'는 자동차의 특징 (속성)과 자동차의 기능 (방법)을 설명합니다. 자동차 비유에 대해 생각해보십시오. 당신은 클래스가 차를위한 '공장 청사진'과 같다고 생각할 것입니다.

class Car { 

    public enum Colour { 
     RED, 
     GREEN, 
     ORANGE, 
     RAINBOW_COLOURED 
    } 

    public Colour colour; 
    public int speed; 

    public void drive() 
    { 
     // ... some code that implements driving 
    } 
} 

여기서 볼 수 있습니다. 외부에서 값을 변경할 수있는 여러 속성을 추가했습니다. 이것은 모두 매우 훌륭하고 훌륭합니다. 아마도 우리는 차를 더 빨리 만들고 싶으므로가는대로 바꿀 수 있습니다.

car.speed = 10000000000; 

굉장; 이제 우리는 초고속 차를 가지고 있습니다. 그러나 우리가 좀 더 복잡한 것을하고 싶다면 어떻게해야할까요?우리는 코드에서 우리 자동차의 엔진을 표현하는 것이 어떻습니까? 우리 자동차의 속도는 엔진의 힘에 달려 있습니다.

class Car { 

    ... 

    public int speed() { 

     // This is an arbitrary operation for the sake of me not 
     // having to learn how engines work. Ahem. 

     return engine.power() * 842; 
    } 

    public Engine engine; // Assume this class is defined elsewhere 

    ... 
} 

대단원! 지금은 더 차가워졌습니다. ...

위의 줄은 자동차의 속도를 설정하려고 시도했지만 위의 줄은 이제 깨졌습니다.

그리고 그 점이 우리의 주요 요점입니다. 원래 우리가 메서드를 통해 속도에 액세스 할 수 있다면이 문제는 발생하지 않습니다. 우리는 이것을 두 가지 방법으로 할 수 있습니다 :

모든 것은 전에 키워드 public을 가지고있는 것 같습니다. 즉, '이 속성/메서드는 객체 외부에서 액세스 할 수 있습니다. 먼저 모든 속성을 private 액세스로 변경 한 다음 액세스 할 수있는 한 쌍의 메소드를 제공합니다. 이러한 메소드를 'setter'및 'getters'라고합니다. 내가 당신에게 당신의 문제를 해결하기 위해 정확한 코드를 제공하지 않을거야

편집

class Car { 

    ... 

    private int speed; 

    public int getSpeed() // The getter 
    { 
     return speed; 
    } 

    public void setSpeed(int newSpeed) // The setter 
    { 
     speed = newSpeed; 
    } 

    ... 
} 

다음은 아무것도 배우지 않기 때문에, 참조하십시오. 하지만 대략해야 할 일은 다음과 같습니다.

  • Question 클래스에 비공개로 correct 속성을 만듭니다. 메인 클래스에서
  • 위에 표시된대로 다음 대신 while 루프 조건
+0

매우 자세한 설명을 해주셔서 감사합니다! 나는 한가지 더 질문이있다. 그래서 위의 getter 및 setter 메서드를 설정 한 후에 다른 클래스의 메서드를 변경하거나 사용하려면 어떻게해야합니까? @ 벤 웨인 라이트 – KobiF

+0

@ KobiF 조금 더 추가했습니다. 지금 내 게시물에 그것을 해결하기에 충분하다. : P –

0

그것은 나에게 보인다 범위는 괜찮습니다. 우리는 모두 거기에있었습니다.

저는이 잘 쓰여진 기사를 Jon Skeet까지 살펴볼 것을 권장합니다. 이것은 가치 또는 참고로 전달의 차이를 당신에게 설명합니다.

(매우) 짧은; 값을 전달할 때 자체 범위 외부에서 해당 값의 상태를 변경할 수 없습니다.

이것은 실제로 수정되지 않았기 때문에 본체가 변경된 변수 값에 응답하지 않는 이유를 설명하며 새 범위로 보내고 있습니다. 에 관해서는

캡슐화 : 액세스 수정, getter 및 setter는 ... 나는 다음 튜토리얼 추천 : Java Encapsulation

관련 문제