생성자의 목적

1. 힙 메모리 영역에 클래스 필드를 생성해주는 목적

2. 초기화 역할

 

메서드의 모양 :  name ( )

생성자의 모양 : class name ( )

 

위처럼 생성자도 메서드와 생김새가 비슷하네?

생성자도 메서드다

그렇다면 왜 생성자는 메서드라고 하지 않을까?

 


 

생성자는 메서드의 기능과 똑같지만 return이 없기 때문에 메서드라고 부르지 않는다.

 


클래스를 만드는 순간 굳이 생성자를 일부를 만들어주지 않아도 기본 생성자라는 것이 생기는데, 보이진 않지만 내부적으로 올라간 것이다.

따라서 선언없이 사용이 가능하다.

 

기본 생성자

1. 클래스 선언 시 자동으로 생성된다.

2. 사용자가 직접 선언하지 않아도 사용 가능하다.

3. 사용자가 직접 생성자를 선언하는 순간 그것을 기본 생성자로 여겨서 따로 기본 생성자가 생기진 않는다.

 


< 변수 >

매개변수 : { } 안, 닫는 중괄호를 만날 때 끝난다

매개 변수와 지역변수는 stack에 저장이된다.

전역 변수는 data 영역에 저장된다.

 


오버 로딩 Overloading

매개변수의 개수나 타입이 다를 때, 같은 이름으로 선언할 수 있다.

         →  메서드의 이름은 같으나 매개변수의 갯수 혹은 타입이 다르면 선언 가능

load : 나갔다가 다시 불러올 때

over : 넘치게

overload : 넘치게 불러온다 (같은 이름이라) 

 

《 오버 로딩은 메서드의 첫 번째 기능 ≫

 


Car와 Road를 만들어보자

 

package studyalone;

public class Car {
	//Car 클래스는 브랜드, 색, 가격, 비번을 갖고 있다
	String brand;
	String color;
	int price;
	String pw="1122";
	
	//생성자 , 비번 새로
	public Car(String b, String c ,int p,String pw) {
		this.brand=b; this.color=c; this.price=p;this.pw=pw;
	}
	
	//생성자 , 초기 비번 그대로
	public Car(String b, String c ,int p) {
		this.brand=b; this.color=c; this.price=p;
	}
	
	//외부에서 비밀번호 입력받기
	//입력받은 비밀번호와 자동차의 비밀번호를 비교하기
	//비밀번호가 일치한다면 시동 켜주기
	//이미 시동이 켜져있다면 "시동이 이미 켜져있습니다"출력
	//이미 시동이 꺼져있다면 "시동이 이미 꺼져있습니다"출력
	//비번 3회 오류 시 경찰 출동
	
	boolean isOn=false;
	int policeCnt;
	
	//시동키는 메서드
	boolean engineStart(String pw ){
		boolean policeCheck=false;
		
		if(this.pw.equals(pw)) {
			if(!isOn) {
				System.out.println(this.brand+" 시동 킴");
				isOn=true;
				policeCnt=0;
			}else {
				System.out.println(this.brand+" 시동이 이미 켜져있음");
			}
		}else {
			policeCnt++;
			if(policeCnt==3) {
				System.out.println("경찰 출동");
				policeCheck=true;
			}else {
				System.out.println("비밀번호 오류");
			}
		}
		return policeCheck;
	}
	
	
	//시동끄는 메서드
	void engineStop(){
		if(!isOn) {
			System.out.println(this.brand+" 시동 끔");
		}else {
			System.out.println("시동이 이미 꺼져있습니다.");
		}
	}
	
	
	//자동차 정보 출력 메서드
	void show() {
		System.out.println(brand+", "+color+", "+price+"만원");
		//지역변수가 같은 이름이 아니라서 굳이 this.brand등등으로 하지 않은 것
	}

	
}
package studyalone;

import java.util.Scanner;

public class Road {
	public static void main(String[] args) {
		Car myCar=new Car("벤틀리","blue",1500,"981122");
		
		String menu= "1. 시동 켜기\n2. 시동 끄기";
		Scanner sc =new Scanner(System.in);
		int choice=0;
		String tryPw="";
		
		myCar.show();
		
		//무한반복 
		//시동을 한번이라도 킨 후 시동을 끄면  break
		while(true) {
			System.out.println(menu);
			
			choice=sc.nextInt();
			
			if(choice==1) {
				System.out.println("비밀번호를 입력하세요");
				tryPw=sc.next();
				
				if(myCar.engineStart(tryPw))
					break;
			}else if(choice==2) {
				//시동을 한번이라도 켜기 전엔 isOn이 false니까 break안함
				//한번이라도 시동을 겼다면 isOn은 true니까 break함
				if(myCar.isOn) {
					myCar.engineStop();
				}else {
					myCar.engineStop();
				}
			}
		}
		
	}
}

+ Recent posts