관리 메뉴

거니의 velog

230727 자바 강의 본문

대덕인재개발원_Java

230727 자바 강의

Unlimited00 2023. 7. 29. 15:37

[Phone.java]

package ddit.chap07.sec05;

public abstract class Phone {

	String phoneNumber;

	Phone() {}
	
	Phone(String phoneNumber) {
		this.phoneNumber = phoneNumber;
	}
	
	public void call() {
		System.out.println("통화하다.");
	}
	
	public abstract void turnOn(); // 켜는 방법이 여러가지가 있으므로 일률적으로 적용할 수 없다.
	
}

[SmartPhone.java]

package ddit.chap07.sec05;

public abstract class SmartPhone extends Phone {

	String model;
	
	SmartPhone() {}
	
	SmartPhone(String phoneNumber, String model) {
		super(phoneNumber);
		this.model = model;
	}
	
//	@Override
//	public void turnOn() {
//		
//	}
	
	public void game() {
		System.out.println("게임기능이 제공됨.");
	}

}

class IPhone extends SmartPhone {
	
	IPhone() {}
	
	IPhone(String phoneNumber, String model) {
		super(phoneNumber, model);
	}
	
	@Override
	public void turnOn() {
		System.out.println("우측 버튼 사용.");
	}
	
}

[PhoneExample.java]

package ddit.chap07.sec05;

public class PhoneExample {

	public static void main(String[] args) {
		
		// 추상 클래스가 객체로 구현이 안되는 이유? 미완성 메서드가 있는 상태이므로.
//		SmartPhone smartPhone = new SmartPhone("010-1234-5678", "iphone-14");
		
		// 객체가 될 수 있는 것은 추상 메서드를 다 재정의 한 객체만 가능.
		// Phone 객체가 만들어지고, 멤버변수 1개 가짐.
		// SmartPhone이라는 객체 만들어지고, 부모 것을 상속 받아 멤버변수 2개 가짐.
		// 아이폰 클래스가 객체가 되면 힙 메모리에 올라감. 부모 것을 상속받아 멤버변수 2개 가짐.
		// 이렇게 순서대로 실행되기 위해 모두가 생성자 메서드를 가지고 있어 체인이 일어남.
//		SmartPhone smartPhone = new IPhone("010-1234-5678", "iphone-14"); // 업캐스트.
//		smartPhone.call();
//		smartPhone.turnOn();
//		smartPhone.game();
		
		Phone phone = new IPhone("010-9876-8521", "iphone-12"); // 업캐스트.
		phone.call(); // 자기 자신이 가지고 있는 메서드.
		phone.turnOn(); // 손자 객체인 IPhone에서 재정의된 메서드가 호출됨. 다형성.
		// 다형성 쓰는 이유? 부모 클래스에서만 가진 멤버변수나 메서드만 사용하겠다. 
		// 즉, 관리자가 자기가 만든 추상 메소드만 써서, 적어도 이 정도의 메서드는 반드시 구현해야 함을 알림. 최소한의 가이드라인 제시.
		
	}

}


[인터페이스]

열거형, 인터페이스, 배열이 비슷한 형태.
인터페이스가 형제, 열거형은 삼촌, 배열은 사촌. 조금씩 특징들이 멀어진다.

interface

클래스가 아니고 그냥 인터페이스.

자바 클래스가 가진 제한을 적용받지 않는다.

인터페이스는 사이에는 다중상속 가능.

추상 메서드와 정적 상수만 존재한다.
자동으로 public static final 이 붙음.
자동으로 public abstract가 붙음.

완벽하게 미완성이므로 스스로 객체가 될 수 없다.
객체가 생성되기 위해서 class로 구현(implements) 되어야 함.

하위 클래스의 생성 기준(가이드라인)을 제공하기 위해서 사용.

다형성 적용을 받는다(업캐스팅 가능).

서로 관계 없는 클래스들을 인터페이스를 통해 연결.
개발자는 기능을 제공하되 코드는 숨긴다. 사용자는 개발자 코드는 모르나 사용은 가능. 보안의 목적으로 사용.


[Phone.java]

package ddit.chap07.sec06;

public interface Phone {

	// 키패드 정의
	int PHONE_NUM_1 = 1; // 정적 상수(public static final)로 자동 변환됨.
	public static final int PHONE_NUM_2 = 2;
	int PHONE_NUM_3 = 3;
	int PHONE_NUM_4 = 4;
	int PHONE_NUM_5 = 5;
	int PHONE_NUM_6 = 6;
	int PHONE_NUM_7 = 7;
	int PHONE_NUM_8 = 8;
	int PHONE_NUM_9 = 9;
	int PHONE_NUM_0 = 0;
	
	public void call(); // 추상 메서드(public abstract)로 자동 변환됨.
	void turnOn();
	abstract void turnOff();
	
}

[SmartPhone.java]

package ddit.chap07.sec06;

public class SmartPhone extends Computer implements Phone, Repair { // 다중 상속과 같은 의미. 인터페이스는 두개 이상 동시에 다중 구현 가능.

	boolean power;
	
	@Override
	public void call() {
		String number1 = String.valueOf(PHONE_NUM_1);
		String number2 = String.valueOf(PHONE_NUM_2);
		
		System.out.println("간첩신고는 " + number1 + number1 + number2 + " 입니다.");
	}

	@Override
	public void turnOn() {
		if(power!=true) power = !power; // 토글 기능.
	}

	@Override
	public void turnOff() {
		if(power) power = !power; // 토글 기능.
	}

}

[interfaceExample.java]

package ddit.chap07.sec06;

public class interfaceExample {

	public static void main(String[] args) {
		
		SmartPhone smartPhone = new SmartPhone();
		smartPhone.call(); // 간첩신고는 112 입니다.
		
		Phone phone = new SmartPhone(); // 업캐스팅 가능.
		phone.call(); // 자식 클래스 객체가 재정의한 메서드를 가져와 쓰는 다형성 지원.
		
	}

}

[Computer.java]

package ddit.chap07.sec06;

public class Computer {

	void calculator () {
		System.out.println("컴퓨팅 가능.");
	}
	
}

[Repair.java]

package ddit.chap07.sec06;

public interface Repair {

}


[I.java]

package ddit.chap07.sec07;

class A {
//	public void methodA(B b) {
//		b.methodB();
//	}
	
	public void methodA(I i) {
		i.methodB();
	}
}

class B implements I {
	@Override
	public void methodB() {
		System.out.println("B클래스의 methodB()");
	}
}

class C implements I {
	@Override
	public void methodB() {
		System.out.println("C클래스의 methodB()");
	}
}

public interface I { // 전혀 상관 없는 두 클래스를 살짝 묶어주는 역할을 함.
	void methodB();
}

[InterfaceExample2.java]

package ddit.chap07.sec07;

public class InterfaceExample2 {

	public static void main(String[] args) {
		
		A a = new A();
		a.methodA(new B()); // B클래스의 methodB()
		a.methodA(new C()); // C클래스의 methodB(), 인터페이스로 업캐스팅[methodA(I i)]
		
	}

}

 

'대덕인재개발원_Java' 카테고리의 다른 글

230729 자바 과제 _ 클래스 다이어그램 구현  (0) 2023.07.29
230728 자바 강의  (0) 2023.07.29
230726 자바 강의  (0) 2023.07.26
230725 자바 강의  (0) 2023.07.25
230724 자바 강의  (0) 2023.07.24