0328 Class 활용(예제)

Fifty·2025년 3월 28일

2. JAVA

목록 보기
15/33

[예제] 다음과 같이 출력하는 클래스를 만드시오.

주문번호: 202503280001
주문자아이디: abc123
주문날짜: 2025년 3월 28일
주문자이름: 홍길순
주문상품번호: PD0345-12
배송주소: 서울시 영등포구 여의도동 20번지

  1. 주문번호가 int로 선언하기에는 너무 길다. long 혹은 String으로 가능.
  2. 주문번호와 주문날짜에 중복되는 데이터를 year, month, day로 하는게 의미 있을지?

Order.java

package ex0328;

public class Order {
	
	String no;
	String id;
	String date;
	String name;
	String pdNumber;
	String addr;
	
	public Order(String no, String id, String date, String name, String pdNumber, String addr){
		this.no = no;
		this.id = id;
		this.date = date;
		this.name = name;
		this.pdNumber = pdNumber;
		this.addr = addr;
	}
	
	public String toString(){
		return "주문번호: "+no+"\n주문자아이디: "+id+"\n주문날짜: "+date
				+"\n주문자이름: "+name+"\n주문상품번호: "+pdNumber+"\n배송주소: "+ addr;
	}
}

Test0328.java

package ex0328;

public class Test0328 {

	public static void main(String[] args) {
		
		Order o = new Order("202503280001","abc123","2025년 3월 28일","홍길순","PD0345-12","서울시 영등포구 여의도동 20번지");
		System.out.println(o.toString());

	}

}


  1. 정보는 3개로 나눌 수 있다.
    사람에 대한 정보(아이디, 이름, 주소), 상품에 대한 정보(상품번호), 주문에 대한 정보(주문번호, 날짜)

→ 사람에 대한 정보 Member 클래스 생성(id, name, addr) 후 Member클래스를 이용한 Order클래스로 수정하기

Member도 결국 자료형이다.(사용자 정의 자료형)
Member.java

package vo;

public class Member {
	private String id;
	private String name;
	private String addr;
	
	public Member(String id, String name, String addr){
		this.id = id;
		this.name = name;
		this.addr = addr;
	}
	
	public String getId() {
		return id;
	}
	public String getName() {
		return name;
	}
	public String getAddr() {
		return addr;
	}
	public void setId(String id) {
		this.id = id;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}

	@Override
	public String toString() {
		return "Member [id=" + id + ", name=" + name + ", addr=" + addr + "]";
	}
}

Order.java

package ex0328;

public class Order {
	
	private String no;
	private String date;
	private String pdNumber;
	private Member m;

	public Order(String no, String date, String pdNumber, Member m) {
		this.no = no;
		this.date = date;
		this.pdNumber = pdNumber;
		this.m = m;
	}
	
	public String getNo() {
		return no;
	}
	public String getDate() {
		return date;
	}
	public String getPdNumber() {
		return pdNumber;
	}
	public void setNo(String no) {
		this.no = no;
	}
	public void setDate(String date) {
		this.date = date;
	}
	public void setPdNumber(String pdNumber) {
		this.pdNumber = pdNumber;
	}
	public Member getM() {
		return m;
	}
	public void setM(Member m) {
		this.m = m;
	}

	@Override
	public String toString(){
		return "주문번호: "+no+"\n주문자아이디: "+m.getId()+"\n주문날짜: "+date
				+"\n주문자이름: "+m.getName()+"\n주문상품번호: "+pdNumber+"\n배송주소: "+m.getAddr();
	}
}

Test0328.java

package ex0328;

public class Test0328 {

	public static void main(String[] args) {
		
		Member m = new Member("abc123","홍길순","서울시 영등포구 여의도동 20번지");

		Order o2 = new Order("202503280001","2025년 3월 28일","PD0345-12", m);
		System.out.println(o2);
	}
}

member 인스턴스가 있어야 order가 가능하다.


