1일1끄적

자료구조&기본 알고리즘 입문(자바)- 클래스 본문

개발/Java

자료구조&기본 알고리즘 입문(자바)- 클래스

inkor 2022. 1. 21. 15:10

○클래스
클래스는 임의의 데이터형을 자유로의 조합하여 만들 수 있는 자료 구조

어늘 그룹의 신제검사 데이터를 처리하는 것을 예로 들면, 데이터가 이름/키/시력의 3개라면 
각각의 항목에 대해 벼열을 구성한다. name[0]의 "홍길동" 키는 height[0]에 저장되고 시력은 
vision[0]에 저장 될 것. 그러나 각 개인의 데이터가 같은 인덱스에 저장되는 관계가 프로그램에 
직접 나타나지는 않는다. 실제 업무에서는 보통 개인별 카드에 시력과 키 등의 데이터를 적어 놓고, 
이 카드를 사람 수 만큼 준비한다. 프로그램에서도 이와 같이 구현하는 것이 좋다. 

○클래스 선언
여러 형의 요소를 조합하여 만든 자료구조가 클래스(class)이며, 요소의 형이 같을 수도 있따. 
간단한 구조의 클래스를 선언하는 예는 다음과 같다. 

// 클래스 XYZ
Class XYZ {
	int x; // x는 int형 필드
   	long y; // y는 long형 필드
    double z; // z는 double형 필드
}

 XYZ는 클래스 이름이다. 클래스 XYZ는 3애의 데이터 요소를 가지고 있으며, 이 데이터 요소를 필드(filed)라고 한다. 
int형 필드 x, long형 필드 y, double형 필드 z가 세트를 이룬 것이 클래스 XYZ다. 
클래스형 변수를 사용할 떄는 먼저 클래스형 변수(실체를 참조하는 변수)를 만들고, 실체인 클래스 인스턴스를 
생성해야 한다. 
클래스 XYZ형의 클래스형 변수를 선언한 후 인스턴스를 생성하는 형식은 다음과 같다 

XYZ a;  / /XYZ형의 클래스형 변수 a 선언
a = new XYZ(); // XYZ형의 클래스 인스턴스(실체)를 생성

// 위의 두 가지를 한 번에 선언하면 아래와 같음
XYZ a = new XYZ(); // 변수와 인스턴스 생성을 한꺼번에 선언

결국 클래스형 변수 a는 실체인 인스턴스를 참조하게 된다. 

○클래스 활용 프로그램
신체검사 데이터의 알람표를 나타내고 평균 키와 시력의 분포를 나타냄

import java.util.Scanner;
// 신체검사 데이터용 클래스 배열에서 평균 키와 시력의 분포를 구함

class PhysicalExamination {

	static final int VMAX = 21;		// 시력 분포(0.0에서 0.1 단위로 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 double aveHeight(PhyscData[] dat) {
		double sum = 0;

		for (int i = 0; i < dat.length; i++)
			sum += dat[i].height;

		return sum / dat.length;
	}

	// 시력 분포를 구함
	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 stdIn = 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];					// 시력 분포

		System.out.println("■ 신체검사 리스트 ■");
		System.out.println(" 이름         키       시력");
		System.out.println("---------------");
		for (int i = 0; i < x.length; i++)
			System.out.printf("%-8s%3d%5.1f\n",
							x[i].name, x[i].height, x[i].vision);

		System.out.printf("\n평균 키:%5.1fcm\n", aveHeight(x));

		distVision(x, vdist);							// 시력 분포를 구함

		System.out.println("\n시력 분포");
		for (int i = 0; i < VMAX; i++)
			System.out.printf("%3.1f~:%2d명\n", i / 10.0, vdist[i]);
	}
}

// *console 출력
//■ 신체검사 리스트 ■
// 이름         키       시력
//---------------
//박현규     162  0.3
//함진아     173  0.7
//최윤미     175  2.0
//홍연의     171  1.5
//이수진     168  0.4
//김영준     174  1.2
//박용규     169  0.8

