공부의 기록/자바 풀 스택 : 수업내용정리

자바 풀 스택 12/18 오후 기록 020-2

파티피플지선 2024. 12. 18. 18:19

<14:30 5교시>

객체가 하나가 생기면 참조값이 하나가 부여된다. 같은 참조값을 여러 개의 지역 변수가 담고 있을 수 있다.

더보기
package test.main;

import test.mypac.MobilePhone;
import test.mypac.Phone;

public class MainClass03 {
	public static void main(String[] args) {
		//아래 3줄을 실행하면 참조값이 몇 개가 나올까?(객체가 몇 개 생성될까?) 
		//답 : new 한것만 참조값이 있음1개 -> 참조값이 담기는 공간의 타입만 여러개
		MobilePhone p1 = new MobilePhone();
		//휴대전화 타입 안에 있는 값을 전화 타입(부모 타입) 변수에 대입 가능!
		Phone p2= p1;
		//휴대전화 타입 안에 있는 값을 오브젝트 타입(부모 타입) 변수에 대입 가능!
		Object p3=p1;
		MobilePhone p4 = (MobilePhone)p3;//캐스팅으로 담기는거
	}
}

 

부모 객체를 강제로 자식 데이터 타입으로 캐스팅해서 자식 데이터 지역변수에 넣는다고 컴파일러가 인식하는 에러는 나타나지 않지만 실행 시켰을 때 에러가 나게 된다.

 

 

 

캐스팅 연산자 연습 (앞으로 쓸 일이 많을것이라고 하심)

더보기
package test.main;

import test.mypac.MobilePhone;
import test.mypac.Phone;

public class MainClass04 {
	public static void main(String[] args) {
		//휴대전화 객체를 생성해서 나온 참조값을 오브젝트 타입 p3이라는 지역 변수에 담기
		Object p3= new MobilePhone();
		//casting 연산자를 이용해서 대입 연산자의 우측을 전화 타입으로 인식되도록 하기
		Phone p2= (Phone)p3;
		//casting 연산자를 이용해서 대입 연산자의 우측을 휴대전화 타입으로 인식되도록 하기
		MobilePhone p1= (MobilePhone)p3;
	}
}

 

 

새로운 클래스 : 안드로이드 폰 클래스

더보기
package test.mypac;

public class AndroidPhone extends MobilePhone {
	//생성자
	public AndroidPhone() {
		System.out.println("안드로이드폰 생성자 호출됨");
	}
	//메소드
	public void doInternet() {
		System.out.println("인터넷 된당");
	}
}

상속을 받으면 상속을 하는 부모 객체들까지 다 일괄 생성돼서 부모 객체의 기능을 사용할 수 있다.

 

 

Override : 부모 객체의 메서드 재정의하기

더보기
package test.mypac;

public class AndroidPhone extends MobilePhone {
	//생성자
	public AndroidPhone() {
		System.out.println("안드로이드폰 생성자 호출됨");
	}
	//메소드
	public void doInternet() {
		System.out.println("인터넷 된당");
	}
	@Override//부모 메서드를 재정의했다는 기호일 뿐, 이 행이 무슨 기능을 하는 건 아님
	public void takePicture() {
		// TODO Auto-generated method stub
		//super.takePicture();
		//부모의 메서드를 호출할 수 있도록 가져오긴 하는데 지워도 무관
		System.out.println("1000만 화소의 사진을 찍어요!");
	}
}

 

 

<15:30 6교시>

 

더보기
package test.main;

import test.mypac.AndroidPhone;
import test.mypac.MobilePhone;

public class MainClass05 {
	public static void main(String[] args) {
		//안드로이드폰 객체를 생성해서 참조값을 안드로이드 폰 타입 p1이라는 지역변수에 담기
		AndroidPhone p1 = new AndroidPhone();
		p1.call();
		p1.mobileCall();
		p1.takePicture();
		p1.doInternet();
		
		System.out.println("------------");
		//안드로이드폰 객체를 생성해서 참조값을 모바일폰 타입 p2 라는 지역 변수에 담기
		MobilePhone p2= new AndroidPhone();
		p2.takePicture();//Override 된 메소드가 호출됨
		
		System.out.println("---------");
		MobilePhone p3 = new MobilePhone();
		p3.takePicture();//부모 객체인 MobilePhone 객체의 원래 메서드가 호출됨
	}
}

내마음대로 IosPhone 객체를 만들고 그걸 활용해보기

더보기
package test.mypac;

public class IosPhone extends MobilePhone{
	public IosPhone(){
		System.out.println("아이폰입니다.");
	}
	public void apple(){
		System.out.println("이것은 사과입니다. 농담입니다. 앱등입니다");
	}
	@Override
	public void mobileCall(){
		// TODO Auto-generated method stub
		//super.mobileCall();
		System.out.println("사과는 애아뽈, 애아뽈");
	}
}

 

 

package test.main;

import test.mypac.AndroidPhone;
import test.mypac.IosPhone;
import test.mypac.MobilePhone;

public class MainClass05 {
	public static void main(String[] args) {
		System.out.println("---------");
		MobilePhone p4= new IosPhone();
		p4.mobileCall();
	}
}

 

 

 

 

