<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교시>
교재로 개념 정리 해봄
'공부의 기록 > 자바 풀 스택 : 수업내용정리' 카테고리의 다른 글
자바 풀 스택 12/19 오후 기록 021-2 (1) | 2024.12.19 |
---|---|
자바 풀 스택 12/19 오전 기록 021-1 (0) | 2024.12.19 |
자바 풀 스택 12/18 오전 기록 020-1 (1) | 2024.12.18 |
자바 풀 스택 12/17 오후 기록 019-2 (1) | 2024.12.17 |
자바 풀 스택 12/17 오전 기록 019-1 (0) | 2024.12.17 |