230224 열 번째 수업_Java

mary·2023년 2월 24일
0

국비 수업

목록 보기
10/72

생성자,상속,오버로드,오버라이딩,super 복습~


패키지(package):

하위 폴더 다단 구성하려면 . 넣으면 됨
확인 방법: Window 클릭 -> Show view -> Navigator

보통 패키지 이름은 당사의 url에 따라 만듦 그래야 다른 회사랑 안 겹침

kr.or.iei.projectname

보통 2개 이상씩은 만들어 사용함

다른 라이브러리 파일의 클래스를 가져오고 싶다면

import 패키지이름.클래스이름;

만약 특정 클래스 말고 모든 클래스를 가져오고 싶다면?
* 별 넣기

import 패키지이름.*;


제어자(modifier):

클래스,변수,메서드의 선언부에 사용되어 부가적인 의미를 부여함.


  • 접근 제어자
    단 하나만 사용 가능
  1. public:
    접근 제한 없음

  2. (default):
    같은 패키지 내에서만 접근
    가끔 사용

  3. protected:
    같은 패키지 내에서, 다른 패키지에선 자식 클래스에서만 접근
    가끔 사용

  4. private:
    같은 클래스 내에서만 접근
    보통 변수 앞에 많이 붙는다. (은행에서 잔액같은 변수를 수정 가능하면 안 되니까)

package tv04;

public class Tv {

	private boolean power;
	private int channel;
	
	public void power() {
		power = !power;
		if (power)
			System.out.println("전원 on");
		else
			System.out.println("전원 off");
	}
	void channelUp() {
		++channel;
		System.out.println("현재 채널: " + channel);
	}
	void channelDown() {
		--channel;
		System.out.println("현재 채널: " + channel);
	}
}


package aa.bb.cc;

import tv04.Tv;	//import해야 가져올 수 있음

public class TvTest {

	public static void main(String[] args) {

		Tv tv = new Tv();
		//tv.channel = 10; private를 했기 때문에 사용 불가
		//tv.channelUp(); public을 안썼기 때문에 사용 불가
		tv.power();
	}

}


★다른 프로젝트에서 가져오려면?
내 프로젝트 우클릭 -> Properties -> Java Build Path -> Projects-> Classpath -> add -> 내가 쓸 프로젝트 선택 후 apply and close


package Phone05;

public class SmartPhone extends CellPhone {

	public void kakao(String talk) {
		System.out.println("카톡의 " + talk + "를 봅니다.");
	}
	
	void internet(String serch) {
		System.out.println(serch + " 내용을 인터넷에 검색합니다.");
	}
}

package aa.bb.cc;

import Phone05.SmartPhone;
import tv04.Tv;	

public class TvTest {

	public static void main(String[] args) {

		Tv tv = new Tv();
		tv.power();
		SmartPhone sp = new SmartPhone();
		sp.kakao("ㅎㅇ");
	}

}

  • 그 외 제어자
    하나의 대상에 여러 개의 제어자를 조합해서 사용 가능

    static final int(~~~)

1) static + 멤버변수, +메서드, +초기화

2)final +멤버/지역변수, +메서드, +클래스

대표적인 final 클래스: String, Math

-변수에 붙으면 값을 변경할 수 없는 상수가 됨

*거의 변수에 많이 붙고 밑의 두 경우는 잘 안 씀

-메서드에 붙으면 오버라이딩(재정의) 불가
-클래스에 붙으면 상속 불가



클래스의 다형성(polymorphism):

여러가지 형태를 가질 수 있는 것.
하나의 참조변수로 여러 타입의 객체를 참조.
부모타입의 참조변수로 자식타입의 객체를 다룰 수 있는 것.

  • 자동 형 변환:
    부모클래스 변수 = 자식클래스 타입;
    자식타입을 부모 타입으로 변환 가능 왜냐면 상속 관계니까 자식 클래스는 부모를 가지고 있어서
package polymorphism01;
class A { }
class B extends A { }
class C extends A { }
class D extends B { }
class E extends C { }

public class PolymorphismTest1 {

	public static void main(String[] args) {

		B b = new B();
		C c = new C();
		D d = new D();
		E e = new E();
		A a1 = b; //객체 B의 저장공간을 사용 안 하고 A만 사용하겠다는 말 => A로 형변환
		A a2 = c;
		A a3 = d; //객체 D와 B를 사용 안 하고 A만 사용하겠다는 말. D가 B를 상속받았기 때문. => A로 형변환
		A a4 = e; //객체 E와 C를 사용 안 하고 A만 사용하겠다는 말. 상속 관계니까. => A로 형변환
		B b1 = d; //D만 사용 안 하고 B로 형변환 하여 B와 A를 사용하겠다는 말.
		C c1 = e; //E를 C 타입으로 변환하여 C와 A를 사용하겠다는 말.
	}

}

  • 형 변환 환경에서 오버라이딩

