빅데이터 서비스 교육/Java

Java 상속

Manly 2022. 5. 6. 08:51
반응형

 

 

상속의 특징

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