[예제] 사람의 생애

사람의 출생신고: 이름, 주민번호 등 정보를 관리

취학연령이 되어 초등학교에 입학하게 되면, 개인의 신분(학생)이 생긴다.

  • 철수(8세)가 학교에 입학해서 학생이 됨
  • 학생이었던 철수는 입대하면 군인이 됨
  • 결혼 후 아이를 낳으면 철수는 아빠가 됨
    여러 역할을 수행하는 사람이 됨

사람으로 태어남.(개인정보)
학생이 되면 그 사람의 정보를 그대로 가져다 쓰고, 추가 필요정보와 함께 관리

  1. Personal 개인정보 클래스
    멤버변수: 이름, 생년, 성별
    생년이 20살 이상이면 student가 되는 게 가능한지 확인

  2. Student 학생 클래스
    멤버변수: Personal, 학번, 전공
    그런데 학번은 겹치면 안되는 변수고 자동으로 부여해주는게 나을 듯

Personal.java

package vo;

public class Personal {

	private String name;
	private int birth_year;
	private char gender;
	
	public Personal(String name, int birth_year, char gender){
		this.name=name;
		this.birth_year=birth_year;
		this.gender=gender;
	}
	
	// Getter and Setter
	public String getName() {
		return name;
	}

	public int getBirth_year() {
		return birth_year;
	}

	public char getGender() {
		return gender;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setBirth_year(int birth_year) {
		this.birth_year = birth_year;
	}

	public void setGender(char gender) {
		this.gender = gender;
	}


	
	@Override
	public String toString() {
		return "Personal [name=" + name + ", birth_year=" + birth_year + ", gender=" + gender + "]";
	}
	
	
}

Student.java

package vo;

public class Student {

	private static int cnt;
	private int no;
	private String major;
	private Personal p;
	
	public Student(Personal p, String major) {
		if(chkStudent(p)) {
			this.p=p;
			this.major=major;
			this.no=++cnt;
			System.out.println(p.getName()+" 학생 등록 완료");
			System.out.println(toString());
		}
		else
			System.out.println(p.getName()+" 학생 등록 실패: 나이 미충족");
	}
	public static int getCnt() {
		return cnt;
	}
	public int getNo() {
		return no;
	}
	public String getMajor() {
		return major;
	}
	public Personal getP() {
		return p;
	}
	
	public void setNo(int no) {
		this.no = no;
	}
	public void setMajor(String major) {
		this.major = major;
	}
	public void setP(Personal p) {
		this.p = p;
	}
	@Override
	public String toString() {
		return "학번: " + no + "\n전공: " + major + "\n이름: " + p.getName();
	}
	
	public boolean chkStudent(Personal p) {
		if(2025-p.getBirth_year()>=20) {
			System.out.println("입학가능");
			return true;
		}	
		else {
			System.out.println("입학불가");
			return false;
		}
	}	
}

Test0328.java

package ex0328;

import vo.Personal;
import vo.Student;

public class Test0328 {

	public static void main(String[] args) {
		
		Personal p1 = new Personal("홍길순",2002,'F');
		//System.out.println(p1);
		
		Personal p2 = new Personal("홍길동",2020,'M');
		
		Student s1 = new Student(p1,"컴퓨터");
		System.out.println("-------------");
		Student s2 = new Student(p2, "경영");
//		System.out.println(s2.toString());
	}
}

결과
s2.toString()은 오류가 남!


[예제]
로봇이 있어요
로봇은 이름이 있고 기분 상태가 1~10까지 범위 값을 가질 수 있어요.
로봇 기분의 기본값은 5입니다.
로봇에게 칭찬을 하면 기분 상태가 1만큼 올라가고,
로봇에게 꾸중을 하면 기분 상태가 2만큼 내려가요.

로봇 기분이 2이하이면 '울적해요'라고 메시지가 나옵니다.
로봇 기분이 7이상이면 '하늘을 나는 기분이에요'라고 메시지가 나옵니다.

///
Robot 클래스
멤버변수: 이름(name), 기분(mood)

칭찬(good) 기분+1
꾸중(bad) 기분+2

Robot.java

package vo;

public class Robot {
	private String name;
	private int mood;
	
