→ 객체 대신 인스턴스(Instance)로 표현 가능
→ 현실 세계의 존재하는 사물을 클래스라는 자료형으로 표현하여 객체로 구현
형식) [public] class 클래스명 {
필드(Field) : 대상의 속성을 표현하여 속성값을 저장하기 위해 선언된 변수(멤버변수)
...
생성자(Constructor) : 객체 생성을 목적으로 선언된 메소드
...
메소드(Method) : 대상의 행위를 명령의 모임으로 포현하기 위해 선언된 함수(멤버함수)
...
}
→ 필드에 필요한 값을 저장하여 메소드로 필드값을 사용해 원하는 기능을 제공
형식) 클래스명 참조변수=new 클래스명();
→ new 연산자로 클래스의 생성자를 호출하여 객체를 생성하고 참조변수를 객체의 주소를 저장
→ 참조변수에 저장된 객체의 필드 또는 메소드를 . 연산자로 접근하여프로그램 작성
◎클래스를 선언할 때 필드 또는 메소드에 접근지정자를 선언하여 접근 가능 유무 설정
◎접근지정자(Access Modifier) : private, package(default), protected, public
→ 클래스, 필드, 생성자, 메소드를 선언할 때 접근 유무를 지정하기 위한 키워드
◎private : 클래스 내부에서만 접근 가능하며 클래스 외부에서는 절대 불가능하도록 설정하는 키워드
→ 일반적으로 필드 선언시 사용 : 객체로 필드에 직접적인 접근하는 것을 차단하기 위해 사용
→ 은닉화(Data Hiding)
◎public : 모든 패키지의 클래스에서 접근 가능하도록 설정하는 키워드
→ 일반적으로 메소드 선언시 사용 : 프로그램 작성에 필요한 모든 클래스에서 접근할 수 있도록 사용
package oop;
//자동차를 객체 모델링하여 작성된 클래스
//=> 속성 : 모델명, 엔진상태, 현재속도 - 필드
//=> 행위 : 시동 온(On). 시동 오프(Off). 속도 증가. 속도 감소, 이동 중지 - 메소드
public class Car {
//필드(Field) : 클래스에 선언된 모든 메소드에서 필드에 접근하여 사용 가능
private String modelName;//모델명
private boolean engineStatus;//엔진상태 - false : Off, true : On
private int currentSpeed;//현재속도
//생성자(Constructor) : 생성자 선언을 생략하면 매개변수가 없는
기본 생성자(Default Constructor)가 존재하는 것으로 처리
//메소드 : 필드를 이용하여 명령들로 필요한 기능을 제공
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+"의 자동차가 멈췄습니다.");
}
//은닉화 처리된 필드를 위해 필드값을 반환하는 Getter 메소드와 필드값을
변경하는 Setter 메소드 선언
//=> 캡슐화(Encapsulation) : 표현대상을 속성(필드)와 행위(메소드)를 묶어
클래스로 표현
//=> 필드를 은닉화 처리하여 보호되어 사용되도록 설정하는 작업
//Getter 메소드 : 클래스 외부에서 필드값을 사용할 수 있도록 반환하는 메소드
//=> 은닉화 선언된 필드의 자료형이 Boolean인 경우 get 대신 is를 사용하여 메소드 작성
//형식) public 반환형 get필드명() { return 필드명; }
public String getModelName() {
return modelName;
}
//Setter 메소드 : 매개변수로 값을 전달받아 필드값을 변경하는 메소드
//형식)public void set필드명(자료형 매개변수) {필드명=매개변수;}
//=> 매개변수에 전달되어 저장된 값에 대한 검증 가능
public void setModelName(String modelName) {
//this : 메소드 내부에서 클래스의 객체를 표현하는 키워드
//=> this 키워드를 사용하여 필드 표현
this.modelName=modelName;
}
//이클립스는 은닉화 선언된 필드에 Getter와 Setter 메소드를 생성하는 기능 제공
//[Alt]+[Shift]+[S] >> 팝업메뉴 >> [R]
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;
//Car 클래스를 사용하여 작성된 프로그램
public class CarApp {
public static void main(String[] args) {
//Car 클래스로 객체를 생성하여 참조변수에 저장
//=> 하나의 클래스로 서로 다른 객체를 여러개 생성 가능
//=> 객체를 생성하면 객체의 필드에는
기본값(숫자형:0, 논리형:false, 참조형:null)이 자동 저장
Car carOne=new Car();
Car carTwo=new Car();
Car carThree=carTwo;//참조변수에 다른 참조변수에 저장된 객체의 주소를 전달받아 저장
System.out.println("carOne = "+carOne);
System.out.println("carTwo = "+carTwo);
System.out.println("carThree = "+carThree);
System.out.println("===================================================");
//참조변수.필드 >> 참조변수에 저장된 객체의 필드 표현
//은닉화 선언된 필드에 접글할 경우 에러 발생
//carOne.modelName="티코";//필드값 변경
//필드값을 직접 변경하지 못하므로 필드값을 변경하는 Setter 메소드 호출하여
필드값 변경
//carOne.modelName="티코";
carOne.setModelName("티코");
//carOne.engineStatus=false;
carOne.setEngineStatus(false);
//carOne.currentSpeed=0;
carOne.setCurrentSpeed(100);
//System.out.println("첫번째 자동차의 모델명 = "+carOne.modelName);
//필드값을 직접 사용하지 못하므로 필드값을 반환하는 Getter 메소드 호출하여
필드값반환받아 출력
System.out.println("첫번째 자동차의 모델명 = "+carOne.getModelName());
//System.out.println("첫번째 자동차의 엔진상태 = "+carOne.engineStatus);
System.out.println("첫번째 자동차의 엔진상태 = "+carOne.isEngineStatus());
//System.out.println("첫번째 자동차의 현재속도 = "+carOne.currentSpeed);
System.out.println("첫번째 자동차의 현재속도 = "+carOne.getCurrentSpeed());
System.out.println("===================================================");
//carTwo.modelName="싼타페";
carTwo.setModelName("싼타페");
//System.out.println("두번째 자동차의 모델명 = "+carTwo.modelName);
System.out.println("두번째 자동차의 모델명 = "+carTwo.getModelName());
//System.out.println("두번째 자동차의 엔진상태 = "+carTwo.engineStatus);
System.out.println("두번째 자동차의 엔진상태 = "+carTwo.isEngineStatus());
//System.out.println("두번째 자동차의 현재속도 = "+carTwo.currentSpeed);
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("===================================================");
}
}