IT/JAVA

[Day 10] 객체와 생성자

_KH_ 2025. 1. 13. 23:52
class Student {

■ 클래스 선언 시 public을 사용하지 않는 이유 : 클래스는 파일 이름과 동일해야 하기 때문에, main함수가 있는 클래스가 클래스 이름으로 인식되도록 해야한다. 그러나, 다른 클래스를 선언하면서 public을 붙여버리면 그 클래스를 인식하고 오류가 나기 때문에 public을 빼줘야 한다.

class Student {

	String name; 
	int score; // 멤버변수 == 필드, 속성, attribute, property

	}

멤버변수는 다양한 이름으로 불린다.

 

오늘은 비슷한 생성자를 간략하게 만들고자 하는 "코드 간략화"에 대해 배웠다.

생성자에서의 코드 간략화는, 가장 인자가 많은 생성자만 구현하고, 나머지 생성자는 인자가 가장 많은 생성자를 재사용하는 것이다.

==> this(); 사용.

■ this(); : "자기자신 객체"를 가르킨다. 자신과 똑같은 이름을 가진 생성자를 데려오는 것.

 

비슷한 생성자를 간략하게 만들고자 ("코드 간략화")
    1 )인자가 가장 많은 생성자만 남기고 지운다. (재사용)
    2 ) this();를 통해 생성자 호출함
    3 ) 인자가 가장 많은 생성자에서 원하는 것만  가져다 써도 되고, 다 가져온 후 원하는 값을 기본으로 (0 등) 초기화

 

■ static 변수 (클래스 변수, 객체변수)

- static : "객체와 무관하게"

 

- 모든 원형은 3.14라는 원주율을 공유한다. 이와 같이 모두가 공유하는 값을 "공유자원"이라고 한다.

(= 객체에 따른(객체마다 갖는) 속성 x 클래스라서 가지는 속성 o)

- 클래스 변수만 클래스 내에서 초기화하도록 하자. (멤버변수 금지)

static int PI = 3.14;

- 클래스 변수들은 클래스 소속이라서 클래스.(클래스 변수명)을 사용한다. 

ex ) Circle.PI; 처럼 사용

 

문제풀이

[1]
책들을 생성할 수 있게 해주세요.
책의 속성은 제목,작가,가격으로 구성되어있습니다.
책을 생성할 때에는 제목을 무조건 등록해야합니다.

-> 1. 제목은 필수. 반드시 사용자에게 받아오며, 기본 값이 없다. 어떤 생성자를 만들더라도 반드시 인자에 책 제목이 들어가 있어야 한다.
작가를 모를때에는 "작자미상"으로 등록합니다.

-> 2. 작가를 등록하는 경우, 안하는 경우가 있는데 안하는 경우에는 작자미상으로 저장
가격을 모를때에는 10000~20000원 사이로 등록해주세요. /

-> 3. 가격이 있는 게 있고, 없는 게 있다. 있을 땐 그 가격으로, 없을 땐 입력받아 설정 ===> 생성자가 4개 있어야 정답
단, 100원단위이하로는 설정하지않습니다.
ex) 만천원,만이천원 가능 / 만천오백원 불가능
책의 가격을 랜덤으로 재설정하거나,
사용자가 원하는가격으로 재설정할수있게 메서드를 구현해주세요. 

-> 4. 랜덤일수도 있고, 사용자에게 받을 수도 있으니 메서드 오버로딩 필수!


책 정보를 출력해주세요. // 속성 3개, 생성자 4개, 메서드 3개 있어야 정답!!

class Book1 {
	// 속성, 생성자, 메서드 순으로 작성하기!!!!!!!!
	// 인자가 가장 많은 생성자를 아래쪽에 배치. 가장 인자가 많은 생성자를 가져다 쓰는 것이 효율적.	
	String title;
	String writer;
	int price;

