백엔드/Java

Java 클래스(Class) (2)

짱뚱짱 2024. 9. 30. 10:57

📢 생성자

👉🏻 클래스는 객체 지향 프로그래밍에서 객체를 생성하기 위한 템플릿.

👉🏻 자바에서 객체를 생성할 때는 생성자를 사용한다.

👉🏻 생성자는 객체의 초기화를 담당하며, 클래스명과 동일한 이름을 가진다.

👉🏻 기본 생성자: 클래스에 생성자가 없으면 기본 생성자가 자동 생성. 하나 이상의 생성자가 정의되면 기본 생성자는 제공되지 않는다.

👉🏻 생성자 오버로딩: 동일한 클래스 내에서 매개변수의 개수나 타입이 다른 여러 개의 생성자를 정의할 수 있다.

 

📢 실습(1)

자동차의 속성과 동작을 정의하는 Car Class 생성

// Car 클래스 생성
// 멤버변수 : name, color, year, power, speed => private 선언 (getter/ setter 생성)
// 소나타(블랙/2024) => 출력 메서드
// power : 시동 상태 나타내는 메서드 (true / false)
// speed : 속도 up / down 메서드
class Car{
	private String name; //필수
	private String color; //선택
	private String year; //선택
	private boolean power;
	private int speed;
	
	// Class의 위치 순서는 보통 이렇다 : 멤버변수 => 생성자 => 메서드 => getter/setter
	// 생성자 위치
	// 객체를 생성할 때 초기값 지정
	// 생성자의 접근제한자는 반드시 public 이어야 함.
	// 생성자명은 클래스명과 반드시 같아야 함.
	// 생성자는 메서드와 달리 return 타입이 없음.
	public Car() {} // 기본 생성자. 필수!
	public Car(String name) {
		this.name = name;
	}
	public Car(String name, String color) {
		this.name = name;
		this.color = color;
	}
	//불가능 : 오버로딩 조건에 충족이 안됨.
//	public Car(String name, String year) {
//		
//	}
	//생성자 호출 : 생성자 내에 다른 생성자의 값과 완전히 동일한 값이 있을 경우 사용 가능
	public Car(String name, String color, String year) {
		this(name, color); // 생성자 호출 : 반드시 첫줄에서 호출
//		this.name = name;
//		this.color = color;
//		this.year = year;
		this.year = year;
	}
	
	//생성자 생성 => 우클릭 Source => Generate Constructor usign Fields...
	public Car(String name, String color, String year, boolean power, int speed) {
		this(name, color,year); // 생성자 호출 : 반드시 첫줄에서 호출
		this.power = power;
		this.speed = speed;
	}
	
	public void printInfo() {
		System.out.println(name+"("+color + "/"+year+")");
	}
	
	public void print() {
		System.out.println("------------------");
		System.out.println("power:"+ ((power)? "ON" : "OFF"));
		if(!power) {
			System.out.println("시동을 켜주세요.");
		}else {			
			if(speed >= 200) {
				System.out.println("최고 속도입니다. 속도를 줄이세요.");
			} 
			if (speed <= 0) {
				System.out.println("정지된 상태입니다.");
			}
			System.out.println("speed:"+speed);	
		}
		
	}
	
	// 꺼져 있으면 => 켜짐
	// 켜져 있으면 => 꺼짐
	// speed 가 있으면 시동이 꺼지면 안됨.
	public void power() {
		if(speed == 0) {			
			this.power = !this.power;
		}else {
			System.out.println("속도를 줄이세요. 시동을 끌 수 없습니다.");
		}
	}
	
	//speedUp : power 켜져야 스피드가 올라갈수 있음.  200까지만 가능
	public void speedUp() {
		if(power) {
			if(speed <200) {
				speed += 10;			
			}
		}
	}
	//speedDown : power 켜져야 스피드가 내려갈수 있음.  0까지만 가능
	public void speedDown() {
		if(power) {
			if(speed >0) {
				speed -= 10;			
			}
		}
	}
	
	//getter/setter
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getColor() {
		return color;
	}
	public void setColor(String color) {
		this.color = color;
	}
	public String getYear() {
		return year;
	}
	public void setYear(String year) {
		this.year = year;
	}
	public boolean isPower() {
		return power;
	}
	public void setPower(boolean power) {
		this.power = power;
	}
	public int getSpeed() {
		return speed;
	}
	public void setSpeed(int speed) {
		this.speed = speed;
	}
	
}
public static void main(String[] args) {
    Car c = new Car();
    c.setName("SONATA");
    c.setColor("red");
    c.setYear("2024");
    c.printInfo();
    c.power();
    c.speedUp();
    c.print();

    Car c1 = new Car("BMW");
    c1.printInfo();
    Car c2 = new Car("BMW", "gray");
    c2.printInfo();
    Car c3 = new Car("BMW", "gray", "2024");
    c3.printInfo();
}

 

 

결과

SONATA(red/2024)
------------------
power:ON
speed:70
속도를 줄이세요. 시동을 끌 수 없습니다.
------------------
power:ON
정지된 상태입니다.
speed:0
------------------
power:OFF
시동을 켜주세요.
--------------
BMW(null/null)
BMW(gray/null)
BMW(gray/2024)

 

📢 실습(2)

TV를 모델링하는 Tv 클래스를 구현. 

👉🏻 final 키워드를 사용하여 변경할 수 없는 값(상수)을 지정. 변수명을 대문자로 작성하는 것이 일반적인 관례. => get 메서드를 통해 값을 읽을 수 있지만, set 메서드를 통해 값을 변경할 수는 없다.

class Tv {
    private final String BRAND = "LG";
    private boolean power;
    private int ch;
    private int vol;

    public Tv() {
        this.vol = 3;
    }

    public void print() {
        System.out.println(BRAND + " TV / CH: " + ch + " / VOL: " + vol);
    }

    public void power() {
        power = !power;
        if (power) {
            System.out.println("전원 ON");
            print();
        } else {
            System.out.println("전원 OFF");
        }
    }

    public void chUp() {
        if (power) {
            ch = (ch + 1) % 21;
        }
        System.out.println("채널: " + ch);
    }

    public void chDown() {
        if (power) {
            ch = (ch - 1 + 21) % 21;
        }
        System.out.println("채널: " + ch);
    }

    public void volUp() {
        if (power) {
            if (vol < 10) {
                vol++;
            }
        }
        System.out.println("볼륨: " + vol);
    }

    public void volDown() {
        if (power) {
            if (vol > 0) {
                vol--;
            }
            if (vol == 0) {
                System.out.println("음소거");
            }
        }
        System.out.println("볼륨: " + vol);
    }

    public String getBrand() {
        return BRAND;
    }
}
public class Class03 {
    public static void main(String[] args) {
        Tv t = new Tv();
        t.power();
        t.chUp();
        t.chUp();
        t.chUp();
        t.chDown();
        t.volUp();
        t.volDown();
        t.volDown();
    }
}

 

 

결과

전원 ON
LG TV / CH: 0 / VOL: 3
채널: 1
채널: 2
채널: 3
채널: 2
볼륨: 4
볼륨: 3

클래스: 객체를 정의하는 구조체

생성자: 객체 초기화

오버로딩: 다양한 초기화 방식 제공

 

'백엔드 > Java' 카테고리의 다른 글

Java로 학생 정보 관리 시스템 구현(1)  (2) 2024.10.02
Java로 카드 게임 만들기  (4) 2024.10.01
Java 클래스(Class) (1)  (0) 2024.09.29
Java로 로또 번호 생성기 만들기(1)  (0) 2024.09.29
Java로 계산기 만들기  (1) 2024.09.28