java 100예제 #6

·2022년 1월 19일
0

JAVA

목록 보기
6/14

추상 클래스

abstract : 구체적인 내용없이 다른 클래스들의 공통적인 특징을 추상적으로 선언만 해둔 클레스(리턴값도 없이 메서드명만 선언)

클래스 내에 abstract 메소드가 하나라도 있다면 그 클래스는 추상클래스로 클래스 앞에 abstract를 붙여야 오류가 나지 않는다.

  • 추상 클래스 사용은 상속을 이용.
  • 추상(부모)클래스를 상속받은 자식 클래스에서 해당 메서드를 오버라이딩(재정의) 하여 사용한다.
  • 메소드 선언만 있으므로 객체 생성이 불가능하다.
    그렇기 때문에 추상클래스를 상속받은 자식클래스는 강제성을 가지고 추상메소드를 꼭 포함시켜야 한다.

(추상클래스는 일반메소드도 포함할 수 있다.)

//Animal a = new Animal(); = Err

자식클래스가 추상메소드를 쓰기 싫다면 자식도 추상클래스로 만들어 줄 수 있다.

인터페이스

: 상호간 통신을 위한 규격(또는 하나의 표준화를 제공하는 것)

인터페이스는 여러 객체들과 사용이 가능하므로 어떤 객체를 사용하느냐에 따라 코드 변경없이 실행 내용과 리턴값을 다양화할 수 있다는 장점이 있다.

인터페이스를 사용하는 클래스는 인터페이스에 선언된 메소드를 꼭 구현해야 한다.

추상클래스 vs 인터페이스
공통점 :
구체적인 내용이 없으므로 상속받은 클래스가 오버라이딩하여 사용한다.

차이점 :

  • 추상화 정도가 더 높아서 인터페이스는 일반 메소드를 가질 수 없다.

  • 추상클래스 : class / extends

  • 인터페이스 : interface / implements

  • 상속 vs 구현
    인터페이스는 다중상속 가능(추상 선언만 가능하기 때문에 그 메소드를 자식이 가져가서 구현)
    추상 클래스는 단일 상속만.(부모로부터 상속받아서 자식이 더 확장)

  • 우선순위는 상속이 먼저다.
    ex) class a extends b implements c,d

  • interface 변수필드는 상수만 가능.

public static final 데이터 타입 = 상수;
(컴파일 과정에서 저절로 붙어서 "public static final" 생략 가능)

static이라 객체 생성없이 바로 사용가능.
("인터페이스명.변수명" main에서 사용 가능)

같은 맥락으로 interface에 있는 모든 메소드는 abstract이라 "public abstract"이 생략 가능하다.
.
.
.
.
.
.

class Person{
	String name;
	int age;
	int weight;
	
	Person(){}
	Person(String name,int age, int weight){
		this.name = name;
		this.age =age;
		this.weight = weight;
	}
	
	void wash() {System.out.println("씻는 중");}
	void study() {System.out.println("공부 중");}
	void play() {System.out.println("노는 중");}
	
}

interface Allowance{
	//인터페이스라서 일반 메소드 작성 불가능
	abstract void in(int price, String name);
	abstract void out(int price, String name);
}

interface Train{
	//인터페이스라서 상수만 가능
	public static final int aa = 1;
	int bb =2; 
	
	void train(int training_pay, String name);
    
    //public static final, abstract 생략 가능
}

class Student extends Person implements Allowance, Train{
	//우선 순위 : 상속 > 구현
	
	Student(){}
	Student(String name,int age, int weight){
		super(name,age,weight);
	}
	
	//추상메서드 먼저 구현
	public void train(int training_pay, String name) {System.out.printf("%s-->%d원 입금%n",name,training_pay);}
	public void in(int price, String name) {System.out.printf("%s으로부터 %d원 수익%n",name,price);}
	public void out(int price, String name) {System.out.printf("%d원 지출 [ 지출용도 = %s ]%n",price,name);}
}

public class ex2 {
	public static void main(String[] args) {
		//A, B인터페이스(부) implements
		//Person 클래스(부) extends
		//Student 클래스(자)
		
		System.out.println(Train.aa);
		//인터페이스에 있는 상수변수라 객체 생성없이 사용가능 (static)
		
		Student s1 = new Student("밍",23,2);
		
		
		//클래스와 인터페이스로부터 상속, 구현받은 메소드 호출
		s1.play();
		s1.in(1000, "복권");
		
	}
}

.
.
.
.
.
.
.
.

야옹, 멍멍이 출력되는 interface Soundable 예시

public interface Soundable {String sound();}

class Cat12 implements Soundable{
	@Override
	public String sound() {return "야옹";}
}
class Dog12 implements Soundable{
	public String sound() {return "멍멍";}
}


public class ex5 {
	private static void printSound(Soundable soundable) {
		System.out.println(soundable.sound());
	}
	
	public static void main(String[] args) {
		printSound(new Cat12());
		printSound(new Dog12());	
	}
}

0개의 댓글

관련 채용 정보