21.12.17(금)
캡 : 캡슐화(Encapsulation) : 정보은닉
상 : 상속(Inheritance) : 재사용
추 : 추상화(Abstraction) : 모델링
다 : 다형성(Polymorphism) : 사용편의
package inheritance;
public class Animal {
String group;
Animal() {
group = "동물";
}
void showMe() {
System.out.println(group);
}
}
package inheritance;
public class Mammal extends Animal {
public Mammal() {
group = "포유류";
}
}
package inheritance;
public class Whale extends Mammal {
public Whale() {
group = "고래";
}
}
포유류 is a kind of 동물 : 포유류는 동물의 한 분류이다.
고래 is a kind of 포유류 : 고래는 포유류의 한 분류이다.
abstract class Animal{ // 추상클래스
public abstract void eat(); //추상 메소드
public abstract void sleep(); //추상 메소드
public int bite(){ // 메소드
System.out.println("물었다!");
return 0;
}
}
class Dog extends Animal{ // Animal를 상속받은 Dog
@Override
public void eat(){
System.out.println("개가 먹는다");
}
@Override
public void sleep(){
System.out.println("개가 잔다");
}
}
public class abstractTest{
public static void main(String[] args) {
Dog obj = new Dog();
obj.eat(); // 개가 먹는다
obj.sleep(); // 개가 잔다
obj.bite(); // 물었다!
// Animal obj2 = new Animal(); // error
}
}
Animal 클래스는 eat과 sleep 추상 메소드를 포함하기 때문에 추상 클래스이다.
Dog 클래스는 추상 클래스 Animal을 상속 받고 있다.
Dog 클래스에서 추상 메소드 eat과 sleep을 재정의 하고 있다.
- 메인에서 Dog 클래스의 eat과 sleep은 사용 가능하다.
- 메인에서 Animal 클래스의 eat과 sleep은 사용 불가능하다.(추상 메소드라서)
interface Animal{ // 인터페이스
public abstract void eat(); //추상 메소드
public abstract void sleep(); //추상 메소드
}
class Dog implements Animal{ // A를 상속받은 B
@Override
public void eat(){
System.out.println("개가 먹는다");
}
@Override
public void sleep(){
System.out.println("개가 잔다");
}
}
public class interfaceTest{
public static void main(String[] args) {
Dog obj = new Dog();
obj.eat(); // 개가 먹는다
obj.sleep(); // 개가 잔다
// Animal obj2 = new Animal(); // error
}
}
인터페이스를 사용하기 위해서는 인터페이스 이름 앞에 'interface'를 추가한다.
인터페이스를 상속 받을 때에는 'extends' 대신 'implemnts'를 사용한다.
- 메소드의 유형
추상 클래스 : 추상 메소드(선택) + 일반 메소드
인터페이스 : All 추상 메소드- 변수의 final의 여부
추상 클래스 : X
인터페이스 : 기본적으로 final을 붙임- 클래스인가?
추상 클래스 : O
인터페이스 : X- 목적
추상 클래스 : 상속 받아 기능을 확장해나감
인터페이스 : 구현 객체의 같은 동작 보장- 다중 상속
추상 클래스 : 불가능
인터페이스 : 가능
class Parents{
public void info(){
System.out.println("부모 클래스 입니다.");
}
}
class Child extends Parents{
public void info() {
super.info();
System.out.println("자식 클래스 입니다.");
}
}
public class OverTest {
public static void main(String[] args) {
Child son = new Child();
son.info(); // "자식 클래스 입니다."
}
}
class OverloadingTest{
//이름이 cat인 메서드
void cat(){
System.out.println("매개변수 없음");
}
//매개변수 int형이 2개인 cat 메서드
void cat(int a, int b){
System.out.println("매개변수 :"+a+", "+b);
}
//매개변수 String형이 한 개인 cat 메서드
void cat(String c){
System.out.println("매개변수 : "+ c);
}
}
public class OverTest {
public static void main(String[] args) {
//OverloadingTest 객체 생성
OverloadingTest ot = new OverloadingTest();
//매개변수가 없는 cat() 호출
ot.cat();
//매개변수가 int형 두개인 cat() 호출
ot.cat(20, 80);
//매개변수가 String 한개인 cat() 호출
ot.cat("오버로딩 예제입니다.");
}
}