국비과정/JAVA

20230621 _[14일차]_01. 인터페이스

phyho 2023. 6. 22. 20:34

[ 인터페이스 ]  _ 자식클래스명 + 상속(extends to (부모클래스명)) + 인터페이스 (implements (인터페이스명)) 

 

abstract class Hero

> interface Do _ attack() , eat(), sleep()

> interface Fly _ fly()

 

> class Ironman _ Do , Fly

> class Hulk _ Do 

> class Spiderman _ Do , Fly

 

인터페이스로 공통된 기능과, 개별적으로 필요한 기능을 구분해서 넣어줌

extends ~  상속

implements  ~  구현

package interf;
// 인터페이스 만들어보기
// 2203-06-21 프로그래밍언어 활용
// 다중 상속 --- 상속... 단일 상속
// 인터페이스는 추상 메소드만 들어가요


abstract class Hero{	// 추상 클래스 : 인스턴스 X, 상속용도로만 존재
	String name;
	// 추상 메소드 : 상속 받는 자식들은 강제로 구현

}

// 인터페이스 : 각종 기능 : 추상 메소드들이 인터페이스 안에 들어갑니다.
interface Do{
	// 상수도 가능
	static final int NUMBER = 150;
	public abstract void attack(); 	// 추상 메소드만 오니까
	public abstract void eat();
	public abstract void sleep();
}

interface Fly {
	public abstract void fly();	// 날아다니는 기능을 다른 인터페이스로 제작했습니다.
}


class Ironman extends Hero implements Do, Fly {	// 다중상속
	// Hero상속만 받았습니다 + 인터페이스(구현)
	@Override
	public void attack() {}
	
	@Override
	public void eat() {}

	@Override
	public void sleep() {}

	@Override
	public void fly() {}	// Hero상속만 받았습니다 + 인터페이스
}

class Hulk extends Hero implements Do {

	@Override
	public void attack() {}

	@Override
	public void eat() {}

	@Override
	public void sleep() {}
}

class Spiderman extends Hero implements Do, Fly {

	@Override
	public void attack() {}

	@Override
	public void eat() {}

	@Override
	public void sleep() {}

	@Override
	public void fly() {}
}


public class Inter01 {
	public static void main(String[] args) {
		
		Ironman ironman = new Ironman();
		ironman.fly();
		
		Hulk hulk = new Hulk();
//		hulk.fly();		실행안됨. fly메소드 없음
		
		Spiderman spiderman = new Spiderman();
		spiderman.fly();
		
	
	}

}

** 주의 **

인터페이스 내에서 선언된 메서드에 파라미터가 존재하면

내려받은 자식클래스 내 같은 메서드에서 파라미터 존재해야함! (파라미터 유무 맞춰주기)

(달라지면 자식만 가지고 있는 메서드인 오버로드가 됨)


[ 인터페이스 ]

인터페이스는 왜 생겼을까?

어떻게 써야 할까?

특징은 무엇인가?

인터페이스란?

 

추상 클래스 : 추상 메소드가 하나라도 있거나 class 앞에 abstract를 붙인 것

인스턴스 생성을 위해 존재하는 것이 아니라

상속에서 부모 용도로 존재하기 위해서 만들어 준 것.

 

추상 메소드 : 바디({})가 없는 메소드 = 구현부가 없습니다.

리턴 타입 앞에 abstract를 붙여줍니다.

public abstract void print();

자식 클래스에서 오버라이드 해야 합니다.

 

인터페이스 : 상수 + 추상 메소드

다중 상속이 가능합니다.

외부와 연결하는 통로역할을 합니다.


[ 인터페이스 생성 ]

 

package interf;


public class Inter02 {
	public static void main(String[] args) {
		
// 	인터페이스 생성하고 자식클래스 생성 후 여기에서 실행만 할 예정

	}

}

클래스 파일 만들때처럼 New -> Interface 생성 클릭.

 

인터페이스 생성

 

파일에 I 모양 아이콘

( 인터페이스 RemoteControl 생성 )

package interf;	

public interface RemoteControl {	// class처럼 생성됨
	// 상수
	public int MAX_VOLUME = 10;
	public int MIN_VOLUME = 0;
	
	// 추상 메소드
	public void turnOn();
	public void turnOff();
	public void setVolume(int volum);	// int 파라미터 받음
	
	
}

( 클래스 Television 생성 & RemoteControl 인터페이스 연결 )

package jun21;

public class Television implements RemoteControl {	// 인터페이스와 연결
// Add unimplemented methods 선택해주면 메소드 자동 오버라이드

