본문 바로가기
IT/JAVA

[15일차] JAVA

by GWLEE 2022. 7. 8.

 

2022-07-08

다형성 polymorphism

대입되는 객체에 따라서 메서드를 다르게 동작하도록 구현하는것 
이는 실행 도중 동일한 이름의 다양한 구현체 중에서 각각의 메서드를 선택할 수 있다는 것을 의미한다.

동일한 명령을 내려도 객체의 종류에 따라 다른 결과가 나타나도록 하는 프로그래밍 기술.

 
EX) Animal 클래스의 move
move() 메서드를 자식 클래스에서 수정한다면 각 객체에 적합하게 이용할 수 있다.




클래스의 멤버 = 필드 + 메서드

 

필드  = 멤버 변수 ( = 속성. 상태)

메서드 = 멤버 메서드 ( = 수행할 동작)



부모의 reference변수는 자식의 reference를 볼 수 없다.
실제 들어있는 메소드가 호출 
Car 객체 재사용 

Car라는 생성자에 두가지 타입의 엔진

완전히 분리 시킨다.

 

Engine.java

기본 생성자가 없어서 에러가 났다.

 

 

Car.java

강사님 설명..
필드 다형성 , 매개변수 다형성 잘못 필기...

CarMain.java

클래스 이름 변수 = new 클래스이름();

클래스는 자바의 데이터 타입에서 참조 타입 중 하나이다.

new  연산자를 사용해 객체를 생성하고 반환된 주소를 변수에 대입하면, 변수가 생성된 객체를 참조한다.

 

객체참조변수.멤버

 

nero는 2줄을 1줄로 간략히 쓴 내용

drive로 각각 출력해준다.

 

Engine.java 부모 Class

  • 부모의 생성자를 임의로 호출하지 않으면, 부모 class의 기본 생성자가 자동으로 호출된다.

GasolineEngine.java

Engine을 상속 받고 runEngine()을 override를 해준다.각각의 객체마다 다르게 메서드를 선택.. syso로 찍어주기!엔진 가동은 같은 행동이지만 다르게 반응하도록 해준다.

DiselEngine.java

위와 마찬가지의 설명

 

 

HybridEngine.java

위의 클래스를 선언하고 또 추가로 하이브리드 엔진 클래스로 추가로 설정하였다.

 

나온 결과 화면

 


추상화 abstraction

현실세계의 객체는 수많은 상태가 있고 다양한 동작을 하지만, 이 모든 것을 클래스에 모두 포함하기는 어렵다.
그래서 추상화하는 과정이 필요하다. 추상화는 현실 세계의 객체에서 불필요한 속성을 제거하고 중요한 정보만
클래스로 표현하는 일종의 모델링 기법이다. 따라서 사람마다 추상화하는 기법이 같지 않으므로 각 개발자는 클래스를 다르게 정의할 수 있다.

 

 

추상클래스 Abstract Class

자바는 일종의 미완성 클래스인 추상 클래스(abstract class)를 지원한다. 일반 클래스는 new연산자를 이용해

인스턴스를 생성할 수 있지만, 추상 클래스는 인스턴스를 생성할 수 없고

오직 상속을 통한 자식 클래스를 구현한 후에 인스턴스를 생성할 수 있다.

추상 클래스는 단독으로 사용될 수 없지만, 새로운 클래스를 작성하는데 밑바탕이 될 수 있다.

 

 

 

클래스 키워드 앞에다 abstract 만 붙이면 추상클래스가 된다.

일반 클래스와 다르면 본인객체에  new 연산자를 이용해서 객체를 만들지 못한다. 

자기 자신이 아니라 상속받은 자식 객체로 만들 수 있다.

 

빨간줄 뜬거 확인 이유 : 본인객체라서

 

Phone.java

 

PhoneMain.java

추상 클래스는 자기 이름으로 자신의 객체를 생성할 수 없기 때문에,
추상 클래스를 상속한 자식 클래스의 객체를 생성하여 사용해야 한다.

여기에서는 Phone을 사용할 수 없으므로 자식 객체인 SmartPhone으로 이용해 객체를 만든다.

 

SmartPhone.java

부모 - Phone 클래스

상속받은 자식객체

출력

 


추상 클래스 만들기

메소드가 필요하긴 한데 나를 상속받은 자식들에게 임의로 내용물을 못 정할때
나를 상속받은 자식들이 나 대신 내용물을 정할 때 
추상 메소드가 들어가면 반드시 추상클래스가 되어야한다.

 

부모는 디테일한 부분은 못정한다. 자식들이 다 다르니깐

 

Animal.java

 

Dog.java

 

Bird.java

 

AnimalMain.java

 

" 추상 메소드의 컨셉 "

 

자식 클래스가 모두 동물에 대한 동작이 필요하다. 그런데 구체적인 동물을 표현하다기 보다는 다소 추상적으로 접근한다.

 

각각의 동물을 정의하지 못함

소리 메소드를 이용해서 동물을 정의

동물의 소리를 내는 방법만 제시

실제 어떻게 구체적인 방법으로 소리를 내는지는 느그들이 알아서해~~ 컨셉

객체의 사용방법만 제시한 것 실제적으로 돌아가는 매커니즘을 관여하지 않겠다.

 

 


추상Class 추상 메소드로 바꾸기

혼자했는데 찍히긴 찍혔당..

Phone 이랑 비슷하게 따라함 

 

CarMain.java

DiselEngine.java

Engine.java

 

GasolineEngine.java

HybridEngine.java

 


 

인터페이스(Interface)