	Book1(String title){
		this(title,"작자미상",(new Random().nextInt(11)+10)*1000);
	}
	Book1(String title,String writer){
		this(title,writer,(new Random().nextInt(11)+10)*1000);
	}
	Book1(String title,int price){
		this(title,"작자미상",price);
	}
	Book1(String title,String writer,int price){
		this.title=title;
		this.writer=writer;
		this.price=price;
		
		this.checkPrice(price); // this를 표시!
	}
	void changePrice() {
		this.price=(new Random().nextInt(11)+10)*1000;
		System.out.println("가격 랜덤으로 재설정 완료!");
		
		this.checkPrice(price);
	}
	void changePrice(int price) {
		this.price=price;
		System.out.println("가격 사용자가 원하는 값으로 재설정 완료!");
		this.checkPrice(price);
	}
	void printInfo() {
		System.out.println("제목 : "+this.title);
		System.out.println("작가 : "+this.writer);
		System.out.println("가격 : "+this.price+"원");
	}
	
	int checkPrice(int price) {
		if(price<10000) {
			price = 10000;
		}
		return price;
	}
}

 

 

[2] 제품 클래스를 선언해주세요.
제품 필드는 번호,이름,가격,재고로 총 4개입니다.
번호는 1001부터 순차적으로 부여됩니다.
이름,가격은 사용자가 등록합니다.
재고는 미등록시 0개로 등록합니다.
제품의 상태를 출력할수있게 해주세요.
단, 제품의 재고가 0개면 '품절'이라고 출력해주세요.
재고를 사용자가 원하는만큼 추가할수있게 메서드를 구현해주세요.

package class05;

class Product {
	int num;
	String name;
	int price;
	int count;
	static int productNum=1001;
	Product(String name,int price){
		this(name,price,0);
	}
	Product(String name,int price,int count){
		this.num=Product.productNum++;
		this.name=name;
		this.price=price;
		this.count=count;
	}
	void printInfo() {
		System.out.println("이름 : "+this.name);
		System.out.println("번호 : "+this.num);
		System.out.println("클래스변수 : "+Product.productNum);
		if(this.count<=0) {
			System.out.println("품절");
		}
		else {
			System.out.println("재고 : "+this.count);
		}		
	}
	void addCount(int count) {
		this.count+=count;
		System.out.println("재고 추가 완료!");
	}
}

public class Test02 {
	public static void main(String[] args) {
		Product p1=new Product("티모모자",12000);
		Product p2=new Product("페이커티셔츠",20000);
		p1.printInfo();
		p2.printInfo();
		
	}
}
클래스변수는 항상 같은 값을 공유하므로!!! 모든 제품의 값이 같아져버린다. num, productNum 나누기
 
 

[3] 자동차 자료형을 제작해주세요.
자동차는 차 주인의 이름,현재속도,최대제한속도를 필드로 갖습니다.
차 주인정보는 미등록시 자동차를 할당할 수 없습니다.
현재속도는 최초 등록시 0으로 세팅됩니다.
최대제한속도는 미등록시 120으로 자동설정됩니다.
속도를 원하는만큼 높여주는 speedUp() 메서드와
10만큼 속도를 낮춰주는 speedDown() 메서드를 구현해주세요.
자동차는 최대제한속도를 초과하여 달릴수없습니다.
자동차의 현재속도를 출력할수있게 메서드를 구현해주세요.

package class05;

class Car {
	String name;
	int speed;
	int max;
	Car(String name){
		this(name,120);
	}
	Car(String name,int max){
		this.name=name;
		this.speed=0;
		this.max=max;
	}
	void speedUp(int speed) {
		this.speed+=speed;
		if(this.speed>this.max) {
			this.speed=this.max;
			System.out.println("과속주의!");
		}
		System.out.println("속도++");
	}
	void speedDown() {
		this.speed-=10;
		if(this.speed<0) {
			this.speed=0;
			System.out.println("멈춤...");
		}
		System.out.println("속도--");
	}
	void printInfo() {
		System.out.println(this.name+"님의 현재속도 : "+this.speed);
	}
}

public class Test03 {
	
	public static void main(String[] args) {

	}
}

'IT > JAVA' 카테고리의 다른 글

[DAY 11] 캡슐화, 상속, 오버라이딩, Object 클래스  (0) 2025.01.14
Java Section 07 : 클래스  (0) 2025.01.14
[Day 9] JAVA 객체  (0) 2025.01.10
[JAVA] 배열, 함수, 삽입정렬  (0) 2025.01.08
Java Section 06 : 배열  (0) 2025.01.07