[public] class 클래스명 {
필드(Field) : 표현대상의 속성(값)을 저장하기 위한 변수 - 멤버변수
생성자(Constructor) : 객체를 생성하기 위한 특별한 메소드
메소드(Method) : 표현 대상의 행위(기능)을 제공하기 위한 함수 - 멤버함수
}
public: 모든 패키지의 클래스에서 접근 가능하도록 허용하는 접근 제한자
private: 클래스에서만 접근 가능하도록 허용하는 접근 제한자
package
protected
속성: 모델명, 엔진상태, 현재속도 - 필드
행위: 시동 온(On), 시동 오프(Off), 속도 증가, 속도 감소, 이동 중지 - 메소드
필드(Field) : 표현대상의 속성값을 저장하기 위한 변수
- 클래스에 작성된 모든 메소드에서 필드 사용 가능
생성자(Constructor) : 객체를 생성하기 위한 특별한 메소드
- 클래스에 생성자를 작성하지 않으면 매개변수가 없는 기본 생성자(Default Constructor)가 자동으로 생성되어 제공
메소드(Method) : 표현대상의 행위(기능)을 제공하기 위한 함수
- 필드를 사용하여 메소드에 작성된 명령으로 원하는 기능 구현
public class Car {
//필드(Field)
private String modelName;//모델명
private boolean engineStatus;//엔진상태 - false : EngineOff, true : EngineOn
private int currentSpeed;//현재속성
//생성자(Constructor)
//메소드(Method)
public void startEngine() {//시동 온(On)
engineStatus=true;
System.out.println(modelName+"의 자동차 시동을 켰습니다.");
}
public void stopEngine() {//시동 오프(Off)
if(currentSpeed != 0) {
/*
currentSpeed=0;
System.out.println(modelName+"의 자동차를 멈췄습니다.");
*/
//클래스에 작성된 메소드는 직접 호출 가능
// => 코드의 중복성을 최소화하여 프로그램의 생산성 증가 및 유지보수의 효율성 증가
speedZero();
}
engineStatus=false;
System.out.println(modelName+"의 자동차 시동을 껐습니다.");
}
public void speedUp(int speed) {//속도 증가
if(!engineStatus) {//엔진이 꺼져 있는 경우
System.out.println(modelName+"의 자동차 시동이 꺼져 있습니다.");
return;
}
if(currentSpeed + speed > 150) {
speed = 150 - currentSpeed;
}
currentSpeed+=speed;
System.out.println(modelName+"의 자동차 속도가 "+speed
+"Km/h 증가 되었습니다. 현재 속도는 "+currentSpeed+"Km/h 입니다.");
}
public void speedDown(int speed) {//속도 감소
if(!engineStatus) {//엔진이 꺼져 있는 경우
System.out.println(modelName+"의 자동차 시동이 꺼져 있습니다.");
return;
}
if(currentSpeed < speed) {
speed = currentSpeed;
}
currentSpeed-=speed;
System.out.println(modelName+"의 자동차 속도가 "+speed
+"Km/h 감소 되었습니다. 현재 속도는 "+currentSpeed+"Km/h 입니다.");
}
public void speedZero() {//이동 중지
currentSpeed=0;
System.out.println(modelName+"의 자동차가 멈췄습니다.");
}
}
위에 코드 이어서 작성
public String getModelName() {//modelName 필드값(모델명)을 반환하는 메소드
return modelName;
}
//Setter 메소드 : 매개변수로 클래스 외부값을 전달받아 저장하여 필드값을 변경하는 메소드
//형식) public void 메소드명(자료형 매개변수) { 필드명=매개변수; }
// => 메소드의 이름은 [set필드명] 형식으로 작성하는 것을 권장
public void setModelName(String modelName) {//modelName 필드값(모델명)을 변경하는 메소드
//매개변수에 전달되어 저장된 값을 검증 처리한 후 필드에 저장 가능
//this : 메소드에서 메소드를 호출한 객체를 표현하기 위한 키워드
// => this 키워드를 사용하여 필드를 표현하고 this 키워드를 사용하지 않으면 매개변수 표현
this.modelName=modelName;
}
public boolean isEngineStatus() {
return engineStatus;
}
public void setEngineStatus(boolean engineStatus) {
this.engineStatus = engineStatus;
}
public int getCurrentSpeed() {
return currentSpeed;
}
public void setCurrentSpeed(int currentSpeed) {
this.currentSpeed = currentSpeed;
}
package oop;
public class CarApp {
public static void main(String[] args) {
//Car 클래스의 생성자로 객체를 생성하여 참조변수에 객체의 메모리 주소 저장
// => 하나의 클래스로 서로 다른 속성값을 저장할 수 있는 다수의 객체 생성 가능
// => 클래스는 다수의 객체를 생성하기 위한 틀(Template)
// => 객체를 생성하면 객체 필드에는 기본값(숫자형 : 0, 논리형 : false, 참조형 : null)이
//초기값으로 자동 저장
Car carOne=new Car();//carOne : modelName = null, engineStatus = false, currentSpeed = 0
Car carTwo=new Car();//carTwo : modelName = null, engineStatus = false, currentSpeed = 0
System.out.println("carOne = "+carOne);
System.out.println("carTwo = "+carTwo);
//참조변수에 저장된 객체의 메모리 주소를 다른 참조변수에 저장
// => 두 참조변수에는 동일한 객체의 메모리 주소를 저장하고 있으므로 같은 객체 참조
Car carThree=carOne;
System.out.println("carThree = "+carThree);
System.out.println("==============================================================");
//참조변수.필드명 : 참조변수에 저장된 메모리 주소로 객체를 참조하여 객체의 필드 사용
//문제점)객체를 사용하여 필드에 직접적인 접근을 허용하면 필드에 비정상적인 값 저장 가능
//해결법)클래스를 만들때 필드가 숨겨지도록 은닉화 처리하여 작성
// => 객체로 은닉화 처리된 필드를 사용할 경우 에러 발생
//carOne.modelName="싼타페";//객체의 필드값 변경
//객체로 Setter 메소드를 호출하여 매개변수에 전달된 값으로 필드값 변경
carOne.setModelName("싼타페");
//객체의 필드값 출력
//직관적으로 표현(필드가 private가 된 순간부터 사용 불가능)
//System.out.println("첫번째 자동차의 모델명 = "+carOne.modelName);
//System.out.println("첫번째 자동차의 엔진상태 = "+carOne.engineStatus);
//System.out.println("첫번째 자동차의 현재속도 = "+carOne.currentSpeed);
//(필드 접근제한자가 private 일 때)
//객체로 Getter 메소드를 호출하여 필드값을 반환받아 출력 처리
//객체의 필드값 출력
System.out.println("첫번째 자동차의 모델명 = "+carOne.getModelName());
System.out.println("첫번째 자동차의 엔진상태 = "+carOne.isEngineStatus());
System.out.println("첫번째 자동차의 현재속도 = "+carOne.getCurrentSpeed());
System.out.println("==============================================================");
/*
carTwo.modelName="쏘나타";
carTwo.engineStatus=true;
carTwo.currentSpeed=80;
System.out.println("두번째 자동차의 모델명 = "+carTwo.modelName);
System.out.println("두번째 자동차의 엔진상태 = "+carTwo.engineStatus);
System.out.println("두번째 자동차의 현재속도 = "+carTwo.currentSpeed);
*/
carTwo.setModelName("쏘나타");
carTwo.setEngineStatus(true);
carTwo.setCurrentSpeed(80);
System.out.println("두번째 자동차의 모델명 = "+carTwo.getModelName());
System.out.println("두번째 자동차의 엔진상태 = "+carTwo.isEngineStatus());
System.out.println("두번째 자동차의 현재속도 = "+carTwo.getCurrentSpeed());
System.out.println("==============================================================");
//참조변수.메소드명(값, 값, ...) : 참조변수에 저장된 메모리 주소로 객체를 참조하여
//클래스의 메소드 호출 - 기능 구현
carTwo.startEngine();
carTwo.speedUp(50);
carTwo.speedUp(30);
carTwo.speedDown(40);
carTwo.speedZero();
carTwo.stopEngine();
System.out.println("==============================================================");
}
}