	public Robot(String name) {
		this.name=name;
		this.mood=5;	// 기분의 기본값은 5
	}
	
	public String getName() {
		return name;
	}
	public int getMood() {
		return mood;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setMood(int mood) {
		this.mood = mood;
	}

	public String toString() {
		return "이름: "+name+", 기분: "+mood;
	}
	
	// 칭찬하기
	public void good() {
		mood+=1;
	//	System.out.println("칭찬+1 "+getMood());
		moodChk();
	}
	
	// 꾸중하기
	public void bad() {
		mood-=2;
	//	System.out.println("꾸중-2 "+getMood());
		moodChk();
		
	}
	
	private void moodChk() {
		if(getMood()>=7 && getMood()<=10)
			System.out.println("하늘을 나는 기분이에요. "+ "기분: "+getMood());
		else if(getMood()>10) {
			setMood(10);	// 기분이 10보다 커지지 않게 설정
			System.out.println("하늘을 나는 기분이에요. "+ "기분: "+getMood());
		}
		else if(getMood()<=2 && getMood()>0)
			System.out.println("울적해요. "+ "기분: "+getMood());
		else if(getMood()<=0) {
			setMood(1);		// 기분이 1보다 작아지지 않게 설정
			System.out.println("울적해요. " + "기분: "+getMood());
		}
		else System.out.println("기분: "+getMood());
	}
}

RobotTest.java

package ex0328;

import vo.Robot;

public class RobotTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Robot r = new Robot("홍길순");
		System.out.println(r);
		
		r.good();	//6
		r.good();	//7
		r.good();	//8
		r.good();	//9
		r.good();	//10
		r.good();	//11 → 기분 상태는 1~10까지이므로 10으로 만든다.
		
		r.bad();	//8 
		r.bad();	//6
		r.bad();	//4
		r.bad();	//2
		r.bad();	//0 → 기분 상태는 1~10까지이므로 1로 만든다.
		
	}
}

결과

추가적으로 기본생성자를 통해 생성하는 방법도 있다.

Robot(String name){
	this();
    this.name=name;
}

[예제] 게임

유닛
필드: 이름, 에너지(초기값10)
메소드: 특정 유닛을 공격 → 그 유닛의 에너지감소(감소메소드도 필요)

Unit.java

package vo;

public class Unit {
	
	private String name;
	private int energy;
	
	public Unit(String name){
		this.name=name;
		energy=10;		// 초기값 10
	}

	public String getName() {
		return name;
	}

	public int getEnergy() {
		return energy;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setEnergy(int energy) {
		this.energy = energy;
	}

	@Override
	public String toString() {
		return "Unit [name=" + name + ", energy=" + energy + "]";
	}

	public void attack(Unit u) {
		u.setEnergy(reduceEnergy(u));
	}
	public int reduceEnergy(Unit u) {
		return u.getEnergy()-1;
	}
	
}

UnitTest.java

package ex0328;

import vo.Unit;

public class UnitTest {

	public static void main(String[] args) {

		Unit u1 = new Unit("곰");
		System.out.println(u1);
		
		
		Unit u2 = new Unit("사자");
		System.out.println(u2);
		
		System.out.println("------생성 끝------");
		
		u1.attack(u2);
		System.out.println(u1);
		System.out.println(u2);
		u2.attack(u1);
		u2.attack(u1);
		System.out.println(u1);
		System.out.println(u2);
		
	}
}

결과

추가해보기
공격받으면 누가 공격받았는지, 현재 에너지와 함께 출력
공격받으면 에너지가 감소하는데 0보다 작아질 수 없게 설정
에너지가 0이면 끝났다고 출력
에너지가 0인 유닛이 공격하려고 하면 에너지가 없어 공격할 수 없다고 출력
자기자신은 공격할 수 없게 하자
→ 이름이 중복이 안되거나, 아이디가 있음 좋겠지만 일단은 이름만으로 자기자신을 구별
→ 이걸 하려면 이름이나 아이디를 별도로 관리해야하는지?????????

Unit.java

package vo;

public class Unit {
	
