생성자,상속,오버로드,오버라이딩,super 복습~
하위 폴더 다단 구성하려면 . 넣으면 됨
확인 방법: Window 클릭 -> Show view -> Navigator
보통 패키지 이름은 당사의 url에 따라 만듦 그래야 다른 회사랑 안 겹침
kr.or.iei.projectname
보통 2개 이상씩은 만들어 사용함
다른 라이브러리 파일의 클래스를 가져오고 싶다면
import 패키지이름.클래스이름;
만약 특정 클래스 말고 모든 클래스를 가져오고 싶다면?
* 별 넣기
import 패키지이름.*;
클래스,변수,메서드의 선언부에 사용되어 부가적인 의미를 부여함.
public:
접근 제한 없음
(default):
같은 패키지 내에서만 접근
가끔 사용
protected:
같은 패키지 내에서, 다른 패키지에선 자식 클래스에서만 접근
가끔 사용
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
-변수에 붙으면 값을 변경할 수 없는 상수가 됨
*거의 변수에 많이 붙고 밑의 두 경우는 잘 안 씀
-메서드에 붙으면 오버라이딩(재정의) 불가
-클래스에 붙으면 상속 불가
여러가지 형태를 가질 수 있는 것.
하나의 참조변수로 여러 타입의 객체를 참조.
부모타입의 참조변수로 자식타입의 객체를 다룰 수 있는 것.
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 클래스에서 동물 클래스를 상속받고 오버라이딩을 소리로 하시오.
왼쪽의 객체가 오른쪽의 객체의 타입으로 만들어졌는지 검토하는 키워드
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("자식 클래스로 강제형변환할 수 없음");
}