	private int vol;

	@Override
	public void turnON() {
		System.out.println("TV를 켭니다.");
	}

	@Override
	public void turnOff() {
		System.out.println("TV를 끕니다.");
	}

	@Override
	public void setVolume(int volum) {

		if(vol > RemoteControl.MAX_VOLUME) {
			this.vol = RemoteControl.MAX_VOLUME;
		} else {
			this.vol = volum;
		}
		System.out.println("현재볼륨 : " + this.vol);
		
		
	}
}

( 클래스 Audil 생성 & RemoteControl 인터페이스 연결 )

package jun21;

public class Audio implements RemoteControl {

	int vol;
	
	@Override
	public void turnON() {
		System.out.println("오디오를 켭니다.");
	}

	@Override
	public void turnOff() {
		System.out.println("오디오를 끕니다.");
	}

	@Override
	public void setVolume(int volume) {
		if(vol > RemoteControl.MAX_VOLUME) {
			this.vol = RemoteControl.MAX_VOLUME;
			
		} else if (vol < RemoteControl.MIN_VOLUME){
			this.vol = RemoteControl.MIN_VOLUME;
			
		} else {
			this.vol = volume;
		}
		System.out.println("현재 Audio 볼륨 : " + this.vol);

		
		
	}

}

package jun21;

public class inter02 {
	public static void main(String[] args) {
		
		Television tv = new Television(); 
		Audio audio = new Audio(); 
		
		tv.turnOn();		// TV를 켭니다.
		audio.turnOn();		// 오디오를 켭니다.
		
		tv.setVolume(20);	// 현재 TV 볼륨 : 10
		tv.setVolume(10);	// 현재 TV 볼륨 : 8
		audio.setVolume(5);	// 현재 Audio 볼륨 : 5
		audio.setVolume(-1);	// 현재 Audio 볼륨 : 0

		
		RemoteControl rcT = new Audio();
		RemoteControl rcA = new Television();
		
		rcT.turnOff();	// TV를 끕니다.
		rcA.turnOff();	// 오디오를 끕니다.
		
		
	}	
}

Television 과 Audio 가 RemoteControl(인터페이스) 아래에 있기 때문에 

RemoteControl rcT = new Audio();
RemoteControl rcA = new Television();

와 같이 객체생성 가능. (상속관계)


[ project 파일 zip파일로 추출 ]

 

 

원하는 project 파일 선택후 Browse.. 에서 원하는 위치에 저장. => zip파일로 저장

 

반대의 경우는 import _ 캡쳐..어디있지..????


[ jar파일로 exe 파일만드는 방법 how to make exe file to jar file ]

https://aljjabaegi.tistory.com/446

 

[launch4j] jar파일로 exe 파일만드는 방법 how to make exe file to jar file

[launch4j] jar파일로 exe 파일만드는 방법 how to make exe file to jar file jar 파일로 배포를 하다 보면은 batch 파일 생성시에 몇가지 문제점이 발생합니다. 예를 들어 window기반에서 실행은 경로로 하는 것

aljjabaegi.tistory.com


[ 관계형 데이터베이스란? ]

https://cloud.google.com/learn/what-is-a-relational-database?hl=ko 

 

관계형 데이터베이스(RDBMS)란 무엇인가요?  |  Google Cloud

관계형 데이터베이스의 작동 방식, 관계형 데이터를 사용하여 조직 데이터를 저장하는 경우의 이점, 비관계형 데이터베이스의 비교에 대해 알아봅니다.

cloud.google.com


[ 클래스간 관계비교 ] 

package isHas;

// is a
// has a

class Human{
	String name;
	int age;
	int sex;
}

class Student extends Human {
	int number;
	String major;
}
// 학생은 사람입니다. (상속관계)



class Gun {
	String name;
	int shot;
}

class Police{
	Gun gun;	// Gun 클래스를 가져와 Police 클래스 내부에서 객체생성.
}			// 내부 구성요소로 사용.
// 경찰이 총을 가지고 있습니다.


public class IsHas {
	public static void main(String[] args) {

		
	}

}

[ 객체지향 설계원칙 ] _ SOLID

 

https://dev-coco.tistory.com/142

 

[Java] 객체지향 설계 원칙 SOLID 알아보기

객체지향 프로그래밍 설계시 좋은 객체지향 설계를 위한 SOLID 라고 불리는 5가지 원칙이 있다. SOLID 원칙은 소프트웨어를 설계함에 있어 이해하기 쉽고, 유연하며, 유지보수 및 확장이 편하다는

dev-coco.tistory.com