관리 메뉴

오버플로

[Java] Overloading / Overriding / Annotaion / Abstract Class 본문

Java

[Java] Overloading / Overriding / Annotaion / Abstract Class

NACO 2021. 7. 26. 23:35

 1. Overloading(Overload) 

- method 다형성의 종류

- 하나의 클래스 안에서 같은 이름의 method를 여러 개 정의하는 것

- 생성자도 Overloading 가능

- 호출될 때 구분되도록 정의하여야 함 

- 규칙) 접근지정자&반환형 달라도 됨 / method명 같아야 함 / 매개변수 반드시 다르게 정의!

 

 2. Overriding(Override) 

- method 다형성의 종류

- 상속 관계에서 부모, 자식 클래스 간에 같은 이름의 method를 정의하는 것

- 부모 클래스에서 제공하는 기능을 덮어쓰고 자식 클래스에서 수행할 기능으로 변경하는 것

   (단, 부모 클래스의 method에서 final이 선언되어 있으면 Overriding 불가)

- 규칙) *접근지정자는 달라도 되나 반환형&method명&매개변수 반드시 같도록 정의!

           *접근지정자 정의 시, 자식 클래스의 접근지정자가 부모 클래스의 접근지정자보다 광의여야 함

            (Ex. 부모 클래스 method의 접근지정자 : protected -> 자식 클래스의 method 접근지정자 : protected/public)

 

 3. Annotation (주석 달기) 

- JDK1.5에서부터 제공하는 기능

- Compiler에게 컴파일 시에 부가적인 일을 할 수 있도록 설정하는 것 (본래의 Compiler는 문법체크의 기능만 수행함)

- 종류)

    @Override : method가 Override 되었는지 컴파일 시 체크 / method 위 정의

    @Deprecated : 비추천 method인지 체크 / method 위 정의 (Ex. date.getYear())

    @SuppressWarnings : 경고를 표시할 때 사용 / method 위, method 안에서 정의

 

 4. Abstract Class 

- 상속관계에서 부모 클래스를 작성할 때 사용하는 클래스 (상속하기 위해 만드는 클래스)

- 일반 클래스의 변수/method 외에 *abstract method(추상 메소드)가 추가됨

   *abstract method

     - 구현의 강제성이 있는 method

     - 자식 클래스에서 반드시 자신에 맞게 Override 해야 함

     - 부모 클래스에 명시된 abstract method에는 body({ })가 없으므로 업무 로직 구현 불가 

- 추상클래스는 직접 객체화 되지 않음 (자식 클래스를 통해서만 객체가 생성됨)

   > extends하더라도 자식클래스 객체명 = new 자식클래스생성자();

   > 추상클래스는 일을 하지 않는다!

- abstract class 작성법)

       접근지정자 abstract class 클래스명 [extends 부모클래스명] [implements 구현인터페이스명,,] { }

- abstract method 작성법)

       접근지정자 abstract 반환형 method명 (매개변수,,);

       *접근지정자 : public, protected만 가능

       *Overloading 가능

 


# 오늘의 코딩 #

- 추상클래스 실습!

package test;

/**
 * 부모클래스 : 상속 및 abstract <br>
 * @author user
 */
 
public abstract class AbsParents {

	public AbsParents() {
//		super(); // 모든 클래스의 생성자에는 super가 생략되어 있음. 여기서의 부모 클래스는 Object.
		System.out.println("부모클래스 생성자");
	}// AbsParents

	public void parentsMethod() {
		System.out.println("부모의 기본 method");
	}// parentsMethod

	/**
	 * 집에서 밥을 먹는 method - 자식에 의해 구현될 method<br>
	 */
	public abstract void eat(); //Overloading

	/**
	 * 밖에서 밥을 먹는 method - 자식에 의해 구현될 method<br>
	 * @param menu : 음식의 종류
	 * @param price : 음식의 가격
	 * @return
	 */
	public abstract String eat(String menu, int price); //Overloading
	
}//class

- 상속관계를 통해 자식 클래스의 생성자보다 부모 클래스의 생성자가 먼저 실행되는 것을 증명하기 위해 생성자에 println 추가

- 기본 method와 abstract method (Overload로 2개 생성)

 

package test;

/**
 * 자식클래스 : extends하고 abstract method를 구체화할 당사자
 * @author user
 */
public class AbsChild extends AbsParents {

	public AbsChild() {
		System.out.println("자식클래스 생성자");
	}// AbsChild

	/**
	 *집에서 밥 먹는 method<br>
	 */
	public void eat() { //부모 클래스의 method Override
		System.out.println("집에서 밥을 먹고 있어요");
	}// eat

	/**
	 *식당에서 외식하는 method<br>
	 */
	public String eat(String menu, int price) { //부모 클래스의 method Override
		return "식당에서 " + menu + "을(를) " + price + "원 주고 먹어요";
	}// eat
	
	public static void main(String[] args) {
		//객체화
		AbsChild ac = new AbsChild(); // 부모 생성 후 자식 생성됨
		
		//상속 및 구현된 method 사용하기
		ac.parentsMethod(); //상속. 기본 method
		ac.eat(); // Override & Overload method
		System.out.println(ac.eat("제육볶음", 8000)); // Override & Overload method
		
	}// main
}// class

- 부모 클래스에서 상속된 method & abstract mehtod를 구현하여 실행!

 

# 출력 결과 #

부모클래스 생성자
자식클래스 생성자
부모의 기본 method
집에서 밥을 먹고 있어요
식당에서 제육볶음을(를) 8000원 주고 먹어요

'Java' 카테고리의 다른 글

[Java] Date Class / SimpleDateFormat Class / Locale Class  (0) 2021.08.01
[Java] StringTokenizer  (0) 2021.07.30
[Java] Math Class  (0) 2021.07.29
[Java] Interface  (0) 2021.07.28
[Java] Inner Class / Nested Class / Local Class / Anonymous Inner Class  (0) 2021.07.27
Comments