티스토리 뷰
수업
package main;
public class Main {
public static void main(String[] args) {
// Account ac1 = new Account("개똥이", "100-08-233523", 1000);
// ac1.deposit(2000);
// System.out.println(ac1.balance);
// ac1.withdraw(500);
// System.out.println(ac1.balance);
}
}
package main;
public class Account {
String name;
String num;
int balance;
int withdraw(int amount) {
if(amount > balance) {
System.out.println("돈 읍따 그지야");
return 0;
}else {
balance -= amount;
return amount;
}
}
void deposit(int amount) {
balance += amount;
}
// public Account(String name, String num, int balance) {
// this.name = name;
// this.num = num;
// this.balance = balance;
// }
}
package main;
public class CheckingCard extends Account {
String cardNo;
int pay(int amount) {
if(balance < amount) {
System.out.println("돈 없는 주제에 카드 결재하지 마라");
return 0;
}else {
return withdraw(amount);
}
}
}
teacher
//필드에는 특성을
//void에는 움직임을
// 빨간줄 뜰때 일단 저장먼저
// 상속 클래스 만들 때는 모체보다 자식 클래스 먼저 만들고 거기서 해당하는 공통점을 모아서 모체 클래스 만들기
public Mama(String string, String string2, String string3, String string4, int i) {
// TODO Auto-generated constructor stub
}
//상속관계에서 부모가 생성자를 가지면 자식클래스도 무조건 생성자를 가져야 한다. 이클립스에서 빨간밑줄로 알려줌.
<@Override 메소드 재정의>
부모 메소드에 존재하는 메소드를 서브 클래스에서 재정의하는 것을 의미. 이를 통해 부모 기능을 자식클래스만의 것으로 변화시키거나, 기존 부모 클래스의 기능과 자식 클래스의 기능을 합해 새로운 기능을 만들수도 있다.
package main;
public class Main {
public static void main(String[] args) {
Account ac1 = new Account("A씨", "100-88-9999",1000);
CheckingCard c1 = new CheckingCard("B씨", "100-88-9999",1000, "A001");
System.out.println(ac1.balance);
System.out.println(c1.balance);
ac1.deposit(1000);
c1.deposit(1000);
System.out.println(ac1.balance);
System.out.println(c1.balance);
}
}
package main;
public class Account {
String name;
String num;
int balance;
int withdraw(int amount) {
if(amount > balance) {
System.out.println("돈 읍따 그지야");
return 0;
}else {
balance -= amount;
return amount;
}
}
void deposit(int amount) {
balance += amount;
}
public Account(String name, String num, int balance) {
this.name = name;
this.num = num;
this.balance = balance;
}
}
package main;
public class CheckingCard extends Account {
String cardNo;
public CheckingCard(String name, String num, int balance, String cardNo) {
super(name, num, balance);
this.cardNo = cardNo;
}
int pay(int amount) {
if(balance < amount) {
System.out.println("돈 없는 주제에 카드 결재하지 마라");
return 0;
}else {
return withdraw(amount);
}
}
@Override
void deposit(int amount) {
super.deposit(amount);
balance += amount*2;
}
}
<final>
final 필드
final이 의미하는 것처럼 final 필드는 최종적인 필드다.
즉, final 필드는 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행도중에 수정할 수 없다는 것
final 타입 필드 [= 초기값];
final 타입의 클래스는 상속이 불가하다.
상수(static final)
일반적으로 상수는 불변의 값을 의미한다. 하지만 final 필드를 상수라고 부르지 않는다. 왜냐면 불변의 값은 객체마다 저장할 필요가 없는 공용성을 가지고, 여러값으로 초기화될 수 없기 때문이다.
final 필드가 상수라
<abstract>
추상클래스
'구체적인 실체라기보다 실체들의 공통되는 특성을 가지고 있는 추상적인 것'
객체를 직접 생성할 수 있는 클래스 = 실체클래스
이러한 실체클래스들의 공통적 특성을 추출해 선언한 클래스 = 추상클래스
실체클래스와 추상클래스는 상속의 관계를 가진다.
추상 클래스는 실체클래스의 공통되는 필드와 메소들를 추출해서 만들었기 때문에 객체를 직접 생성해서 사용할 수 없다. 즉, 추상클래스는 new 연산자를 사용해 인스턴스를 생성할 수 없다.
Animal animal = new Animal(); (X 불가하다)
추상메소드와 오버라이딩(@Override)
추상메소드는 내용은 없지만 규칙과 질서를 주는 '규격'이라 할 수 있다.
이는 여러명이 함께 개발할 때 메소드 이름에 규칙을 부여해서 세부내용은 다르더라도 속성에 따라 구분하기 편하게 하기 위함이다. 누가 퇴사하더라도 유지나 보수에 불편함이 없도록!
메소드의 선언만 통일화하고, 그 실행내용은 실체클래스마다 다르다.
자식 클래스는 반드시 추상 메소드를 재정의(@Override)해서 실행내용을 작성해야 한다.
public abstract class BaseBoard {
/**
* - 추상 메소드 -
* 상속 받은 클래스에서
* 무조건 오버라이드 하게해서
* 이름 규칙을 만든다
*
* 기능을 물려받기 위한 것이 아님
* **/
abstract void post(); // 글등록 입니다
abstract void deletePost(); // 글삭제 입니다
}
-추상메소드인 BaseBoard-
public class FreeBoard extends BaseBoard {
@Override
void post() {
// TODO Auto-generated method stub
}
@Override
void deletePost() {
// TODO Auto-generated method stub
}
}
public class MemberBoard extends BaseBoard {
@Override
void post() {
// TODO Auto-generated method stub
}
@Override
void deletePost() {
// TODO Auto-generated method stub
}
}
<다형성>
다형성은 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질을 말한다.
코드측면에서의 다형성은 하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 해준다.
다형성을 위해 자바는 부모클래스로 타입변환을 허용한다. 즉 부모 타입에 모든 자식 객체가 대입될 수 있다.
이를 통해 객체는 부품화가 가능해진다.
상속관계에서 자식클래스는 부모클래스 변수에 대입이 가능하다.
Account ac2 = new CheckingCard("B씨", "100-88-9999",1000, "A001");
ac2.deposit(1000);
System.out.println(ac2.balance);
Account ac3 = new CreditCard("B씨", "100-88-9999",1000, "A001");
ac3.deposit(1000);
System.out.println(ac3.balance);
자식클래스인 CheckingCard와 CreditCard는 부모클래스인 Account에 대입 가능하다.
Account로 정리할 수 있기 때문에 ac2와 ac3는 각각 체크카드, 신용카드라는 다른 클래스에 속하지만
ArrayList로도 묶여질 수 있다. 왜냐면 Account **으로 이름이 같으니까!
Mine
package Main;
public class Mama {
String name;
String breed;
String color;
String neutralization;
int age;
// public Mama(String string, String string2, String string3, String string4, int i) {
// // TODO Auto-generated constructor stub
// }
int agestage() { // 두가지 조건 할때는 2 <= int <5가 아니라 &&로 이어서할 것
if (age < 2) {
System.out.println("청소년기입니다");
}else if ( 2 <= age && age < 5 ) {
System.out.println("청년기입니다");
}else if ( 5 <= age && age < 7) {
System.out.println("장년기입니다");
}else {
System.out.println("노년기입니다");
}
return 0; // void가 아니면 리턴값을 갖는다.
}
void eat() {
System.out.println(name + "가 먹이를 먹는다");
}void water(){
System.out.println(name + "가 물을 마신다");
}
}
package Main;
//토끼
public class Animal2 extends Mama{
void chew() {
System.out.println(name +"풀을 씹는다" );
}
void hop() {
System.out.println(name +"깡총거린다");
}
void stomp() {
System.out.println(name +"뒷발을 구른다");
}
}
package Main;
// 말
public class Animal3 extends Mama {
void run() {
System.out.println(name +"달린다" );
}
void walk() {
System.out.println(name +"걷는다");
}
void stop() {
System.out.println(name +"멈춘다");
}
void jump() {
System.out.println(name +"점프한다");
}
void sound() {
System.out.println(name +"히히힝 운다");
}
}
'JAVA' 카테고리의 다른 글
Sep1_ Runnable (0) | 2020.09.01 |
---|---|
파일저장_Stream (0) | 2020.08.31 |
SimpleGame_모범 (0) | 2020.08.18 |
homework_메이즈 게임 만들기_Aug15~16, 17 (객체지향적 설계) (0) | 2020.08.14 |
Aug14, 18 _ 생성자, 접근제한자,Getter/Setter (0) | 2020.08.14 |