
상속/생성자/인터페이스WEB JAVA SPRING/문법2023. 8. 25. 10:34
Table of Contents
상속
1.자식 클래스가 부모 클래스의 기능을 그대로 물려받음
2.보통 부모 클래스를 상속받은 자식 클래스는 부모 클래스의 기능에 더하여 좀 더 많은 기능을 갖도록 작성할 수 있다.
3.부모 클래스로 만들어진 객체를 자식 클래스의 자료형으로는 사용할 수 없다 (IS-A관계)
class Animal {
String name;
void setName(String name) {
this.name = name;
}
}
class Dog extends Animal { // Animal 클래스를 상속한다.
void sleep() {
System.out.println(this.name+" zzz");
}
}
public class Sample {
public static void main(String[] args) {
Dog dog = new Dog();
dog.setName("poppy");
//dog 클래스에 객체 변수인 name과 메서드인 setName을 만들지 않았지만
//Animal 클래스를 상속했기 때문에 그대로 사용이 가능
System.out.println(dog.name); //poppy
dog.sleep(); //poppy zzz
}
}
메서드 오버로딩/ 오버라이딩 차이
class Animal {
String name;
void setName(String name) {
this.name = name;
}
}
class Dog extends Animal {
void sleep() {
System.out.println(this.name + " zzz");
}
}
class HouseDog extends Dog {
void sleep() {
System.out.println(this.name + " zzz in house");
}
/*메서드 오버로딩
입력 항목이 다른 경우 동일한 이름의 메서드를 만들 수 있음
(int hour)
*/
void sleep(int hour) {
System.out.println(this.name + " zzz in house for " + hour + " hours");
}
}
public class Sample {
public static void main(String[] args) {
HouseDog houseDog = new HouseDog();
houseDog.setName("happy");
/* 메서드 오버라이딩
HouseDog 클래스의 sleep 메서드가 Dog 클래스의 sleep 메서드보다 우선순위를 갖게 되어
HouseDog 클래스의 sleep 메서드가 호출되게 된다.
부모 클래스의 메서드를 자식 클래스가 동일한 형태로 또다시 구현하는 행위
(method overriding, 풀이하자면 메서드 덮어쓰기라고 할 수 있다.)
*/
houseDog.sleep(); // happy zzz in house 출력
houseDog.sleep(3); // happy zzz in house for 3 hours 출력
}
}
생성자
생성자 new (포인터) - 자바는 jvm의 도움으로 기본생성자 만들어준다.
-Constructor 생성자
생성자는 객체가 생성될 때 객체를 초기화하는 특수한 메소드이다.
생성자의 이름은 클래스 이름과 같다.
생성자는 반환 값을 가지지 않는다.
생성자의 이름 앞에는 아무것도 붙이지 않는다.
생성자는 필드에 초기값을 부여할 때 사용한다.
생성자는 매개변수를 가질 수도 있고 가지지 않을 수도 있다.
가지지 않는 경우에는 생성자 안에서 필드 값을 지정하고 가지는 경우에는 전달된 매개변수의 값으로 필드 값을 지정한다.
class Animal {
String name;
void setName(String name) {
this.name = name;
}
}
class Dog extends Animal {
void sleep() {
System.out.println(this.name + " zzz");
}
}
class HouseDog extends Dog {
/*생성자*/
HouseDog(String name) {
this.setName(name);
}
/*생성자 오버로딩*/
HouseDog(int type) {
if (type == 1) {
this.setName("yorkshire");
} else if (type == 2) {
this.setName("bulldog");
}
}
void sleep() {
System.out.println(this.name + " zzz in house");
}
void sleep(int hour) {
System.out.println(this.name + " zzz in house for " + hour + " hours");
}
}
public class Sample {
public static void main(String[] args) {
HouseDog dog = new HouseDog("happy"); // // 생성자 호출 시 문자열을 전달해야 한다.
HouseDog yorkshire = new HouseDog(1);
System.out.println(happy.name); // happy 출력
System.out.println(yorkshire.name); // yorkshire 출력
}
}
인터페이스
변경전
class Animal {
String name;
void setName(String name) {
this.name = name;
}
}
class Tiger extends Animal {
}
class Lion extends Animal {
}
class ZooKeeper {
void feed(Tiger tiger) { // 호랑이가 오면 사과를 던져 준다.
System.out.println("feed apple");
}
void feed(Lion lion) { // 사자가 오면 바나나를 던져준다.
System.out.println("feed banana");
}
}
public class Sample {
public static void main(String[] args) {
ZooKeeper zooKeeper = new ZooKeeper();
Tiger tiger = new Tiger();
Lion lion = new Lion();
zooKeeper.feed(tiger); // feed apple 출력
zooKeeper.feed(lion); // feed banana 출력
/*
만약 Tiger와 Lion뿐이라면 ZooKeeper 클래스는 더 이상 할 일이 없겠지만
Crocodile, Leopard 등이 계속 추가된다면
ZooKeeper는 클래스가 추가될 때마다 매번 다음과 같은 feed 메서드를 추가해야 한다.
*/
}
}
변경후
//인터페이스의 메서드는 항상 public으로 구현해야 한다.
interface Predator {
String getFood();
}
class Animal {
String name;
void setName(String name) {
this.name = name;
}
}
class Tiger extends Animal implements Predator {
public String getFood() {
return "apple";
}
}
class Lion extends Animal implements Predator {
public String getFood() {
return "banana";
}
}
/*
인터페이스의 핵심
ZooKeeper 클래스가 동물 클래스에 의존적인 클래스에서 동물 클래스와 상관없는 독립적인 클래스가 되었다.
*/
class ZooKeeper {
void feed(Predator predator) {
System.out.println("feed "+predator.getFood());
}
void feed(Lion lion) { // 사자가 오면 바나나를 던져준다.
System.out.println("feed banana");
}
}
'WEB JAVA SPRING > 문법' 카테고리의 다른 글
객체/클래스/인스턴스 (0) | 2023.08.25 |
---|---|
Collection, Vector (0) | 2023.08.24 |
List, Map, Set (0) | 2023.08.24 |
제네릭스 (1) | 2023.08.24 |
접근제어자 (0) | 2023.08.24 |