	private String name;
	private int energy;
	
	public Unit(String name){
		this.name=name;
		energy=10;		// 초기값 10
	}

	public String getName() {
		return name;
	}

	public int getEnergy() {
		return energy;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setEnergy(int energy) {
		if(energy>0) {
			this.energy = energy;
			System.out.println(getName()+"가 공격 받았습니다. 에너지: "+this.energy);
		}
		else if(energy==0){
			this.energy = energy;
			System.out.println(getName()+"는 끝났습니다. 에너지: "+this.energy);
		}
	}

	@Override
	public String toString() {
		return "Unit [name=" + name + ", energy=" + energy + "]";
	}

	public void attack(Unit u) {
		if(getName()==u.getName())
			System.out.println("자기 자신은 공격할 수 없습니다.");
		else {
			if(getEnergy()>0)
				u.setEnergy(reduceEnergy(u));
			else
				System.out.println("에너지가 없어 공격할 수 없습니다.");
		}
	}
	public int reduceEnergy(Unit u) {
		if(u.getEnergy()>0)
			return u.getEnergy()-1;
		else
			return 0;
	}	
}

UnitTest.java

package ex0328;

import vo.Unit;

public class UnitTest {

	public static void main(String[] args) {

		Unit u1 = new Unit("호랑이");
		System.out.println(u1);
		
		
		Unit u2 = new Unit("사자");
		System.out.println(u2);
		
		System.out.println("------생성 끝------");
		
		u1.attack(u2);	//호랑이가 사자 공격함 사자에너지9
		u2.attack(u1);	//사자가 호랑이 공격함 호랑이에너지9
		u2.attack(u1);	//사자가 호랑이 공격함 호랑이에너지8
		u2.attack(u1);	//사자가 호랑이 공격함 호랑이에너지7
		u1.attack(u2);	//호랑이가 사자 공격함 사자에너지8
		u1.attack(u2);	//호랑이가 사자 공격함 사자에너지7
		u1.attack(u2);	//호랑이가 사자 공격함 사자에너지6
		u1.attack(u2);	//호랑이가 사자 공격함 사자에너지5
		u1.attack(u2);	//호랑이가 사자 공격함 사자에너지4
		u1.attack(u2);	//호랑이가 사자 공격함 사자에너지3
		u1.attack(u2);	//호랑이가 사자 공격함 사자에너지2
		u1.attack(u2);	//호랑이가 사자 공격함 사자에너지1
		u1.attack(u2);	//호랑이가 사자 공격함 사자에너지0
		
		u2.attack(u1);	//끝난 사자가 공격하면? 못하게 해야함
		
		u1.attack(u2);	//호랑이가 사자 공격함 사자에너지0
		
		System.out.println(u1);
		System.out.println(u2);
		
		System.out.println("----뉴페이스 등장----");
		Unit u3 = new Unit("매");
		System.out.println(u3);
		u3.attack(u1);	// 살아있는 호랑이 공격하기
		u3.attack(u2);	// 이미 끝난 사자 공격하기
		u3.attack(u3);	// 자기자신 공격은 못하게 하자
	}
}

결과


[예제]

학생클래스
멤버변수: 이름, 학년, 가진돈
초기에 학생이 가진 돈은 만원입니다.
학생은 버스를 탑니다.(학생은 버스를 타다라는 함수가 있습니다.)
학생은 버스를 탈 때 요금(1000원)을 냅니다.
학생정보(이름, 학년, 가진 돈)를 콘솔에 출력하는 showInfo 함수가 있습니다.

버스클래스
멤버변수: 버스번호, 승객수, 받은요금총액
버스는 만들어질 때 번호를 부여받습니다.
버스는 승객을 태우는 메소드(take)가 있습니다.
버스가 승객을 태울 때는 요금을 받습니다.
버스가 승객을 태우면 기존 승객에서 1 증가합니다.
버스정보(버스번호, 승객 수, 받은 요금 총액)를 콘솔에 출력하는 showInfo함수가 있습니다.

Student2.java

package vo;

public class Student2 {

