이 글은 Do it! 자료구조와 함께 배우는 알고리즘 입문 책에 대한 풀이이다.

클래스

클래스는 임의의 데이터형을 자유롭게 조합해 만들 수 있는 자료구조이다.
지금까지는 원하는 처리를 수행하는 메서드와 main메서드를 감싸는 용도로 사용했지만, 클래스에는 이 외의 용도가 존재한다.

class XYZ{
	int x;
	long y;
	double z;
}

클래스형 변수를 사용하기 위해서는, 클래스형 변수를 만들고 실체인 클래스 인스턴스를 생성해야 한다.

XYZ a; //클래스 형 변수
a = new XYZ(); // 클래스 인스턴스

클래스는 배열 형태로도 사용할 수 있다.

연습문제

1. 실습 2-14의 시력 분포를 그래프로 출력하도록 바꿔 작성

기호 문자 *를 사용해 사람 수 만큼 반복해 출력한다.

static final int VMAX = 21;

static class PhyscData{
	String name;
	int height;
	double vision;

	PhyscData(String name, int height, double vision){
		this.name = name;
		this.height = height;
		this.vision = vision;
	}
}

static void distVision(PhyscData[] dat, int[] dist) {
	int i = 0;
	dist[i] = 0;
	for(i = 0; i < dat.length; i++) {
		if (dat[i].vision >= 0.0 && dat[i].vision <= VMAX/10.0) {
			dist[(int)(dat[i].vision * 10)]++;
		}
	}
}

public static void main(String[] args){
	Scanner scan = new Scanner(System.in);
	
	PhyscData[] x = {
			new PhyscData("박현규", 162, 0.3),
			new PhyscData("함진아", 173, 0.7),
			new PhyscData("최윤미", 175, 2.0),
			new PhyscData("홍연의", 171, 1.5),
			new PhyscData("이수진", 168, 0.4),
			new PhyscData("김영준", 174, 1.2),
			new PhyscData("박용규", 169, 0.8),
	};
	
	int[] vdist = new int[VMAX];
	
	distVision(x, vdist);
	
	System.out.println("시력 분포");
	for(int i = 0; i < VMAX; i++) {
		System.out.printf("%3.1f~:", i / 10.0);
		for(int j = 0; j < vdist[i]; j++) {
			System.out.print("*");
		}
		System.out.println();
	}
}

2. 서기 년월일을 필드로 갖는 클래스를 만들고 아래와 같은 생성자 및 메소드 정의

  • 생성자(주어진 날짜로 설정) YMD(int y, int m, int d)
  • n일 뒤의 날짜를 반환 YMD after(int n)
  • n일 앞의 날짜를 반환 YMD before(int n)
static class YMD{
	int year;
	int month;
	int day;

	static int isLeap(int year){
		...//윤년이면 1, 평년이면 0 반환
	}
	static int[][] mdays = {
		{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
		{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
	};

	YMD(int year, int month, int day){
		this.year = year;
		this.month = month;
		this.day = day;
	}

	YMD after(int n){
		if(n < 0) return(before(-n));
		YMD result = new YMD(this.year, this.month, this.day);

		result.day += n;

		while(result.day > mdays[isLeap(result.year)][result.month - 1]){
			result.day -= mdays[isLeap(result.year)][result.month - 1];
			if(++result.month > 12){
				result.year++;
				result.month = 1;
			}
		}

		return result;
	}
	
	YMD before(int n){
		if(n < 0) return(after(-n));
		YMD result = new YMD(this.year, this.month, this.day);

		result.day -= n;

		while(result.day < 1){
			if(--result.month < 1){
				result.year--;
				result.month = 12;
			}
			result.day += mdays[isLeap(result.year)][result.month - 1];
		}

		return result;
	}
}