JAVA_Abstract/Interface/Final

뚱이아저씨·2023년 3월 15일
0

자바

목록 보기
13/15
post-thumbnail

추상메소드(Abstract)

추상메소드 선언목적

추상메소드(abstract method)란 자식 클래스에서
오버라이딩해야만 사용할 수 있는 메소드 자바에서
추상 메소드를 사용하는 목적은 추상메소드가 포함된
클래스를 상속받는 자식 클래스를 상속받는 자식 클래스가
반드시 추상메소드를 구현
하도록 하기 위함이다.

이러한 추상 메소드는 선언부만이 존재하며, 구현부는 작성되어 있지 않다.
즉, 이 작성되어 있지 않은 구현부를 자식 클래스에서 오버라이딩하여 사용하는 것이다.

추상메소드 구현 예시

//추상 클래스 : 추상 메소드를 포함하는 클래스
public abstract ckass AbstractNethod {
	//구현부 즉, 대괄호{}가 없으며 구체적이지 않다고 해서 추상 메소드라 한다.
    //추상 메소드를 생성하려면 추상 클래스가 있어야 한다.
    //추상 메소드는 abstract라는 것을 붙여줘야 한다.
    
    abstract int getAge();
    
    abstract void setAge(int num);
    
    //추상 클래스는 class앞에 abstract라는 것을 붙여줘야 하고
    //추상 메소드는 타입앞에 abstract를 붙여줘야 한다.
    //추상 메소드를 하나라도 가지면 추상 클래스가 된다.
}

추상메소드 선언시 주의점

  • 부모 클래스에서 abstract선언 하고 추상 메소드가
    있으면 자식 클래스에서 반드시 구현해야한다.
  • 추상 메소드는 구현부{}가 없다.
  • 추상 메소드를 생성하려면 추상 클래스가 있어야 한다.
  • 추상 메소드를 하나라도 가지면 추상 클래스가 된다.
  • 추상 클래스에서 생성한 추상 메소드의 개수에 맞게 자식 클래스에서 메소드 구현을 해야한다.
    - 예) 추상 클래스에서 추상 메소드 2개 생성->자식 클래스에서 구현 메소드 2개 생성
    • 자식 클래스에서 구현 메소드를 1개만 생성하고 싶으면 추상 클래스로 만들어야 한다.
  • 추상 클래스는 객체(인스턴스)를 생성할 수 없다.
    - 객체 생성이 불가 하기 때문에 자식클래스에 상속을 하고 자식 클래스의 객체를 이용한 출력을 하게 된다.
  • 추상 메소드는 업캐스팅이 가능하다.

추상 클래스는 객체 생성이 불가 하다. 출력 에시

//추상 클래스 구현
public abstract class Appliance {
	abstract void powerOn();
    abstract void powerOff();
}

//추상 클래스를 상속받은 자식 클래스
public class Fridge extends Appliance {
	@Override
    void powerOn(){
    	System.out,println("냉장고의 전원을 켜다.")
    }
    @Override
    void powerOff() {
    	System.out.println("냉장고의 전원을 끄다.")
    }
}
//메인 클래스
public class Main {
	public statice void main(String[] atgs) {
    	//추상 클래스는 객체 생성 불가
        //상속 받은 자식 클래스는 객체 생성을 할 수 있다.
        new Fridge().powerOn();
        new Fridge().powerOff();
    }
}

Interface

Interface의 특징

  • interface와 추상 클래스의 공통점은 추상 메소드를 가질 수 있다.
  • 일반 메소드는 가질 수 없고 추상 메소드만 가질 수 있다.
  • interfacesms 는 abstract를 붙이지 않아도 된다.
  • interface는 extends를 사용할 수 없다. 대신 implements를 사용한다.
  • interface를 사용하면 implements로 상속을 받고 나서 메소드를 강제 한다.
  • extends와 달리 implements는 다중 상속이 가능하다.
  • extends와 implements는 동시에 사용할 수 있다. 다만, 작성 순서가 다르다.

Interface 출력 에시

//Interface 구현
public interface Appliance {
	void PowerOn();
    void PowerOff();
    }
//class 구현
public class Fridge implements Appliance {
	//Interfac인 Appliace를 Implements를 하면 메소드 구현을 강제 한다.
    @Override
    public void PowerOn() {
    	System.out.println("냉장고를 켜다.");
    }	
    @Override
    public void PowerOff() {
    	System.out.println("냉장고를 끄다");
    }
//Main메소드 구현
	public class Main {
    	public static void main(String[] args) {
        	//new Appliance(); interface이기 때문에 객체를 생성할 수 없다.
            new Fridge().PowerOn();
            new Fridge().PowerOff();
        }
    }
}

Extends와 Implements 동시 사용 예시

public interface A{
}

public interface B{
}

public class C{
}

public class D extends C implements A,B{ 
//extends와 implements는 다중 구현이 가능
}

Final 상수

  • Final은 상수로 Final이 선언된 변수는 재할당 할 수 없다.
  • 메소드에 Final이 붙으면 override를 할 수 없다.
  • Final은 멤버변수 즉, 필드에 사용하면 무조건 값을 할당해 줘야 한다.
  • 한번 저장한 값을 변경할 수 없는 변수
  • 다른 변수들 처럼 사용된다.
  • 초기화된 상수의 값을 바꾸려 하면 에러가 발생한다.
  • 상수 선언 방법은 변수 언언 방법과 동일하나, final 키워드와 Snake case사용

Final 상속 예시

public class ConstantField {
	static final double MOON_RADIUS=1700;

	static final double MOON_AREA=MOON_RADIUS*MOON_RADIUS*Math.PI;
}

Final은 생성자에서 값을 할당해줄수 있다.

public class Worker{
	//필드_멤버변수 
	final String COMPANY="Google";
	final String regNumber;
	String name;

	//생성자(constructor)
	public Worker(String regNumber, String name) {
		this.regNumber=regNumber;
		this.name=name;
	}	
}

public class Main {
	public static void main(String[] args) {
		Worker w1=new Worker("900000-1000000", "박남현");

		System.out.println(w1.COMPANY);
		System.out.println(w1.regNumber);
		System.out.println(w1.name);

		//w1.regNumber="900000-1000000"는 생성자에서 초기화가 된 상태기 때문에 값을 재할당 할 수 없다.
		//무조건 필드에서만 final을 할당해야하는게 아닌 생성자에서도 할당 할 수 있다.
		w1.name="전여빈";
	}
}
profile
뚱이아빠의 개발자도전기

0개의 댓글