상위클래스는 하위 클래스에게 특성(속성과 메서드)을 상속해 주고, 인터페이스는 클래스가 '무엇을 할 수 있다.'라고 하는 기능을 구현하도록 강제한다
상위클래스는 물려줄 특성이 풍성할수록 좋고, 인터페이스는 구현을 강제할 메서드의 개수가 적을수록 좋다
package ex03.inheritance02;
public class 동물 {
String myClass; // 객체 변수
public 동물() { // 생성자
myClass = "동물";
}
void showMe() { // 객체 메서드
System.out.println(myClass);
}
}
package ex03.inheritance02;
public interface 날수있는 {
void fly();
}
package ex03.inheritance02;
public interface 헤엄칠수있는 {
void swim();
}
package ex03.inheritance02;
public class 포유류 extends 동물{
public 포유류() {
myClass = "포유류";
}
}
package ex03.inheritance02;
public class 조류 extends 동물 {
public 조류() {
myClass = "조류";
}
}
package ex03.inheritance02;
public class 고래 extends 포유류 implements 헤엄칠수있는 {
public 고래() {
myClass = "고래";
}
@Override
public void swim() {
System.out.println("고래헤엄");
}
}
package ex03.inheritance02;
public class 박쥐 extends 포유류 implements 날수있는{
public 박쥐() {
myClass = "박쥐";
}
@Override
public void fly() {
System.out.println("박쥐날다");
}
}
package ex03.inheritance02;
public class 참새 extends 조류 implements 날수있는{
public 참새() {
myClass = "참새";
}
@Override
public void fly() {
System.out.println("참새날다.");
}
}
package ex03.inheritance02;
public class 펭귄 extends 조류 implements 헤엄칠수있는{
public 펭귄() {
myClass = "펭귄";
}
@Override
public void swim() {
System.out.println("펭귄헤엄치다");
}
}
package ex03.inheritance02;
public class Driver {
public static void main(String[] args) {
날수있는 날라리1 = new 박쥐();
날라리1.fly();
날수있는 날라리2 = new 참새();
날라리2.fly();
헤엄칠수있는[] 맥주병들 = new 헤엄칠수있는[2];
맥주병들[0] = new 고래();
맥주병들[1] = new 펭귄();
for(헤엄칠수있는 맥주병 : 맥주병들) {
맥주병.swim();
}
}
}
package ex03.inheritance03;
//상위클래스
public class Animal {
public String name;
public void showName() {
System.out.printf("안녕 나는 %s야. 반가워\n",name);
}
}
package ex03.inheritance03;
public class Penguin extends Animal {
public String habitat;
public void showHabitat() {
System.out.printf("%s는 %s에 살아\n",name,habitat);
}
}
package ex03.inheritance03;
public class Driver {
public static void main(String[] args) {
Penguin pororo = new Penguin();
pororo.name = "뽀로로";
pororo.habitat = "남극";
pororo.showName();
pororo.showHabitat();
Animal pingu = new Penguin();
pingu.name = "핑구";
//pingu.habitat = "EBS";
pingu.showName();
//pingu.showHabitat();
//Penguin happy = new Animal();
}
}
package ex03.polymorphism01;
public class Animal {
public String name;
public void showName() {
System.out.printf("안녕 나는 %s야. 반가워\n",name);
}
}
package ex03.inheritance03;
//상위클래스
public class Animal {
public String name;
public void showName() {
System.out.printf("안녕 나는 %s야. 반가워\n",name);
}
}
package ex03.polymorphism01;
public class Penguin extends Animal {
public String habitat;
public void showHabitat() {
System.out.printf("%s는 %s에 살아\n",name,habitat);
}
//오버라이딩 : 재정의 - 상위클래스의 매서드와 같은 메서드이름, 같은 인자 리스트
@Override
public void showName() {
System.out.println("내이름 알아서 뭐하게요!");
}
//오버로딩 : 중복정의 - 같은 메서드 이름, 다른 인자 리스트
public void showName(String yourName) {
System.out.printf("%s 안녕 나는 %s라고 해\n",yourName,name);
}
}
package ex03.polymorphism01;
public class Driver {
public static void main(String[] args) {
Penguin pororo = new Penguin();
pororo.name = "뽀로로";
pororo.habitat = "남극";
pororo.showName();
pororo.showName("초보람보");
pororo.showHabitat();
Animal pingu = new Penguin();
pingu.name = "핑구";
//
pingu.showName();
}
}
Case 1. 멤버 변수, 같은 패키지
Case 2. 멤버 변수, 다른 패키지
Case 3. 정적 변수, 같은 패키지
Case 4. 정적 변수, 다른 패키지
package ex03.reference;
public class CallByValue {
public static void main(String[] args) {
int a = 10;
int b= a ;
b = 20;
System.out.println(a);
System.out.println(b);
}
}
package ex03.reference;
public class CallByReference {
public static void main(String[] args) {
Animal ref_a = new Animal();
Animal ref_b = ref_a;
//둘 다 같은 곳을 가리킴
ref_a.age = 10;
ref_b.age = 20;
System.out.println(ref_a.age);
System.out.println(ref_b.age);
}
}
class Animal{
public int age;
}