//평균 키:170.3cm

//시력 분포
//0.0~: 0명
//0.1~: 0명
//0.2~: 0명
//0.3~: 1명
//0.4~: 1명
//0.5~: 0명
//0.6~: 0명
//0.7~: 1명
//0.8~: 1명
//0.9~: 0명
//1.0~: 0명
//1.1~: 0명
//1.2~: 1명
//1.3~: 0명
//1.4~: 0명
//1.5~: 1명
//1.6~: 0명
//1.7~: 0명
//1.8~: 0명
//1.9~: 0명
//2.0~: 1명

 

○클래스 본체와 멤버
1. 클래스 ㅍ본체에서는 다음과 같은 내용을 선언할 수 있다

- 멤버(필드/메서드/중첩(nested)클래스/중첩(ensted)인터페이스
- 클래스 초기화/ 인스턴스 초기화
- 생성자
2. 필드/메서드/생성자를 선언할 때 public/protected/private을 지정할 수 있다
3. 메서드/생성자는 다중으로 정의(오버로드)할 수 있다.
4. final로 선언한 필드는 한 번만 값을 대입할 수 있따
5. 생성자는 새로 생성한 인스턴스의 초기화를 위해 사용된다 

Class A{
 private int f1; // 비공개 필도
 protected int f2; //한정 공개 필드
 public int f3; // 공개필드 

 static final int S1 = 0 ; // 정적 상수 필드 

 public A() {  			// 생성자
 	f1 = f2 =f3 = 0;
 }

puvlic A(int f1, int f2, int f3) { //생성자
 this.f1 = f1;
 this.f2 = f2;
 this.f3 = f3;
}

public void setF1(int f){ // 메서드 F!의 setter
 f1 = f;
}

public int getF1(){   // 메서드 F1의 getter 
return f1;
 }
}

공개 클래스
클래스 접근 제한자 public을 붙여 선언하 클래스로, 다른 패키지에서 사용할 수 있는 공개 클래스(public class)이다

final 클래스
클래스 접근 제한자 final을 붙여 선언한 클래스로, 서브 클래스를 가질 수 없다(새로운 클래스를 상속할 수 없다)
파이널 클래스(fianl class)가 된다. 

파생 클래스 
클래스 A를 직접 상위 클래스(direct superclass)로 하려면 선언할 때 extends A를 추가해야 한다. 
이 떄 선언한 클래스는 클래스 A의 직접 서브 클래스(direct subclass)가 된다. 
클래스 선언에 extends가 없는 클래스의 상위 클래스는 Object 클래스가 된다. 

인터페이스 구현
인터페이스 X를 구현하려면 선언에 implements X를 추가해야 한다 

추상 클래스
클래스 접근 제한자 abstact를 붙여 클래스를 선언하면 추상 메서드를 가질 수 있는 추상 클래스(absract class)가 된다. 
추상 클래스형은 불완전한 클래스이므로 인스턴스를 만들 수 없다. 
(추상 메서드란 실체가 정의되지 않은 메서드, 실체는 서브 클래스에서 정의)

중첩 클래스 
클래스 또는 인터페이스 안에 선언한 클래슨느 중첩 클래스(nested class)가 된다. 
-멤버 클래스(member class)는 그 선언이 다른 클래스 또는 인터페이스 선언에 둘러싸인 클래스 
-내부 클래스(inner class)는 명시적으로도 암묵적으로도 정적(static)으로 선언되지 않는 중첩 클래스이다. 
정적 초기화나 멤버 인터페이스 선언을 할 수 없다. 그리고 컴파일을 할 떄 상수 필드가 아닌 한 정적 멤버를 
선언할 수 없다 
-지역 클래스(local class)는 이름이 주어진 중첩 클래스인 내부 클래스이다. 어떤 클래스의 멤버도 될 수 없다


-출처: 자료구조와 함꼐 배우는 알고리즘 입문[자바편] 책 중
http://www.yes24.com/Product/Goods/60547893

Comments