4주차 시작
자바 개념의 막바지에 다르고 있다. 학부생때 인터페이스에 대해 제대로 배우지 않았다. 시험용으로 책에서만 읽고 대충 추상화를 위해, 코드 재사용을 하기위해 쓰는 것만 알았다.
강사님이 인터페이스에 대해 강조하신다. 자바에서 되게 중요한 것같다. 인터페이스에대해 따로 물어본다고도 하신다. 인터페이스에 대해 자세히알아보는 좋은 시간이었다.
배운점
인텔리제이 많이 사용해서 안늘고 필요한거 찾아서 써야함!!
인터페이스 의 개념
추상 클래스와 마찬가지로 인터페이스는 그 자체의 객체를 만들 수 없음
추상 클래스는 추상 메서드와 일반 메서드를 포함할 수 있지만 인터페이스는 추상 메서드만 포함할 수 있음
인터페이스 사용 이유
완전한 추상화를 구현할 수 있음
다중 상속을 구현할 수 있음
느슨한 결합 관계를 형성할 수 있음
추상화,다형성 : 유지보수가 쉽다. 닌텐도 하나사면 마리오, 젤다 다 할수있다.
다중상속예시: 손움직이는거 말하면서, 서있으면서 등등 같이 할 수 있다.
느슨한결합: 리모콘으로 티비 , 컴퓨터, 오디오 주파수만달리해서 조절할 수있다.
. 이점이 뭐냐. 위에 3개 . 단어 꼭 나와야함
하나의 리모콘으로 여러개 객체 제어할 수 있다. -> 느슨한 결합, 리모턴 신호를 티비, 뭐 다른거에 맞추면 됨, 그 기능을 안쓰면 끊으면됨
인터페이스.
인터페이스 = 다형성
여러가지 타입(형)을 가질 수 있는 성질
한가지 타입의 참조변수에 여러가지 클래스의 인스턴스를 할당하는 것
유지보수의 편의성을 위해 사용한다.
기존 코드의 로직이 변경될 때, 코드 상에서 변경되는 부분을 최소화하기 위해 한 단계 추상화하는 것.
다형성 -> 제공하기 위해 표현하기위한 기술로서 인터페이스, 추상클래스 이용한다.
인터페이스는 그 자체로 객체를 만들 수 없다. -> 기준을 만드는 설계도용도다.
데이터를 담을 필요가 없다.
기능에대한 기준, 스펙 시그니처 인터페이스
객체에 대한 데이터는 클래스에서 정함
나를 상속반드시 이건 지켜줘. 그래야 family로 엮일 수 있어
여러가지 기능이 다중상속되어있다. 하나의 객체에 대해서
손을 들어서 뭔가 잡으려고하고 여러분을 보고있고 말하면서 .. 다양한 동작 수행할 수 있다.
인터페이스를 통한 다중상속이다.
선언
인터페이스는 interface 키워드를 사용하여 선언
인터페이스 내부에 있는 모든 메서드는 추상 메서드, 즉 본문이 없는 메서드임접근
제한자로는 클래스와 마찬가지로 같은 패키지 내에서만 사용 가능한 default,
패키지와 상관없이 사용하는 public을 붙일 수 있음
원래 public 상수, public 추상 메소드만 됐었는데 추가됨
interface 상수
//상수필드
int MAX_VOLUME = 30;
//상수: public static final 굳이 이래 안해도됨 자동으로 이렇게 컴파일 과정에서 붙음
public static final int MIN_VOLUME = 0;
// 상수는 대문자로하는게 원칙
// 언더바 사용하셈
인터페이스는 자동 상수! 인터페이스.상수로 접근가능
interface 변수에 new 객체
느슨한 결합
RemoteControler remoteControler; //변수 선언
remoteControler = new TV();
// 객체를 생성하여 인터페이스타입 변수에 주입했다.(Injection)
remoteControler.turnOn(); // TV에대한 구현메소드 실행
remoteControler.turnOff(); // TV
라디오 스마트폰 티비 다 넣을 수있다.
이 인터페이스 변수로 추상메소드를 호출할 수 있다.
어떤 구현객체가 구현됐는지에 따라서 실행 메소드가 다르다.
내부에 동작구조 히든시킨채 내부안에서만 동작하게끔 함.
외부에서는 모름, turn off를 누르면 꺼지는 구나! , 내부동작은 알 수 없음
여러 프린터 회사 하나의 드라이버로 가능한 것과 마찬가지
이게 느슨한결합
default메소드 재정의 해야할 경우: 하위에서는 defalut 제거하고 public 으로 바꿔줘야함, 오버라이딩 할려면!! ,, 디폴트 인터페이스에서만 사용
인터페이스에 선언
1. 상수필드(public static final)
2. 추상메소드(abstract 리턴 타입 메소드명();)
ㄴ구현객체에서 오버라이딩 해줘야한다.
3. default 메소드 (default 리턴타입 메소드명(){})==> 구현객체에서 재정의 가능
4. 정적메소드 (static 리턴타입 메소드명())
ㄴ구현객체가 없어도 인터페이스 호출만으로 사용할 수 있다.
[public | private] static 리턴타입 메소드명(p1,p2..){}
===================================================public
5. 인터페이스에서 외부접근 막고 싶을때 private 메소드 설계를 한다.
- private 메소드 (용도: 디폴트와 정적메소드의 중복코드를 줄이기 위해)
- private static 메소드
interface 정적메소드
static void changeBattery(){ // 자동 public
System.out.println("리모컨 건전지를 교환해야 합니다.");
}
main
RemoteControler.changeBattery(); // 직접호출
private하지않는이상 자동 public
유일하게 직접호출 가능.
interface private 메소드
Service interface
private은 내부에서 사용하기 위해서 선언.
default 밖에서 접근가능.
static 직접 접근가능.
public interface Service {
//default 메소드
default void defaultMethod1() {
System.out.println("defalutMethod1()의 코드");
defaultCommon(); // 부를수있다.
}
default void defaultMethod2() {
System.out.println("defalutMethod2()의 코드");
defaultCommon();
}
//private 메소드
private void defaultCommon() {
System.out.println("defaultMethod의 중복코드 1");
System.out.println("defaultMethod의 중복코드 2");
}
//정적 메소드
static void staticMethod1() {
System.out.println("staticMethod1의 종속코드 1");
staticCommon(); // static 은 static 끼리
}
static void staticMethod2() {
System.out.println("staticMethod1의 종속코드 2");
staticCommon();
}
//private static 메소드 !!
private static void staticCommon() {
System.out.println("staticMethod 중복 코드 3");
System.out.println("staticMethod 중복 코드 4");
//재사용할 수있다.
}
}
ServiceImpl class
Service를 implements받았다.
public class ServiceImpl implements Service{
}
Main class
Service service = new ServiceImpl();
// 인터페이스 변수 선언하고 구현객체 대입
service.defaultMethod1(); // 객체로 접근.
System.out.println();
service.defaultMethod2(); // 객체로 접근
System.out.println();
Service.staticMethod1(); // 직접 접근
System.out.println();
Service.staticMethod2();
private은 메소드 안에서 사용되고 , 실행됨
껍데기만 보고 내부를 알 수 없다 !!!!
다중 인터페이스
구현 객체는 여러 개의 인터페이스를 통해 구현 객체를 사용할 수 있음
구현 클래스는 인터페이스 A와 인터페이스 B를 implements 뒤에 쉼표로 구분해서 작성해, 모든 인터페이스가 가진 추상 메소드를 재정의
자동 타입 변환
인터페이스 구현객체 대입하면
강제 타입 변환
자동으로 타입 변환이 일어나는 것
부모 클래스가 인터페이스를 구현하고 있다면
자식 클래스도 인터페이스 타입으로 자동 타입 변환될 수 있음
A a;
//변수에 구현 객체 대입
a = b; // A <== B 자동타입변환(promotion)
B b1 = (B)a; // A ===> B 캐스팅(casting)
a = c; // A <== C 자동타입변환
C c1 = (C)a;
a = d;
D d1 = (D)a;
a = e; // A <=== E 자동타입변환
E e1 = (E) a;
AnimalTest 실습
_I. 다음은 Dog 클래스와 Chicken 클래스의 구현에 필요한 요구사항들입니다.
A. 이동거리는 run 함수가 호출될 때마다 누적되어 distance 변수에 저장되고,
getDistance() 함수가 호출 될 때 저장된 distance 값을 반환합니다.
B. fly 함수는 현재의 속도 값이 2배가 되도록 하는 기능을 수행합니다.
C. 또한, run 함수가 호출될 때 Chicken 객체는 입력받은 시간만큼 계속 이동하지만, Dog
객체는 입력인자로 넘겨받은 시간의 1/2 시간 동안만을 이동합니다. (즉, 속도가 10인
Dog object 가 1시간 동안 이동한 거리는 5가 되며, 속도가 3인 Chicken object가 1시간
동안 이동한 거리는 3이 됩니다.)
상기 설명을 참고하여 아래에 제시된 클래스 및 인터페이스를 작성해 주십시오.
A. Animal 추상 클래스를 작성하십시오.
B. Cheatable 인터페이스를 작성하십시오.
C. Animal 추상클래스를 상속받은 Dog 클래스를 작성하십시오.
D. Animal 추상클래스를 상속받고 Cheatable 인터페이스를 구현한 Chicken 클래스를 작성하
십시오.
(참고: distance의 계산 시 이동거리=속도X시간 이므로 distance = speed X hours 등식을 사
용하여 계산하면 됩니다.)
I. 아래에 제시된 시나리오와 출력결과를 참조하여, AnimalTest 클래스를 완성하십시오. (10
점)
A. 템플릿 코드에 선언된 dog 변수에 속도가 8인 Dog Object를 하나 생성하여 저장합니다.
B. 템플릿 코드에 선언된 chicken 변수에 속도가 3인 Chicken Object를 하나 생성하여 저장
합니다.
C. 템플릿 코드에 선언된 cheatableChicken 변수에 속도가 5인 Chicken Object를 하나 생성
하여 저장합니다.
D. 위에서 생성한 Chicken Object가 Cheatable 하다면 fly 함수를 호출합니다. 단,
Cheatable 여부의 판단을 위해서는 반드시 생성된 Object의 타입 검사를 수행해야 합니
다.
E. 3시간 동안 매 시간마다 각 객체들의 이동거리 정보가 아래와 같이 출력되도록 합니다._
Animal
public abstract class Animal {
int speed;
double distance=0;
Animal(int speed){
this.speed = speed;
}
abstract void run(int hour);
double getDistance(){
return distance;
}
}
AnimalTest
public class AnimalTest {
public static void main(String[] args) {
Dog dog = new Dog(8);
Chicken chicken = new Chicken(3);
Chicken cheatableChicken = new Chicken(5);
if(cheatableChicken instanceof Chicken){
cheatableChicken.fly();
}
/////////cheatableChiken , Cheatable로 생성한 경우////////////
// Cheatable (인터페이스)에 객체 생성
Cheatable cheatableChicken;
cheatableChicken=new Chicken(5);
if(cheatableChicken instanceof Cheatable ){
// Cheatable인지 검사
cheatableChicken.fly();
}
.
.
((Chicken) cheatableChicken).run(1);
////ㄴ캐스팅해서 사용해야함
/////////////////////////////////////////////////////////
for (int i = 0; i < 3; i++) {
System.out.println((i+1)+"시간 후");
dog.run(1);
System.out.println("개의 이동거리 ="+dog.getDistance());
chicken.run(1);
System.out.println("닭의 이동거리 ="+chicken.getDistance());
cheatableChicken.run(1);
System.out.println("날으는 닭의 이동거리="+cheatableChicken.getDistance());
}
}
}
Cheatable interface
public interface Cheatable {
void fly();
}
Chicken
public class Chicken extends Animal implements Cheatable{
Chicken (int speed){
super(speed);
}
@Override
void run(int hour) {
super.distance += hour*super.speed;
}
@Override
public void fly() {
super.speed *= 2;
}
}
Dog
public class Dog extends Animal{
Dog(int speed){
super(speed);
}
@Override
void run(int hour) {
super.distance += (hour/2.0)*super.speed;
}
}
필드의 다형성, 매개변수의 다형성
매개변수 타입을 인터페이스로 선언하면 메소드 호출 시 다양한 구현 객체를 대입할 수 있음
Vehicle 는 interface임
main
Driver driver = new Driver();
Bus bus = new Bus();
Taxi taxi = new Taxi();
driver.drive(bus); // 버스객체를 넣음 자동 타입변환 , Vehicle vehicle = bus;
//자동타입변환(promotion) --> 오버라이딩메소드호출 --> 다형성
driver.drive(taxi); // 택시객체를 넣음
Driver class
public class Driver{
void drive(Vehicle v){
//구현 객체가 대입될 수 있도록 매개변수를 인터페이스 타입으로 선언
v.run(); //인터페이스 메소드 호출
}
}
인터페이스 매개변수를 갖는 메소드
main
ride(taxi);
ride(bus);
ride 메소드
public static void ride(Vehicle vehicle){
if(vehicle instanceof Bus){ // instanceof로 확인
Bus bus = (Bus)vehicle; // 캐스팅해서 사용
bus.checkFare();
}
else if (vehicle instanceof Bus bus) bus.checkFare();
vehicle.run();
}
}
회고
인터페이스는 다향성을 구현하기위한 도구이다. 한 타입으로 여러 타입을 가질 수 있으므로 코드 유지 보수가 쉽다. 닌텐도 기계하나 사면 마리오, 젤다 등 다양한 게임할 수 있다.
인터페이스는 다중상속이 가능하다. 여기저기서 기능 동시에 할 수있다. 마치 말하면서 손동작을하고 눈으로 보고 다리로 서있는다.
인터페이스는 느슨한 결합이다. 인터페이스 변수에 그 하위 클래스 객체들을 넣을 수있다. 리모콘 주파수를 맞추면 티비, 오디오, 컴퓨터 다 조절이 가능하다. 프린터 드라이버를 한개만 설치해도 다른것도 사용가능 하듯이
인터페이스는 설계도용도기때문에 그자체로 객체를 만들 수 없고 데이터를 담을 필요가 없다.
라고 외웠따.
중요한 개념을 하나하나 실습해보며 경우를 보니 이해가 잘됐고 재밌었다. 아직 인터페이스를 자유자재로 쓸 줄 모르지만 잘 할 줄 알면 정말 유용할 것 같다
'신세게 - Java 공부' 카테고리의 다른 글
4주차 배운점 느낀점- 예외처리, 예외, try, catch, finally, throws, throw, 사용자정의예외 (10) | 2024.10.03 |
---|---|
4주차 배운점 느낀점 - ISP 실습, 발표 연습, git 사용법 (8) | 2024.10.03 |
3주차 배운점 느낀점 - 클래스 다이어그램, 클래스간의 관계 (9) | 2024.10.03 |
3주차 배운점 느낀점 - Usecase, 다이어그램, 엑터, 관계, 추상화, 인터페이스 (16) | 2024.10.03 |
3주차 배운점, 느낀점 - 도메인, 모델, 요구사항 (10) | 2024.10.03 |