• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

메소드 강의 질문

24.03.14 15:33 작성 조회수 75

0

 BlackBox b1 = new BlackBox(); 
 b1.modelName = "까망이"; 
  b1.autoReport();// 지원안됨 
 BlackBox.canAutoReport = true; 
b1.autoReport();// 지원 됨

여기에서 canAutoReport 는 한 class의 변수이니까 메인메소드로 부를 때 BlackBox.canAutoReport로 부른거라면,

modelName은 클래스의 변수가 아니라서 클래스의 변수인 BlackBox로 선언한 b1 으로 부른건가요?

 

그리고 object 와 class의 차이점을 모르겠어요 ... 알려주시면 감사하겠습니다 ...!:)

답변 1

답변을 작성해보세요.

0

안녕하세요?

클래스(Class)와 객체(Object)는 정말 정말 어렵고 헷갈리는 내용입니다. 이렇게 한 번 설명을 드려볼게요.

대중교통의 대표적인 종류로는 수많은 사람을 실어 나르는 버스가 있습니다. 도심에는 특히 굉장히 많은 노선의 버스가 운행되고 있지요. 버스는 운전 기사분께서 마음대로 운행을 할 수는 없습니다. 정해진 시간, 정해진 노선, 정해진 금액 등에 따라 운행을 하게 됩니다. 필요에 따라 기존 노선이 바뀔 수도 있고 새로운 노선이 생길 수도 있습니다.

그런데 사실 버스마다 조금씩 분위기가 다르기도 합니다. 어떤 기사님은 매우 친절히 인사를 하시기도 하지만 어떤 기사님은 가벼운 목례만 하거나 승객분들과 눈을 마주치지 않는 경우도 있습니다. 또 운전을 매우 부드럽게 하시는 분도 계시는가 하면 다소 난폭하게 하시는 분도 계십니다. 정해진 시간, 정해진 노선으로 운행을 하긴 하지만 약간씩의 차이가 있을 수 있지요.

지금까지 버스 요금은 성인 기준 1,000 원이었다고 가정하겠습니다. 그런데 내일부터 갑자기 1,200 원으로 버스 요금을 인상하겠다고 발표합니다. 그러면 버스를 이용하는 모든 승객은 내일부터 동일한 버스를 인상된 가격인 1,200 원을 지불하고 타야 합니다.

이것이 바로 클래스(Class) 객체(Object) 의 차이입니다.

클래스는 버스의 운행 노선, 주기, 금액 등을 설정하는 주체 개념입니다. 버스에 몇 명까지 태울 수 있고 입석을 허용할지, 운행 노선은 어떻게 되고 출퇴근 시간에는 자주 운행하도록 하여 시민들의 불편을 최소화할 수 있습니다.

그리고 이렇게 정해진 규칙에 따라 운행하는 각 버스들이 객체가 됩니다. 각 버스들마다 버스 번호, 노선, 운행 시간 정보 등이 설정됩니다. 이는 버스마다 조금씩 다를 수 있겠지요. 이 정보들이 클래스에 정의된 인스턴스 변수라고 생각하시면 됩니다.

내일부터 인상되는 가격, 모든 버스가 공통적으로 따르며 한 번에 일괄적으로 변경사항이 적용되는 것이 바로 클래스 변수입니다. 버스 단말기처럼 시스템에서 요금을 인상시키면 내일부터는 카드를 태깅할 때 모든 버스에서 공통적으로 1,200 원을 지불하게 됩니다. 각 버스 기사님이 승객들에게 일일이 "요금 인상" 이라는 안내를 할 필요가 없는 것이죠.

명절을 맞아 버스 요금을 한시적으로 50% 할인할 수도 있습니다. 그러면 클래스 변수인 가격 정보만 50% 할인된 600 원으로 설정하면 끝입니다. 모든 버스를 일일이 확인하여 할인 적용을 할 필요가 없지요.

정리하면, 어떤 정보를 가지고 어떻게 운행을 할지 등이 정의된 것이 클래스이며, 이렇게 정의된 내용에 따라 운행을 하는 각 버스들은 클래스로부터 만들어진 객체입니다. 이때 각 버스별로 내용이 정의되는 곳이 인스턴스 변수이며, 모든 버스에 공통적으로 적용되는 가격은 클래스 변수입니다.

우리가 실제로 코드로 볼 때는 클래스라는 것 하나만 있지만 그 클래스 안에 각각의 객체가 가질 서로 다른 값인 인스턴스 변수를 정의하며, 또한 모든 객체들에 공통적으로 적용되는 클래스 변수를 정의할 수 있습니다.

이때 인스턴스 변수는 객체의 이름으로 접근하며, 클래스 변수는 클래스의 이름으로 접근한다는 차이가 있습니다.


질문 주신 내용으로 돌아와서,

  1. canAutoReport 는 BlackBox 라는 클래스에 정의된 클래스 변수이므로 클래스명인 BlackBox 로 접근합니다.

  2. modelName 은 BlackBox 라는 클래스에 정의된 인스턴스 변수이며 이는 각각의 객체가 서로 다른 값을 가질 수 있으므로 객체의 이름인 b1 으로 접근할 수 있습니다.

설명이 매우 길었는데 차분히 한 번 읽어보시고 클래스와 객체의 차이점, 그리고 인스턴스 변수와 클래스 변수의 차이점을 이해해주시면 좋겠습니다. 😊

감사합니다.