[Do it! 알고리즘] 02-2 클래스
이 글은 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;
}
}