Java 11(Class, Access Modifier, Field, Constructor, Method, Encapsulation, Getter, Setter)

Kang.__.Mingu·2024년 5월 1일
0

Java

목록 보기
13/108

클래스(Class)

  • 다수의 객체(Object)를 생성하기 위한 자료형 - 참조형
  • 현실에 존재하는 대상을 모델링하여 클래스라는 자료형으로 선언하고 프로그램에서 사용할 수 있도록 클래스로 객체 생성

클래스 선언 방법

[public] class 클래스명 {
필드(Field) : 표현대상의 속성(값)을 저장하기 위한 변수 - 멤버변수
생성자(Constructor) : 객체를 생성하기 위한 특별한 메소드
메소드(Method) : 표현 대상의 행위(기능)을 제공하기 위한 함수 - 멤버함수
}

  • 클래스명은 식별자로 파스칼 표기법을 사용하여 작성하는 것을 권장
    • 단어의 첫 시작은 항상 대문자를 사용하는 표기법
    • ex) HelloWorld
  • 클래스에 작성된 메소드는 필드를 사용하여 필요한 행위(기능)를 구현하도록 명령 작성
  • 클래스에 생성자를 작성하지 않으면 매개변수가 없는 기본 생성자가 자동으로 생성되어 제공

클래스를 사용하여 객체를 생성하는 방법

  • 형식) 클래스명 참조변수명 = new 클래스명();
  • new 연산자로 클래스에 작성된 기본 생성자를 호출하여 객체 생성
  • 힙(Heap)영역에 생성된 객체의 메모리 주소를 참조변수에 저장하여 참조변수에 저장된 메모리 주소를 사용해 객체 참조
  • 참조변수에 저장된 메모리 주소로 객체를 참조해 [.] 연산자로 클래스에 작성된 필드 또는 메소드 사용

클래스를 작성할 때 클래스의 요소(필드, 생성자, 메소드)에 접근 제한자를 사용해 객체의 접근

  • 접근제한자
    • public: 모든 패키지의 클래스에서 접근 가능하도록 허용하는 접근 제한자
       private: 클래스에서만 접근 가능하도록 허용하는 접근 제한자
       package
       protected
  • 클래스, 필드, 생성자, 메소드를 작성할 때 접근 허용 관련 설정을 하기 위한 키워드
  • 일반적으로 필드 작성시 사용 : 객체로 필드에 직접적인 접근을 제한해 비정상적인 값이 필드에 저장되는 것을 방지
    - 데이터 은닉화(Data Hiding): 값을 숨겨 보호하기 위한 기능
  • 일반적인으로 메소드 작성시 사용하는 접근 제한자 - 프로그램 작성에 필요한 클래스에서 객체를 사용하여 메소드를 호출할 수 있도록 허용

자동차를 모델링하여 작성된 클래스

  • 속성: 모델명, 엔진상태, 현재속도 - 필드

  • 행위: 시동 온(On), 시동 오프(Off), 속도 증가, 속도 감소, 이동 중지 - 메소드

  • 필드(Field) : 표현대상의 속성값을 저장하기 위한 변수
    - 클래스에 작성된 모든 메소드에서 필드 사용 가능

  • 생성자(Constructor) : 객체를 생성하기 위한 특별한 메소드
    - 클래스에 생성자를 작성하지 않으면 매개변수가 없는 기본 생성자(Default Constructor)가 자동으로 생성되어 제공

  • 메소드(Method) : 표현대상의 행위(기능)을 제공하기 위한 함수
    - 필드를 사용하여 메소드에 작성된 명령으로 원하는 기능 구현

객체 생성 목적 Car 클래스

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+"의 자동차가 멈췄습니다.");
	}
}

은닉화 처리된 필드 사용법

  • 은닉화 처리된 필드를 위해 필드값을 반환하는 Getter 메소드와 필드값을 변경하는 Setter 메소드 작성 - 캡슐화
  • 캡슐화(Encapsulation): 표현대상의 속성(필드)과 행위(메소드)를 하나의 자료형(클래스)으로 선언
  • 필드를 은닉화 처리하여 필드값을 보호하고 메소드를 호출하여 필드값을 변경하거나 반환 처리

Getter 메소드

  • 클래스 외부에서 필드값을 사용할 수 있도록 필드값을 반환하는 메소드
  • 형식) public 반환형 메소드명(){ return 필드명; }
  • 메소드의 이름은 [get필드명] 형식으로 작성하는 것을 권장
  • 필드의 자료형이 [boolean]인 경우 메소드의 이름을 [is필드명]형식으로 작성

Setter 메소드

  • 매개변수로 클래스 외부값을 전달받아 저장하여 필드값을 변경하는 메소드
  • 형식) public void 메소드명(자료형 매개변수){ this.필드명 = 매개변수; }
  • 메소드 이름은 [set필드명] 형식으로 작성하는 것을 권장

this

  • 메소드에서 메소드를 호출한 객체를 표현하기 위한 키워드
  • this 키워드를 사용하여 필드를 표현하고 this 키워드를 사용하지 않으면 매개변수 표현

단축키

  • 이클립스에서는 은닉화 처리된 필드에 대한 Getter 메소드와 Setter 메소드를 자동으로 작성하는 기능을 제공
  • [Alt] + [Shift] + [S] >> 팝업메뉴 - [R] >> Getter 메소드와 Setter 메소드 생성 창 - 필드 선택 후 [Generate] 클릭
  • 인텔리제이: [Alt] + [Insert]

위에 코드 이어서 작성

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("==============================================================");
	}
}
profile
최선을 다해 꾸준히 노력하는 개발자 망고입니당 :D

0개의 댓글