728x90
반응형
추상 메소드 (Abstract Method)
자식클래스에서 반드시 오버라이딩 해야하는 메소드
선언만하고 구현 내용 없음
abstract void printUserInfo();
추상 클래스 (Abstract Class)
하나 이상의 추상 메소드를 포함하는 클래스
반드시 구현해야 하는 부분에 대해 명시적으로 표현
추상 클래스 자체는 객체 생성 불가능
abstract class 추상클래스명 {
abstract void printUserInfo();
}
class 클래스명 extends 추상클래스명 {
}
인터페이스
다중 상속처럼 사용할 수 있는 기능
추상 메소드와 상수만으로 이루어짐
접근제어자 interface 인터페이스명 {
public abstract 반환타입 메소드명(매개변수);
}
class 클래스명 implements 인터페이스명 {
}
상속과 인터페이스 동시 사용
동시 사용으로 다중 상속과 같은 효과
접근제어자 interface 인터페이스명 {
}
접근제어자 class 클래스명1 {
}
class 클래스명2 extends 클래스명1 implements 인터페이스명 {
}
내부 클래스 (Inner Class)
클래스 in 클래스 (클래스 안에 선언한 클래스)
class Outer {
class Inner {
}
}
내부 클래스 특징
내부 클래스에서 외부 클래스 멤버에 접근 가능하다
외부에서는 내부 클래스에 접근 불가능하다.
내부 클래스 종류
- 인스턴스 클래스 (instance class)
- 정적 클래스 (static class)
- 지역 클래스 (local class)
- 익명 클래스 (anonymous class)
익명 클래스 (Anonymous Class)
이름을 가지지 않는 클래스
선언과 동시에 객체 생성
일회용 클래스
클래스명 참조변수명 = new 클래스명() {
};
/**
* 계좌 추상 클래스
*/
abstract class Account {
// 잔고
int balance = 0;
/**
* 입금
* @param amount 금액
*/
abstract void deposit(int amount);
/**
* 출금
* @param amount 금액
*/
abstract void withdraw(int amount);
}
/**
* 출력을 위한 인터페이스
*/
interface Printable {
/**
* 계좌 잔액 출력
*/
abstract void printAccountBalance();
}
/**
* 'Account' 추상 클래스를 상속받고 'Printable' 인터페이스를 구현한 은행 계좌 클래스
*/
class BankAccount extends Account implements Printable {
// 상수 : 계좌 타입
String ACCOUNT_TYPE = "은행 계좌";
/**
* 입금 메소드
* @param amount 금액
*/
@Override
void deposit(int amount) {
this.balance += amount;
printAccountBalance(); // 출력
}
/**
* 출금 메소드
* @param amount 금액
*/
@Override
void withdraw(int amount) {
this.balance -= amount;
printAccountBalance(); // 출력
}
/**
* 계좌 잔액 출력 메소드
*/
@Override
public void printAccountBalance() {
System.out.println(ACCOUNT_TYPE + " 잔액은 : " + this.balance + "원 입니다.");
}
}
/**
* 'Account' 추상 클래스를 상속받고 'Printable' 인터페이스를 구현한 주식 계좌 클래스
*/
class StockAccount extends Account implements Printable {
// 상수 : 계좌 타입
String ACCOUNT_TYPE = "주식 계좌";
/**
* 주식 구매 메소드
* @param name 주식명
* @param count 수량
* @param price 가격
*/
void buyStock(String name, int count, int price) {
System.out.println(name + "주식 매수 총액 : " + count * price);
this.balance -= (count * price);
}
/**
* 입금 메소드
* @param amount 금액
*/
@Override
void deposit(int amount) {
this.balance += amount;
printAccountBalance(); // 출력
}
/**
* 출금 메소드
* @param amount 금액
*/
@Override
void withdraw(int amount) {
this.balance -= amount;
printAccountBalance(); // 출력
}
/**
* 계좌 잔액 출력 메소드
*/
@Override
public void printAccountBalance() {
System.out.println(ACCOUNT_TYPE + " 잔액은 : " + this.balance + "원 입니다.");
}
class Stock {
}
}
/**
* Outer 클래스
*/
class Outer {
String name = "Outer";
/**
* Inner 내부클래스
*/
class Inner {
String name = "Inner";
}
/**
* 출력 메소드
*/
public void print() {
Inner inner = new Inner();
System.out.println(inner.name);
}
}
public class Main3 {
public static void main(String[] args) {
System.out.println("[===== 추상클래스 & 인터페이스 =====]");
System.out.println("[===== 은행 계좌 =====]");
BankAccount ba = new BankAccount();
ba.deposit(10000);
ba.withdraw(5000);
ba.printAccountBalance();
// 결과
// 은행 계좌 잔액은 : 10000원 입니다.
// 은행 계좌 잔액은 : 5000원 입니다.
// 은행 계좌 잔액은 : 5000원 입니다.
System.out.println();
System.out.println("[===== 주식 계좌 =====]");
StockAccount sa = new StockAccount();
sa.deposit(10000);
sa.buyStock("삼성전자", 1, 1000);
sa.printAccountBalance();
// 결과
// 주식 계좌 잔액은 : 10000원 입니다.
// 삼성전자주식 매수 총액 : 1000
// 주식 계좌 잔액은 : 9000원 입니다.
System.out.println("[===== 내부클래스 =====]");
Outer o1 = new Outer();
o1.print(); // Inner
}
}
728x90
반응형
'📌Back-End > Java' 카테고리의 다른 글
Java 예외 처리, 컬렉션 프레임워크 (0) | 2024.04.24 |
---|---|
Java 입출력 (0) | 2024.04.23 |
Java 상속과 다형성 (0) | 2024.04.20 |
Java 다차원 배열, 클래스와 객체 (1) | 2024.04.19 |
Java 조건문과 반복문 (1) | 2024.04.18 |