Java

Java - 추상클래스 (abstract)와 인터페이스(interface)

왕현성 2023. 1. 20. 15:06
728x90

1. 추상 클래스

  • 클래스 선언시 abstract class로 정의
  • 추상 메소드를 하나 이상 포함
  • 추상 메소드는 선언만하고 구현하지 않은 메소드로 정의
  • 추상 메소드를 포함하는 상위 클래스는 객체 생성 불가
  • 하위 클래스에서 상속 받은 모든 추상 메소드를 구현하면 객체 생성 가능
  • 추상 메소드를 모두 구현하지 않을 경우, 하위 클래스도 모두 추상 클래스
  • 하위 클래스에 기본 틀을 제공

1.1. 예시) 추상 클래스의 추상 메소드를 상속 받은 하위 클래스에서 구현하여 메소드 사용 



// 부모 추상 클래스
package model;
public abstract class GrandParent {
	// 추상클래스는
	// 메소드를 만드는데 메소드의 이름만있고
	// 내용은 아직 정해지지 않앗다.
	String name;
	int age;
	
	public abstract void print();
	
	public int future() {
		return age + 20;
	}
	
	public abstract void hello(); 
		
}

// 자식클래스
package model;

public class Parent extends GrandParent {
	
	String job;
	

	public Parent(String name, int age, String job) {
		// TODO Auto-generated constructor stub
		this.name = name;
		this.age = age;
		this.job = job;
		
	}


	@Override
	public void print() {
		// TODO Auto-generated method stub
		System.out.println(name+" "+age+" "+job);
	}


	@Override
	public void hello() {
		// TODO Auto-generated method stub
		System.out.println("Hello~~!");
		
	}

}


// 메인 클래스
package main;

import model.GrandParent;
import model.Parent;

public class GrandMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Parent p = new Parent("홍길동",50,"개발자");
		
		p.print();
		
		System.out.println(p.future());
		
		p.hello();

	}

}

 

1. 인터페이스 (Interface)

 

  • 추상 메소드와 상수로만 구성된 특수 형태의 클래스
    • 상수란 값을 한번 설정하면 다시 바꿀 수 없는 변수
  • 인터페이스 선언시 class가 아닌 interface로 정의
  • 클래스의 상속은 extends를 쓰지만 인터페이스의 상속은 implements를 사용
  • 모듈들을 연결하는 기능

 

2. 인터페이스의 사용 이유

  • 프로그램이 실행되는 환경은 매우 다양
  • 개발 할 때 실행 될 환경을 고려하지만 모든 환경을 만족시킬 수 없음
  • 서로 다른 환경에서의 기능 구현은 프로그램의 유지 보수성 저하
  • 그렇기 때문에 부품 교체하듯 코드의 일부를 교체하는 것이 효과적
  • 내부 구현은 다르지만 인터페이스로 사용 방법을 동일하게 제공하면 환경 변화에 따른 수정이 훨씬 쉬움
  • 주로 API에서 많이 사용

예) DB프로그램은 오라클,MS-SQL,MySQL 등 다양하며 서로 처리 방법이 다르다.
DB프로그램이 바뀔 때마다 코드를 수정해야하지만 인터페이스로 설정해두면 수정을 쉽게 할 수 있다.

 

 

Card.java

package model;

public interface Card {

	// interface는 클래스가 아니다.
	
	// interface는 멤버변수가 없다.
	// 단, constant (상수)와 Static변수는 가능!!
	// 상수란?? 변수 비슷하지만 한 번 데이터를 저장하면
	// 값을 바꿀 수 없는 것!
	// 상수는 메모리의 데이터영역에 저장된다.
	// 상수 => static final 키워드가 있어야한다.
	public static final int CLOVER = 1;
	public static final int HEART = 2;
	public static final int DIAMOND = 3;
	public static final int SPADE = 4;
	
	public String getCardNumber();
	public void print();
	
	
}

MyCard.java

package model;

public class MyCard implements Card, Player {
	
	public String cardNumber;
	public static final String HOST_NAME ="https://naver.com";

	@Override
	public String getCardNumber() {
		// TODO Auto-generated method stub
		return cardNumber;
	}

	@Override
	public void print() {
		// TODO Auto-generated method stub
		System.out.println("내 카드 숫자는 : "+cardNumber);
		
	}

	@Override
	public void play(String name) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void end() {
		// TODO Auto-generated method stub
		
	}



}

Player.java

package model;

public interface Player {
	
	public void play(String name);
	
	public void end();

}

InterfaceMain.java

package main;

import model.MyCard;

public class InterfaceMain {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		MyCard card = new MyCard();
		card.cardNumber="7";
		
		String number = card.getCardNumber();
		System.out.println(number);
		card.print();
		
		System.out.println(card.CLOVER);
		
		// 클로버는 상수이므로 (static final) 값 변경이 안 된다.
//		card.CLOVER=10;
		
		// 상수는 언제 사용할까?
		// DB HOST, DB 유저이름 등등..
		System.out.println(card.HOST_NAME);
		
		// 상수는 메모리의 데이터 영역에 있다.
		// 따라서 위처럼 객체를 갖고 사용해도 되지만,
		// 실제로는 객체 생성 없이 사용이 가능한 것이 바로 상수다!
		// 따라서 정석 사용법은 객체 생성없이 클래스,인터페이스의
		// 이름.상수명 => 이렇게 사용한다.
		System.out.println(MyCard.HOST_NAME);
		System.out.println(MyCard.SPADE);

		
	}
}