클래스
클래스는 임의의 데이터형을 자유로이 조합하여 만들 수 있는 자료구조이다.
자바의 클래스란, 노션에서는 템플릿, PPT에서는 슬라이드 마스터, 티스토리 블로그에서는 서식 같은 존재가 아닐까.
클래스는 클래스 이름, 데이터 요소(필드)로 구성된다. 필드는 임의의 데이터형이 될 수 있다. 클래스형 변수를 사용할 때는 먼저 클래스형 변수(실체를 참조하는 변수)를 만들고, 그리고 실체인 클래스 인스턴스를 생성해야 한다.
// 클래스 XYZ
class XYZ {
int x; // int형 필드
long y; // long형 필드
double z; // double형 필드
}
XYZ a; // XYZ형의 클래스형 변수 a 선언
a = new XYZ(); // XYZ형의 클래스 인스턴스(실체를 생성)
클래스의 배열
신체검사 데이터를 클래스의 배열로 구현한 프로그램이다. 이 책만으로 공부했을 때 배운 내용에 비해 생소한 개념이 많이 나온다. 하지만 찬찬히 옛날에 배운 개념을 떠올려 보고 이해했다.
package chap02;
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),
};
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));
int[] vdist = new int[VMAX]; // 시력 분포
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]);
}
}
클래스에 대한 보충
- 클래스 본체에서는 다음과 같은 내용을 선언할 수 있다.
- 멤버(필드/메서드/중첩 클래스/중첩 인터페이스)
- 클래스 초기화 / 인스턴스 초기화
- 생성자
- 필드/메서드/생성자를 선언할 때 public/protected/private을 지정할 수 있다.
- 메서드/생성자는 다중으로 정의(오버로드)할 수 있다.
- 오버로드란, 메서드나 생성자를 정의할 때 형식은 다르지만 같은 이름을 붙이는 것이다.
- final로 선언한 필드는 한 번만 값을 대입할 수 있다.
- 생성자는 새로 생성한 인스턴스의 초기화를 위해 사용된다.
- 클래스의 예
- public 클래스
- 접근 제한자 public을 붙여 선언한 클래스로, 다른 패키지에서 사용할 수 있는 공개 클래스이다.
- final 클래스
- 접근 제한자 final을 붙여 선언한 클래스로, 서브 클래스를 가질 수 없다. 즉, 새로운 클래스를 상속할 수 없다.
- 파생 클래스
- 클래스 A를 직접 상위 클래스(direct superclass)로 삼으려면 선언할 때 extends A를 추가해야 한다. 이 때 선언한 클래스는 클래스 A의 직접 서브 클래스(direct subclass)가 된다. 클래스 선언에 extends가 없는 클래스의 상위 클래스는 Object 클래스가 된다. Object는 상위 클래스를 갖지 않는 유일한 클래스이다.
- 추상 클래스
- 클래스 접근 제한자 abstract를 붙여 클래스를 선언하면 추상 메서드를 가질 수 있는 추상 클래스(abstract class)가 된다. 추상 클래스형은 불완전한 클래스이므로 인스턴스를 만들 수 없다. 추상 메서드란 실체가 정의되지 않은 메서드이다. 실체는 서브 클래스에서 정의한다.
- 중첩 클래스
- 클래스 또는 인터페이스 안에 선언한 클래스는 중첩 클래스가 된다.
- 멤버 클래스: 그 선언이 다른 클래스 또는 인터페이스 선언에 둘러싸인 클래스.
- 내부 클래스(inner class): 명시적으로도 암묵적으로도 정적(static)으로 선언되지 않는 중첩 클래스; 정적 초기화나 멤버 인터페이스 선언을 할 수 없다. 그리고 컴파일을 할 때 상수 필드가 아닌 한 정적 멤버를 선언할 수 없다.
- 지역 클래스(local class): 이름이 주어진 중첩 클래스인 내부 클래스이다; 어떤 클래스의 멤버도 될 수 없다.
- 클래스 또는 인터페이스 안에 선언한 클래스는 중첩 클래스가 된다.
- 인터페이스 구현 (이게 뭔 말이여?!)
- 인터페이스 X를 구현하려면 선언에 implements X를 구현해야 한다.
- 인터페이스는 자바 프로그래밍 언어에서 클래스들이 구현해야 하는 동작을 지정하는데 사용되는 추상형이다.
- public 클래스
클래스에서의 인터페이스 구현
인터페이스 구현 문법은 다음 공식을 사용한다:
... implements InterfaceName[, another interface, another, ...] ...
클래스는 인터페이스를 구현할 수 있다. 이를테면 다음과 같다.
public class Lion implements Predator {
@Override
public boolean chasePrey(Prey p) {
// programming to chase prey p (specifically for a lion)
}
@Override
public void eatPrey(Prey p) {
// programming to eat prey p (specifically for a lion)
}
}
클래스가 인터페이스를 구현하면서 메소드를 모두 구현하지 않는다면, abstract로 표시되어야 한다. 클래스가 추상적이라면 서브클래스들 중 하나가 미구현 메소드를 구현할 것이라 예측한다. 추상 클래스의 서브클래스들 중 어느 것도 인터페이스 메소드를 모두 구현하지 않더라도 서브클래스 자체는 abstract로 다시 표시되어야 한다.
클래스들은 여러 인터페이스들을 구현할 수 있다.
public class Frog implements Predator, Prey { ... }
인터페이스들은 일반적으로 콜백을 목적으로 자바 언어에서 사용된다.[2] 자바는 메소드(프로시저)를 인수(argument)로 전달하는 것을 허용하지 않는다.
출처:
- 책 <자료구조와 함께 배우는 알고리즘 입문 자바편>
- 인터페이스 위키백과: https://ko.wikipedia.org/wiki/%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4_(%EC%9E%90%EB%B0%94)
'프로그래밍-학습기록 > 알고리즘 & 자료구조' 카테고리의 다른 글
책 없이 배우는 자료구조와 알고리즘 (0) | 2020.07.06 |
---|---|
검색 알고리즘 (0) | 2020.06.09 |
다차원 배열 (0) | 2020.06.08 |
소수의 나열 (0) | 2020.06.08 |
난수, 역순 정렬, 두 배열 비교, 기수 변환 (0) | 2020.06.02 |