부모 객체를 생성하기 위해 다른 객체가 필요할 때, 자녀 객체가 super()를 통해 부모 객체 생성자를 전달하는 방법

package test.auto;
//SportsCar 객체를 생성하기 위해서는 Car 객체도 생성이 되어야 하는데 Car객체는 Engine 객체가 있어야만 생성되는데 엔진이 없이 에러일 수 밖에 없다
public class SportsCar extends Car{

}

 

package test.auto;
//SportsCar 객체를 생성하기 위해서는 Car 객체도 생성이 되어야 하는데 Car객체는 Engine 객체가 있어야만 생성되는데 엔진이 없이 에러일 수 밖에 없다
public class SportsCar extends Car{

	//빨간 밑줄에 에러 해결하기 하면 성립이 됨
	public SportsCar(Engine engine) {
		super(engine);//자식생성자에서 ()에 받아서 부모 생성자를 호출하면서 Engine을 전달해줌
		//super.은 호출하는거
		//super() :부모생성자 호출
		// TODO Auto-generated constructor stub
	}

}

 

 

MainClass06.java

package test.auto;
//SportsCar 객체를 생성하기 위해서는 Car 객체도 생성이 되어야 하는데 Car객체는 Engine 객체가 있어야만 생성되는데 엔진이 없이 에러일 수 밖에 없다
public class SportsCar extends Car{

	//빨간 밑줄에 에러 해결하기 하면 성립이 됨
	public SportsCar(Engine engine) {
		super(engine);//자식생성자에서 ()에 받아서 부모 생성자를 호출하면서 Engine을 전달해줌
		//super.은 호출하는거
		//super() :부모생성자(Car클래스의 생성자)를 의미한다.
		//부모 생성자에 필요한 값을 자식 생성자에서 받아서 전달한다
		//super() 코드 실행전에 다른 코드가 있으면 안된다.
	}
	//메소드
	public void openDrive() {
		if(this.engine==null) {//접근 지정자가 private으로 지정되어 있어서 오류가 나는 상황
        //Car class의 Engine의 접근 지정자를 protected로만 바꿔줘도 오류가 해결됨
			System.out.println("엔진읎다");
			return;
		}
		System.out.println("오픈카로 달려");
	}

}

 

 

 

접근지정자 메모가 들어간 Car 객체

package test.auto;
/*
 *  - 접근 지정자 접근범위
 *  
 *  public : 어디에서나 접근 가능 
 *  protected : 동일한 package 혹은 상속관계에서 자식에서 접근 가능(default보다 넓은 범위)
 *  default(작성 안한 경우) : 동일한 package 안에서만 접근 가능
 *  private : 동일한 클래스 혹은 동일한 객체 안에서만 접근가능(static 영역에서냐 heap 영역에서냐의 차이)
 *  
 *  - 접근 지정자를 붙이는 위치
 *  
 *  1. 클래스를 선언 할때 (import 가능여부를 결정한다) public class /    class
 *  2. 생성자 (객체 생성 가능여부를 결정한다) new 여부를 결정
 *  3. 필드 (필드 참조 가능 여부를 결정한다) 필드에 붙은거
 *  4. 메소드 (메소드 호출 가능 여부를 결정한다) 메소드에 붙은거
 *  
 *  클래스는 default 와 public 두가지의 접근 지정자만 지정 가능하다
 *  접근 지정자를 생략한것이 default 접근 지정자다 
 */
public class Car {
	//필드(protected는 패키지가 달라도 상속관계 자식이면 참조 가능)
	protected Engine engine;
	//엔진 객체를 생성자의 인자로 전달받는 생성자(이 생성자를 정의하면 default 생성자는 사라진다)
	public Car(Engine engine) {
		this.engine=engine;
	}
	//메소드
	public void drive() {
		if(this.engine==null) {
			System.out.println("엔진이 없어서 달릴 수 없어요!");
			return; // 메소드를 여기서 리턴시키기(종료시키기)
		}
		System.out.println("달려~");
	}
}

java의 모든 데이터 타입을 다 담을 수 있는 Object 객체

 

 

다른 예제

package test.main;

import test.mypac.AndroidPhone;
import test.mypac.Phone;

public class MainClass08 {
	public static void main(String[] args) {
		//여기서 아래의 usePhone()메소드를 호출하는 code를 작성하고 run 해서 결과를 확인해보세요
		
		
		MainClass08.usePhone(new Phone());
		//usePhone(new Phone()); 내가 한거 이거는 틀린거인줄 알았는데! 아니었어!!
        //스태틱 메소드는 클래스명. 찍어서 메소드를 호출해야 하는데,
		//지금 같은 경우는 같은 스태틱 영역 안에 있는거라서 MainClass08. 부분을 생략 가능
		
		//Phone p1 = new Phone();
		//MainClass08.usePhone(p1);
		
		usePhone(new AndroidPhone());//도 가능하다
		
	}
	//static 메소드 추가(이 메소드 호출을 위해 Phone 타입 참조값이 필요)
	public static void usePhone(Phone p) {
		//a매개변수에 전달된 값을 이용해서 메소드를 호출하는 code
		p.call();
	}
}

<17:30 8교시>

교재로 개념 정리 해봄