super(), super, 추상클래스, 추상메소드, 템플릿 클래스, 템플릿 패턴

2019. 3. 8. 19:26JAVA

------------------부모생성자 super()--------------------------


생성자를 만들때 상속받은 메소드라면 생성자를 만들때 기본적으로

내가 직접 안쓰더라도 생성자 맨위에 super();가 들어가있다.

super();는 무조건 맨위에 있어야한다.


부모 - Car 자식 - Genesis


public Car(){

//super(); // 생략가능

System.out.println("Car 생성자가 실행됨");

}


--------------------------------이렇게 부모생성자 하고


public Genesis (){

super(); // 모든 생성자 첫줄에는 super가 들어가있다.

System.out.println("Genesis 생성자가 실행됨");

}

------------------------------하게되면

---------- 실행 ----------


Car 생성자가 실행됨

Genesis 생성자가 실행됨

-------------------------------된다.





그리고 기본생성자가 아닌 생성자도 가능한데. 부모의 필드가 name, speed가있고 자식이 price만있을때



public Car(String name, int speed){

//super(); // 생략가능

this.name = name;

this.speed = speed;

System.out.println("Car(String, int) 생성자 실행됨");

}

---------------------------------------위는 부모 아래는 자식

public Genesis(String name, int speed, int price){

super(name, speed);

this.price = price;

}

------------------------------------------실행결과는 아래와 같다.

---------- 실행 ----------

Car(String, int) 생성자 실행됨

g90

200

100000000





-----------------------------부모메소드 super-------------------------------


this가 자기 자신의 주소값이라면 super는 부모의 주소값을 가지고있다.

상속된 클래스가 아니라면 Object객체 주소를 가지고 있다.

super()와 이름이 비슷하지만 super와 다른것이다.


보통은 같은이름(재정의된)의 것을 사용할때 사용한다.


---------------부모 메소드---------------------------

public void carInfo(){

System.out.println("###차량 정보##");

System.out.println("모델명 : "+name);

System.out.println("최고속도 : "+speed);




----------------자식 메소드 재정의(오버로딩)--------


public void carInfo (){

System.out.println("###차량 정보##");

System.out.println("모델명 : "+getName);

System.out.println("최고속도 : "+getSpeed);

System.out.println("가격 : "+price);

}


================위처럼 해도 되지만 super를 이용하면 아래와같이 된다.==============



public void carInfo (){

super.carInfo();

System.out.println("가격 : "+price);

}


------------------샐행 페이지-----------------------

car1.carInfo();



------------------결과-----------------------------

---------- 실행 ----------


###차량 정보##

모델명 : g90

최고속도 : 200

가격 : 100000000








---------------------------------------------추상 클래스, 메소드--------------------------

추상화 - 실질적인 구현내용이 없는것

추상화의 대상은 여러 클래스가 가지고 있는 공통 특징이다.

그럴경우 부모에 추상메소드를 만들때 구현부{} 가없이 만든다.

예시 ) public abstract void print() 


실질적인 구현은 각각 자식 클래스에서 일어난다.




사용목적

1. 스펙을 지정하여 메소드의 이름을 통일시키기위해





추상클래스와 추상메소드


추상클래스

- 추상메소드를 지정할려면 추상클래스가 되야한다.

- 구현부가 없는 추상메소드를 가질 수 있는 클래스다.

- 클래스 정의할 때 abstract 키워드를 붙여야 한다.

public abstract class Printer {

.....

}

- new 키워드를 사용해서 객체생성할 수 없다.



추상메소드

- 구현부가 없는 메소드다.

- 추상클래스 안에만 정의할 수 있다.

- 메소드를 정의할 때 abstract 키워드를 붙여야 한다.

public abstract void print(); <--- 구현부가 없다.

public abstract void print(){} <--- 수행문이 없다.(추상메소드 아님 에러남)

public void prin(){} <--- 일반적인 메소드는 구현메소드라고 한다.


구현클래스

- 일반적인 클래스다.

- 추상메소드를 절대로 가질 수 없다.

* 만약 부모클래스(추상클래스인 부모클래스)로부터 투상메소드를 상속받았다면

   반드시 재정의해서 구체적인 실행내용을 가진 메소드로 만들어야 한다.





템플릿 클래스, 탬플릿 패턴


추상화를 사용하는 목적중 템플릿패턴이라는게 있는데 업무중 중복적인것은 미리만들어 놓고 필요한부분만

추상화 하여 실제 업무를 처리해야하는 클래스에서 추상화한 부분만 직접만들고 짜여있는 템플릿을 사용하여 사용한다.


예시 )

public abstract class DatabaseAccess{

public void connect(){

System.out.println("데이터베이스와 연결");

}


public void command(){

System.out.println("데이터베이스에 쿼리문 전송");

}

public void receive(){

System.out.println("데이터베이스로부터 데이터 획득");

}


public void disconnect(){

System.out.println("데이터베이스와 연결해제");

}

public abstract void display();


public void access(){

connect();

command();

receive();

display();

disconnect();

}

}


======================================================================


public class 출석부조회 extends DatabaseAccess{


public void display(){

System.out.println("조회된 정보를 출석부에 표시합니다.");

}


}


이와같이 display만 작성 후 바로 access만 사용하면 되는 방식은 템플릿패턴, 템플릿 클래스라 한다.