본문으로 바로가기

[자바] 객체지향 프로그래밍(생성자.상속.캐스팅)

category Language/자바 2021. 1. 9. 18:36
728x90
반응형
SMALL

생성자(캡슐화, 추상화, 다형성)

  • 객체가 생성되는 순간(new키워드) 실행
  • 메소드 -> 오버로딩(중복된 메서드이름 서로다르게 입력받는 파라미터값)
  • 반환타입을 지정할 수 없다
  • 클래스의 이름과 같아야한다
  • 생성자를 사용 안하면 디폴트이 자동으로 입력된다.

 

상속

class 서브클래스 extends 슈퍼클래스

  • 기존 클래스의 변수와 코드 재사용
  • 검증된 코드임
  • 다중상속을 지원하지 않는다(부모를 여러명 갖는것x)
  • 상속의 횟수에 제한을 두지 않는다(부모->자식->자식1)
  • 모든 클래스는 java.lang.class를 상속받는다

부모클래스

package Inherence;



public class Maple { //부모클래스
    
	
	//슈퍼클래스,부모클래스
	
	// 1. 필드
	// HP, MP, name

	private int hp;
	private int mp;
	private String name;
	
	// 2. 생성자
	// 위의 세 개의 필드를 전부 채워주기
	
	public Maple(int hp, int mp, String name) { //alt+shift+s
		super();
		this.hp = hp;
		this.mp = mp;
		this.name = name;
	}
	

	// 3. 메소드
	// 앞으로 가기, 뒤로가기, 점프하기, 공격하기
	public void go() {
		System.out.println(name+" 앞으로 간다");
	}
	
	public void back() {
		System.out.println(name+" 뒤로간다");
	}
	
	public void jump() {
		System.out.println(name+" 점프점프!");
	}
	
	public void attack() {
		System.out.println(name+" 공격하기!!");
	}
	
	public void show() {
	System.out.println("현재HP"+hp);
	System.out.println("현재MP"+mp);
	System.out.println("이름"+name);
	}
}

 

자식클래스

package Inherence;

public class Dodo extends Maple {//Maple의 자식클래스
	
	//Maple 슈퍼클래스를 상속받는 서브클래스/자식클래스
	//extends
			
	// 부모클래스가 디폴트생성자가 아닌 다른 생성자를 갖는다면
	// 반드시 그 생성자를 만들어줘야한다.
	public Dodo(int hp, int mp, String name) {
		super(hp, mp, name);  //부모클래스도 정보를 보내고있음
	}

	public void skill() {
		System.out.println("엑스칼리버!!!");
	}

	//메소드 오버라이딩 --->재정의
	//attack()--->오버라이딩
	@Override //어노테이션
	public void attack() {
		System.out.println("필살기를 시전한다!");
		
	}
		
		

	}

 

Main 문

package Inherence;

public class MapleMain{
	
	public static void main(String[] args) {
	//
	Maple dodo=new Maple(100,100,"기본캐릭터"); //부모클래스
	dodo.go();
	dodo.attack();
	
	
	Dodo hyper=new Dodo(200,100,"카이저"); //자식클래스
	hyper.attack(); //상속을 받으면 부모클래스가 가지고 있는 기능들을 전부 사용할 수 있다.
	hyper.skill();

		
	}
		
}


 

 

Casting(캐스팅)

기존 데이터 타입을 다른 데이터 타입으로 변환하는것

Upcasting

하위 클래스(고양이)가 상위 클래스(동물) 타입으로 자동 타입 변환하는것(다형성)

ex)고양이는 동물이다

  • 객체 내 모든 변수, 메소드에 접근x
  • 상위 클래스의 변수메소드에만 접근가능
  • 하위클래스가 상위클래스의 메소드를 오버라이딩한 경우 하위클래스에서 사용가능

 

부모 변수=new 자식();

자식.메서드();

부모와 자식에서의 공동으로 존재하는 메서드(파란색) 중에서 자식내의 오버라이드 된 메서드(파란색)를 사용한다.

자식클래스에는 존재하나 부모에서는 존재치 않는 메서드는 호출되지 않는다

Parent pr=new Parent();    //부모
 
Child cd=new Child();      //자식

Parent pr2=new Child();  업캐스팅된것이며 부모변수이나 몸체는 자식을 갖고있다.

 