	private String name;
	private int grade;
	private int money;
	
	// 생성자
	public Student2(String name, int grade){
		this.name=name;
		this.grade=grade;
		this.money=10000;
	}
	
	// Getter & Setter
	public String getName() {
		return name;
	}
	public int getGrade() {
		return grade;
	}
	public int getMoney() {
		return money;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setGrade(int grade) {
		this.grade = grade;
	}
	public void setMoney(int money) {
		this.money = money;
	}

	
	@Override
	public String toString() {
		return "[학생정보]\n이름: "+getName()+"\n학년: "+getGrade()+"학년 \n용돈: "+getMoney();
	}
		
}

Bus.java

package vo;

public class Bus {
	
	private static int buses;	// 버스번호는 고유번호
	private int no;
	private int passenger;
	private int money;

	public Bus() {
		buses++;
		no=buses;
	}
	
	public int getNo() {
		return no;
	}
	public int getPassenger() {
		return passenger;
	}
	public int getMoney() {
		return money;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public void setPassenger(int passenger) {
		this.passenger = passenger;
	}
	public void setMoney(int money) {
		this.money = money;
	}
	
	@Override
	public String toString() {
		return "[버스정보]\n번호: " + getNo() + "\n승객 수: " + getPassenger() + "\n요금 총액: " + getMoney();
	}
	
	public void take(Student2 s) {
		passenger++;
		money+=1000;
		s.setMoney(s.getMoney()-1000);
    }
}

StudentBusTest.java

package ex0328;

import vo.Bus;
import vo.Student2;

public class StudentBusTest {

	public static void main(String[] args) {
		Student2 s1 = new Student2("홍",1);
		System.out.println(s1);
		Student2 s2 = new Student2("길",2);
		System.out.println(s2);
		Student2 s3 = new Student2("길",3);
		System.out.println(s3);

		Bus b1 = new Bus();
		System.out.println(b1);
		
		b1.take(s1);	// bus에 학생1 태우면
		System.out.println(b1);
		System.out.println(s1);

	}
}

추가
학생이 요금이 없을 때, 태우지 못한다.
버스에 3명까지 태울 수 있는 것으로..
학생이 이미 탔다면 탑승할 수 없다는 boolean takeIn 추가, 초기값false, 탑승하면 true

Student2.java

package vo;

public class Student2 {

	private String name;
	private int grade;
	private int money;
	private boolean takeIn;	//false가 기본값, 탑승했으면 true
	
	// 생성자
	public Student2(String name, int grade){
		this.name=name;
		this.grade=grade;
		this.money=10000;
	}
	
	// Getter & Setter
	public String getName() {
		return name;
	}
	public int getGrade() {
		return grade;
	}
	public int getMoney() {
		return money;
	}
	public boolean isTakeIn() {
		return takeIn;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setGrade(int grade) {
		this.grade = grade;
	}
	public void setMoney(int money) {
		this.money = money;
	}

	public void setTakeIn(boolean takeIn) {
		this.takeIn = takeIn;
	}
	@Override
	public String toString() {
		return "[학생] 이름: "+getName()+" / 학년: "+getGrade()+"학년 / 용돈: "+getMoney()+" / 탑승여부: "+isTakeIn();
	}
		
}

Bus.java

package vo;

public class Bus {
	
	private static int buses;	// 버스번호는 고유번호
	private int no;
	private int passenger;
	private int money;