*어노테이션(Annotation):
컴파일러에게 코드 에러를 체크하도록 함.
스펠링 같은 거 틀렸을 때 잡아내기 딱 좋음^^!
@붙여 사용한다

@Override
package polymorphism01;
class Parent {
	void method1() {
		System.out.println("부모의 메소드1");
	}
	void method2() {
		System.out.println("부모의 메소드2");
	}
}
class Child extends Parent {
	void method3() {
		System.out.println("자식의 메소드3");
	}
	void method4() {
		System.out.println("자식의 메소드4");
	}
	@Override	//오버라이드 할 거라고 미리 명시하면 스펠링 틀리는 오류를 예방할 수 있음.
	void method2() {
		System.out.println("부모의 메소드2를 오버라이딩");
	}
}
public class PolymorphismTest2 {
	public static void main(String[] args) {

		/*
		 * Child c1 = Child(); 
		 * Parent p1 = c1;
		 * 이거를 밑에 한 줄로 표현 가능
		 */ 
		Parent p1 = new Child();
        
		//p1.method3() 오류. 부모 타입으로 형변환 했기 때문에 부모의 메소드만 쓸 수 있어서 자식 것 호출 불가.
		p1.method1();
		p1.method2();	//오버라이딩 한 것은 부모 타입 형 변환 상관없이 무조건 자식 것이 출력됨. super로 호출하면 부모것으로 가능
		
	}

}

  • 강제 형 변환:
    자식타입이 부모타입으로 자동 변환 된 후 다시 자식 타입으로 변환할 때
package polymorphism01;
class Car {
	private String model;
	private int door;
	Car(String model, int door) {
		this.model = model;
		this.door = door;
	}
	void drive() {
		System.out.println("운전중");
	}
	void stop() {
		System.out.println("멈춤");
	}
	void call() {
		System.out.println("신고한 곳으로 이동"); 
	}
}
class Ambulance extends Car {
	Ambulance(String model, int door) {
		super(model, door);
	}
	@Override
	void call() {
		System.out.println("사이렌을 울립니다.");
	}
	void FirstAid() {
		System.out.println("응급처치를 합니다.");
	}
}
class FireEngine extends Car {
	FireEngine(String model, int door) {
		super(model, door);
	}
	@Override
	void call() {
		System.out.println("물을 준비합니다.");
	}
}

public class PolymorphismTest3 {
	public static void main(String[] args) {
		Car car = null;	//지역변수는 초기화를 해줘야되기 때문에 null 값으로 초기화 해준 것.
		FireEngine fe1 = new FireEngine("소방차",2);
		Ambulance ab1 = new Ambulance("구급차",3);
		
		car = fe1;
		car.call();
		car.drive();
		car.stop();
		
		car = ab1;
		car.call();
		car.drive();
		car.stop();
		
		ab1 = (Ambulance)car;	//강제형변환(부모를 자식으로)
		ab1.call();
		ab1.drive();
		ab1.stop();
		ab1.FirstAid(); //부모 것도 사용하고 내 것도 사용가능
	}

}

*연습문제*
//동물 클래스에서 숨을 쉰다/소리를 내다는 공통 메서드, Dog 클래스에서 동물 클래스를 상속받고 오버라이딩을 소리로 하시오. 또한 Cat 클래스에서 동물 클래스를 상속받고 오버라이딩을 소리로 하시오.


  • instanceof:
    강제 형변환 출력 오류 예방함

왼쪽의 객체가 오른쪽의 객체의 타입으로 만들어졌는지 검토하는 키워드

if(클래스명 instanceof 변경하고자하는 클래스명)

		Animals a3 = new Cat();
		if(a3 instanceof Cat) {
			Cat cat1 = (Cat)a3;
			System.out.println("자식 클래스로 변환됨");
		}else {
			System.out.println("자식 클래스로 강제형변환할 수 없음");
		}
		
		Animals a4 = new Animals();
		if(a4 instanceof Cat) {
			Cat cat1 = (Cat)a4;
			System.out.println("자식 클래스로 변환됨");
		}else {
			System.out.println("자식 클래스로 강제형변환할 수 없음");
		}

profile
내 인생을 망치러 온 나의 구원, 개발

0개의 댓글