부모메서드

public void jjajang() {
		System.out.println("짜장면을 만든다");
	}

부모메서드의 기능을 재정의한 자식메서드

@Override
public void jjajang() {
		//부모클래스를 의미하는 키워드이다
		System.out.println("돼지고기를 듬뿍넣은 업그레이드 짜장면을 만든다");
	}

cd.jjajang();

[출력문]: 짜장면을 만든다

pr2.jjajang();

[출력문]:돼지고기를 듬뿍넣은 업그레이드 짜장면을 만든다

 

다시 정리하면

부모의 jjajang 기능과 자식의 jjajang기능을 동시에 사용하기 하는 업캐스팅 을 통한 다형성 을 이용하면 부모의기능 자식의 기능 둘다 사용 가능하다

 

DownCasting

업캐스팅 된 객체들만 적용됨

 

해당 그림에서 빨간색 부분으로 부모한테는 없는 자식에서만 구현된 메서드를 사용하기 위해

다운 캐스팅을 사용한다

아랫쪽에 코딩문을 따로 표시해뒀지만

Parent pr2=new Child();   업 캐스팅된 pr2

다시 말해 변수는 부모이나 자식의 몸체를 갖고있는 pr2를 대상으로

Child cd2=(Child)pr2  다운캐스팅을 진행 하면 빨간색 메서드 를 사용할 수 있다

해당 빨간색메서드로서 부모한테는 존재하지 않는 자식한테만 존재하는 메서드이다.

public void bbok() {
		System.out.println("볶음밥을 만든다");
	}

 

  

 

[명령문]:  cd2.bbok();

[출력문]:  볶음밥을 만든다

 

bbok() 메서드 자체는 부모클래스에 구현되있지 않으나 다운캐스팅으로 인해 출력할수있음을 확인할수있다.

 

ex

부모클래스

package Inherence;

public class Parent {
             
	  //부모님이 하고계시는 중국집
	public void jjajang() {
		System.out.println("짜장면을 만든다");
	}
	
	public void tangsu6() {
		System.out.println("탕수육을 만든다");
	}
}

 

 

자식클래스

package Inherence;

public class Child extends Parent { //자식은 3가지의 기능을 쓸쑤있다. why? 재정의한 짜장면 기능을 쓰지 부모의 짜장기능은 못쓴다

	public void bbok() {
		System.out.println("볶음밥을 만든다");
	}

	@Override
	public void jjajang() {
		//부모클래스를 의미하는 키워드이다
		System.out.println("돼지고기를 듬뿍넣은 업그레이드 짜장면을 만든다");
	}
	
	
}

 

Main

package Inherence;

public class ChineseMain {

	public static void main(String[] args) {

		Parent pr=new Parent();
		
		Child cd=new Child();
		
		//업캐스팅(UpCasting)-->암묵적 형변환
		//Parent가 필요한 메소드와 필드를 Child가 전부 가지고 있기 때문에
		//래퍼런스 변수는 부모= 몸체 자식
		Parent pr2=new Child();
		
		
		pr.tangsu6();
		cd.tangsu6();
		pr.jjajang();
		cd.jjajang();
		
		//몸체를 Child 를 만들어줬기 때문에 Child가 가진 jjajang기능 사용
		pr2.jjajang();
		//pr2.bbok();//이건 불가능-->부모가 가지고있는 기능이 아니기 때문에
		
		// 2. 다운캐스팅
		// 사전조건 : 업캐스팅 된 객체를 대상으로만 다운캐스팅 진행
		//Child cd2=(Child)new Parent(); //-->컴파일시 에러뜬다. Child에 Parent에 없는 bbok() 메서드가 있기때문에 변환x
		Child cd2=(Child)pr2;
		cd2.bbok();
		
		
	}

}

 

 

 

 

 

 

728x90
반응형
LIST

'Language > 자바' 카테고리의 다른 글

[자바]접근제한자 & 추상화(클래스,메서드)  (0) 2021.01.11
[JDBC]이클립스 JDBC연동  (0) 2021.01.11
자바 jdk 환경변수 설정  (0) 2021.01.10
[자바] enum 이란?  (0) 2021.01.01
Tomcat 환경세팅  (0) 2020.12.18