제품을 나누어 개발한 후 하나로 합칠 때 미리 규격을 정하지 않으면 나중에 문제가 발생할 수 있다.
이때 필요한 것이 인터페이스로 사전에 정한 약속이나 규격을 의미한다.
인터페이스 덕분에 전자제품의 조율에 관계없이 동일한 전기 콘센트를 사용할 수 있다.

다수의 개발자가 소프트웨어를 개발하려면 각 클래스를 통합할 약속이 필요한데,
자바는 이 약속을 인터페이스로 정의한다.

인터페이스는 클래스간에 상호작용하는 규격으로, 사용방법이 같은 클래스를 만드는 기술이다.

장점 1) 인터페이스만 준수하면 통합에 신경 쓰지 않고 다양한 형태로 새로운 클래스를 개발할 수 있다.
장점 2) 클래스의 다중상속을 지원하지 않지만, 인터페이스로 다중 상속 효과를 간접적으로 얻을 수 있다. 

 

추상메소드 강제로 집어넣게 된다.

 

좀 더 Class 보다 라이트한 ...

Class는 무겁다. 생성기능 다 있어야하기 때문에

 다중상속을 허용 X 제약이 걸리는 상황이 있다.

스레드 같은 경우 예외있다.

다중상속을 필요한경우 -> 인터페이스의 등장

 

추상메소드 오버라이드 해서 쓰는게 인터페이스

 

 

>> Interface의 특징

<인터페이스>

 - 상수와 메소드만 가짐. 필드가 없다. = 데이터 저장 기능이 없다. 필요 없으니 다 빼버림
 - 생성자가 없어서 객체생성이 불가능 = 자체 객체를 만들 필요가 없으니깐
 - 추상메소드(자바 7까지), 디폴트메소드 및 정적메소드(자바 8부터) 
 - 데이터 저장이 불가능하므로 필드선언 불가 
 - 상수필드만 선언가능(public static final 그렇기 때문에 생략가능, 컴파일 과정에서 자동 첨가)
 - 추상메소드는 public abstract 특성을 가짐(생략가능, 컴파일 과정에서 자동 첨가) 
 - default 메소드는 public 특성을 가짐(생략가능, 컴파일 과정에서 자동 첨가)
 - static 메소드는 public 특성을 가짐(생략가능, 컴파일 과정에서 자동 첨가)
 - 인터페이스를 구현하는 클래스를 구현클래스, 실제 메소드를 가지는 객체를 구현객체
 - 인터페이스를 구현(implements) 한 클래스에서 인터페이스의 추상메소드를 구현하지 않으면 
   해당 클래스는 추상클래스가 됨
   그렇기 때문에 선언부에 abstract 키워드를 추가해야 함
   
   클래스 implements 클래스 이름 
   자식 클래스가 아니라 구현클래스라고 한다.
   
   인터페이스나 추상클래스를 구현한 클래스를 문맥상 추론할 수 있으면 그냥 구현 클래스라고 부르며,
   또한 인터페이스나 추상클래스 이름이 A라면 그 구현 클래스를 A 구현 클래스라고 부른다.
   그리고 구현 클래스로 생성한 객체를 그냥 구현 클래스라고 부른다.

 

인터페이스도 extends 키워드를 사용해 자식 인터페이스를 정의할 수 있다.

인터페이스로 자식 클래스를 정의하려면 추상 메서드를 구현해야하므로, implements 키워드를 사용한다.

 

인터페이스가 클래스의 자식이 될 수 없는 것을 제외한 모든 상속 관계가 클래스의 인터페이스 사이에 가능하다.

 

 

 

// 인터페이스를 상속하려면 

interface 자식인터페이스 extends 부모인터페이스 {

}

// 인터페이스르 구현하려면 implements 키워드를 사용한다.
class 자식클래스 implements 부모인터페이스 {
}

 

 

 

RemoteControl.java

상수필드만 선언가능

 

Television.java

반드시 public 이어야한다. 자식은 부모보다 접근 범위가 좁으면 안되기 때문이다.

부모인 인터페이스의 메서드는 모두 public이다.

 

 

Audio.java

 

RemoteMain.java

객체 동작

 


 

익명 클래스 annoymous class
한번 사용하는 클래스라면 굳이 이름을 붙일 필요가 없는데,

이렇게 이름이 없는 클래스를 익명클래스

 

시스템 형상관리

시스템 유지보수 프로그램 계속 수정 

그럴 때를 대비해서 클래스 한 페이지 마다 용도는 뭐다 변경이력

구현 객체를 버릴 수 없을까...

이름이 없는 Anonymous 익명 익명 구현 객체를 만드는 방법 일회성..

 

 

 

이클립스 방법 

 

RemoteControl 치고 ctrl + space = 자동생성

사실 자식 객체도 익명으로 만들 수 있다.

 

인터페이스에 추가  

 

RemoteControl.java

 

Television.java

RemoteMain.java 

 

Audio.java

 

 


[Engine을 다시 인터페이스로 생성하고 익명 클래스 사용해보기 실습]

 

Engine 인터페이스 생성 

Gasoline.java class 만들기

HybirdEngine.java class 만들기

 

Car.java 그대로 가져오고

CarMain에서 익명 클래스 이용해서 사용하기 (일회성)

익명 클래스 단독 정의할 수 없고, 클래스는 상속하거나 인터페이스를 구현해서 작성한다.

 

엔진은 인터페이스로 작성한다.

Car - 익명클래스

엔진

하이브리드 가솔린 

 

 

 

디젤 대신 익명클래스 사용

인터페이스를 어디에 쓸까?

 

데이터베이스를 연결하는 로직

소스코드 드라이브 클래스를 바꿔주면 손색이 없다. 

댓글