추상 클래스
- 실체클래스의 공통적인 부분(변수,메서드)를 추출해서 선언한 클래스
- 객체 생성을 하지 못함
- 종류 : 추상 메소드 포함 / 미포함
- 상속
1. 단순 상속 : 추상클래스를 상속 받고 추상 메소드를 오버라이딩하지 않으면 서브클래스에도 abstract를 붙여야함
2. 구현 상속
abstract class Calculator {
public abstract int add(int a, int b);
public abstract int subtract(int a, int b);
public abstract double average(int[] a);
}
public class GoodCalc extends Calculator{
@Override // annotation: 시스템 주석
public int add(int a, int b) {
return a+b;
}
@Override
public int subtract(int a, int b) {
return a-b;
}
@Override
public double average(int[] a) {
double sum = 0;
for (int i = 0; i < a.length; i++) {
sum += a[i];
}
return sum/a.length;
}
public static void main(String[] args) {
GoodCalc c = new GoodCalc();
System.out.println(c.add(2, 3));
System.out.println(c.subtract(2, 3));
System.out.println(c.average(new int[] {2,3,4}));
}
}
인터페이스
- 인터페이스는 다중 상속 가능
- 추상 클래스와 같이 객체 생성 불가능
- 클래스 상속과 달리 구현 코드가 없으므로 여러 인터페이스를 구현할 수 있음 > 다형성
- 인터페이스끼리의 상속은 extends로 하며 다중 상속이 됨 클래스가 상속 받을 때는 implements로 함
- 인터페이스에 선언된 모든 메서드는 public abstract로 선언되며 생략가능 **필드(영역)**는 public static final로 선언되며 생략가능
추가된 기능 | 사용 |
default | 구현부 사용 가능, 오버라이딩 가능 |
static | 오버라이딩 불가, 클래스명으로 호출 해야함 |
private | 자바 9부터 사용 가능, private (static) method() {}> 멤버들의 접근지정자가 public이어야하는 한계를 벗어나기 위해 만들어짐, 구현부가 있어 abstract는 선언 불가능 |
interface PhoneInterface2{
final int TIMEOUT = 100;
void sendCall();
void receiveCall();
default void printLogo() {
System.out.println("** Phone **");
} // default 메소드는 구현부 사용 가능
}
interface MobilePhoneInterface extends PhoneInterface2{
void sendSMS();
void receiveSMS();
}
interface MP3Interface{
public void play();
public void stop();
}
class PDA{
public int calculate(int x, int y) {
return x+y;
}
}
class SamsungPhone2 extends PDA implements MobilePhoneInterface, MP3Interface {
public void sendCall() {
System.out.println("띠리리리링");
}
public void receiveCall() {
System.out.println("전화가 왔습니다.");
}
public void flash() {
System.out.println("전화기에 불이 켜졌습니다.");
}
public void play() {
System.out.println("음악 연주합니다.");
}
public void stop() {
System.out.println("음악 중단합니다.");
}
public void sendSMS() {
System.out.println("문자 발신");
}
public void receiveSMS() {
System.out.println("문자 수신");
}
public void schedule( ) {
System.out.println("일정 관리합니다.");
}
}
public class InterfaceEx2 {
public static void main(String[] args) {
SamsungPhone2 phone = new SamsungPhone2();
phone.printLogo();
phone.sendCall();
phone.receiveCall();
phone.flash();
phone.play();
phone.schedule();
System.out.println("3과 5를 더하면 "+phone.calculate(3, 5));
}
}
내부 클래스
- 클래스 안의 다른 클래스 정의
- 특정 멤버 변수를 private로 유지하면서 자유롭게 사용 가능
- 특정한 곳에서만 사용되는 클래스들을 모을 수 있음
- 유지 보수가 쉬워짐
class OuterClass{
// private String secret = "Time is money"; // 내부 클래스에서는 접근 가능
public String secret = "Time is money";
public OuterClass() {
InnerClass obj = new InnerClass(); // 외부 클래스에서는 생성 가능
obj.method();
}
private class InnerClass{
public InnerClass() {
System.out.println("내부 클래스의 생성자입니다.");
}
public void method() {
System.out.println(secret);
}
}
}
public class OuterClassTest {
public static void main(String[] args) {
OuterClass o = new OuterClass();
// new InnerClass();// 접근 지정자와 상관없이 내부클래스는 객체 생성 불가
}
}
무명 클래스
- 클래스 몸체는 정의되지만 이름은 없는 클래스
- 하나의 객체만 생성하면 되는 경우 사용
- 클래스 정의하면서 객체 생성
new ClassOrInterface(){클래스 몸체}
ClassOrInterface : 부모 클래스 이름이나 인터페이스 이름
interface RemoteControl {
void turnOn();
void turnOff();
}
public class AnonymousClassTest {
public static void main(String[] args) {
// new RemoteControl(); // 인터페이스는 객체 생성 불가능
RemoteControl rc = new RemoteControl() { // 무명클래스
@Override
public void turnOn() {
System.out.println("TV turnOn()");
}
@Override
public void turnOff() {
System.out.println("TV turnOff()");
}
};
rc.turnOn();
rc.turnOff();
}
}
'java,jsp,spring > java' 카테고리의 다른 글
java 스레드, 메모리 사용 영역 (1) | 2022.08.01 |
---|---|
java 패키지 (0) | 2022.08.01 |
java 상속 (0) | 2022.07.31 |
java 접근 지정자, static (0) | 2022.07.25 |
java 객체 배열 등 (0) | 2022.07.25 |