반응형




상속의 특징
1. 다중상속을 지원하지 않는다.
2. 상속의 횟수에 제한을 두지 않는다.
3. 모든클래스는 java.lang.Object의 상속을 받는다.



상속예제
package 상속기초;
public class Child extends Parent {
//자식, 서브,새로운 클래스
public void makeKimchi() {
System.out.println("돼지고기 듬뿍 김치찌개 만든다");
}
//메소드 오버라이딩(method overriding)
//상속이 전제 되어 있었을때 메소드의 구조가 부모클래스와 동일한 상태에서
//메소드 안쪽에 있는 로직(알고리즘)만 재정의하는 기법
@Override // --> annotation 조금 특이한 주석이라고 생각
public void makeBbyeo() {
System.out.println("뼈하나 추가한 맛있는 뼈해장국을 끓인다");
}
}
package 상속기초;
public class Main {
public static void main(String[] args) {
// Parent p 객체생성
Parent p = new Parent();
//Child c 객체생성
Child c = new Child();
p.makeBbyeo();
c.makeBbyeo();
//메소드가 오버라이딩 되어있다면, 서브클래스는 오버라이딩된 메소드를 사용한다.
//Casting
//형변환 --> 레퍼런스타입의 형변환은 어떻게 일어나는가?
//레퍼런스타입의 형변환
//: 상속이 전제되어있어야하며, 객체내 필드와 메소드의 접근권한에 따라서
//강제형변환인지 자동형변환인지 결정된다.
// 1) UpCasting
//: 하위(자식,서브)클래스가 상위(부모,슈퍼)클래스로 자동으로 형변환
// ex) 갤럭시20은 핸드폰이다 -> 말됨 -> 자동으로 형변환
Parent p1 = new Child();
//부모클래스가 가지고 있는 메소드만 사용가능 이때 자식만 가지고있는 메소드는 잠깐 숨겨진다 생각해라
p1.makeJae();
//객체(하위클래스)내 모든 필드와 메소드에 접근할 수 있는게 아니라
// 상위클래스의 필드와 메소드에만 접근 가능하다.
p1.makeBbyeo();
// 오버라이딩된 메소드에 한해서는 하위클래스가 가지고 있는 메소드를 사용한다.
// 2) DownCasting
// : 업캐스팅 된 객체를 다시 본래의 자료형으로 강제로 되돌리는것
// 다형성을 위해서 업캐스팅 했다가 다시 돌아올때 사용
// : 상위(부모)클래스가 하위(자식)클래스로 강제 형변환
//Child c1 = (Child) new Parent(); --> 불가능
//이때 문법적 문제는 없으나 Parent에는 김치에 대한 메소드가 없어서
//Parent 설계도면만으로는 Child를 만들어 낼수 없다.
Child c1 = (Child)p1; //업캐스팅된 p1을 다시 Child로 다운캐스팅
c1.makeKimchi();
// Exception(예외)
// 문법적인 문제는 없으나 실행 시 문제가 발생하는 것
// ex) IndexOutofBounds ....
// Syntax Error(구문 오류): 문법적 오류 -> IDE에서 잡아줄 수 있다.
// --> 실행하기 전부터 빨간줄 뜨는것
}
}
package 상속기초;
public class Parent {
//슈퍼, 부모, 기존 클래스
public void makeBbyeo() {
System.out.println("맛있는 뼈해장국을 끓인다");
}
public void makeJae() {
System.out.println("제육볶음을 만든다");
}
}
상속예제
Game
package 상속게임;
public abstract class Game {
// 추상클래스
//: 추상메소드를 하나라도 가지고 있으면 해당 클래스는 추상클래스가 되어야 한다.
//: 일반메소드(로직이 있는)를 가지고 있더라도 추상클래스가 될 수 있다.
//: 추상메소드 없이 일반메소드만 있어도 추상클래스가 될 수 있다.
//: 추상클래스는 객체생성이 불가능하다. Game game = new Game(); -> 불가능
// 추상메소드
//: abstract 키워드가 있고 중괄호{} (body)가 없는 메소드
//: 메소드의 구조(접근제한자,리턴타입,메소드명,매개변수)만 정의 해놓고, 로직은 정의하지 않는 메소드
//게임기에 들어갈 게임칩의 규격
public abstract void run();
// 추상클래스와 추상메소드를 사용하는 이유
//: 규격의 강제화
//: 해당하는 추상클래스를 상속받는 자식클래스는 반드시 추상클래스가
// 가지고 있는 추상메소드를 오버라이딩(재정의)해야한다.
//: 설계(추상클래스)와 구현(상속받은 클래스)을 분리
// -> 여러명의 개발자가 따로 설계하면 매개변수, 변수명, 클래스명 다 달라서 이해하기 힘들기 때문에
// 추상클래스로 구조를 정해주고 구현(로직부분)만 하게 한다.
}
Machine
package 상속게임;
public class Machine {
//게임기
//게임을 실행하기위해 사용하는 메소드
public Game start(Game g) {
g.run();//작동
return g;
}
}
Main
package 상속게임;
public class Main {
public static void main(String[] args) {
Machine machine = new Machine();
//게임하나 생성해서 넣어주기
// Game game = new Game();
// machine.start(game);
MarioGame marioGame = new MarioGame(); //바로 machine.start(new MarioGame());로
Game g = machine.start(marioGame);
//Upcasting으로 다형성을 구현시킨 상태로 쓰다가 다시 하위클래스가 가진 메소드가 필요할때
//Downcasting해서 되돌려서 쓴다
MarioGame m1 = (MarioGame)g;
m1.makeChar();
DongGame dongGame = new DongGame();
machine.start(dongGame);
//전부 빨간줄 해결 Main 클래스의 코드는 손대지 말것
}
}
Mario Game (game의 상속)
package 상속게임;
public class MarioGame extends Game {
public void run() {
System.out.println("마리오 게임이 실행된다.");
}
public void makeChar() {
System.out.println("마리오 캐릭터 하나 생성하기");
}
}
PokeGame (game의 상속)
package 상속게임;
public class PokeGame extends Game {
//alt+shift+s override
@Override //annotation 의미를 가진 주석
public void run() {
// super.run(); --> super = 부모클래스, this = 나자신 지칭
System.out.println("포켓몬 게임이 실행 된다.");
}
}
TempGame (game의 상속)
package 상속게임;
public class TempGame extends Game {
// implement -> 구현한다 -> {} 안에 있는 로직을 채워라
@Override
public void run() {
System.out.println("임의의 게임을 실행한다.");
}
}
반응형
'빅데이터 서비스 교육 > Java' 카테고리의 다른 글
Java 추상클래스 (0) | 2022.05.06 |
---|---|
Java JDBC (0) | 2022.05.06 |
Java Arraylist (0) | 2022.05.06 |
Java OOP (0) | 2022.05.06 |
Java 메소드 (0) | 2022.05.03 |