	public Bus() {
		buses++;
		no=buses;
	}
	
	public int getNo() {
		return no;
	}
	public int getPassenger() {
		return passenger;
	}
	public int getMoney() {
		return money;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public void setPassenger(int passenger) {
		this.passenger = passenger;
	}
	
	public void setMoney(int money) {
		this.money = money;
	}
	
	@Override
	public String toString() {
		return "[버스] 번호: " + getNo() + " / 승객 수: " + getPassenger() + " / 요금 총액: " + getMoney();
	}
	
	public void take(Student2 s) {
		if(s.getMoney()<1000) {			// 학생이 돈이 없으면
			System.out.println(s.getName()+" 학생은 돈이 없어 탈 수 없습니다.");
		}
		else if(s.isTakeIn()) {
			System.out.println(s.getName()+" 학생은 이미 버스에 타있습니다.");
		}
		else{							// 학생이 돈이 있지만
			if(getPassenger()+1>3) {		// 인원이 3명 넘으면 탈 수 없어
				System.out.println("!인원초과! "+s.getName()+" 학생은 탑승할 수 없습니다.");
			}else{						// 학생이 돈이 있고 3명이 안되면 탑승
				setPassenger(getPassenger()+1);
				//System.out.println(getNo()+"번 현재 탑승인원: " + getPassenger());
				setMoney(getMoney()+1000);
				s.setMoney(s.getMoney()-1000);
				s.setTakeIn(true);
			}
		}
	}
	
	
}

StudentBusTest.java

package ex0328;

import vo.Bus;
import vo.Student2;

public class StudentBusTest {

	public static void main(String[] args) {
		
		Student2 s1 = new Student2("홍",1);
//		System.out.println(s1);
		Student2 s2 = new Student2("길",2);
//		System.out.println(s2);
		Student2 s3 = new Student2("동",3);
//		System.out.println(s3);
		Student2 s4 = new Student2("바",1);
		Student2 s5 = new Student2("보",2);
		
		
		Bus b1 = new Bus();
//		System.out.println(b1);
		b1.take(s1);	// bus1에 학생1 태움
		Bus b2 = new Bus();
		b2.take(s3);	// bus2에 학생3 태움
		b2.take(s2);	// bus2에 학생2 태움
		b2.take(s4);	// bus2에 학생4 태움
		
		b2.take(s5);	// bus2에 학생5 태움 3명 초과 안돼야함
		
		System.out.println("\n-----버스정보출력----");
		System.out.println(b1);
		System.out.println(b2);
		System.out.println("-----학생정보출력----");
		System.out.println(s1);
		System.out.println(s2);
		System.out.println(s3);
		System.out.println(s4);
		System.out.println(s5);
		System.out.println("");
		b1.take(s2);	// 이미 타있는 학생 test
	
	}
}

결과

학생의 버스 하차 out 메소드 추가

Bus.java

	public void out(Student2 s) {
		s.setTakeIn(false);
		setPassenger(getPassenger()-1);
	}

StudentBusTest.java

		b1.take(s2);	// 이미 타있는 학생 test
		b2.out(s2);		// s2 하차
		b1.take(s2); 	// s1가 환승


[예제] 작성 중
선생님이 성적처리
5명의 학생정보(이름, 학년, money, 번호, 국어점수, 영어점수, 수학점수)를 입력한다.

성적처리 메뉴에서는 학생들의 성적표가 만들어진다.
철수 국, 영, 수 점수의 총점,
평균이 60점 미만이면 유급, 이상이면 패스
학생클래스에 총점과 평균점수, 낙제여부가 학생 인스턴스에 기록되어야 함
순위정보도 저장되어 있어야 한다.

main
5명의 학생정보를 입력하세요.
성적처리하면 정보가 셋팅
순위 조회: 순위별 학생이름 출력
성적 조회: 개별 성적 조회

0개의 댓글