본문 바로가기
TIL

[23.03.27.] 국비지원 풀스택 개발자 과정 - Day 14

by DevPark 2023. 3. 27.
지금까지 배운 내용들로 프로그램 만들어보기

<학생, 교사 관리 프로그램 만들어보기>


추상클래스(Abstract Class)

- 추상 클래스는 불완전한 설계도이다.
- class 앞에 abstract(modifier)를 붙이면 그 클래스는 추상 클래스가 된다.
- 어떤 클래스가 추상 메소드를 가지면 그 클래스를 반드시 추상 클래스로 만들어 줘야 한다.  
- 단, 추상 메소드가 없어도 abstract만 붙이면 추상 클래스가 될 수 있다.
- 추상 클래스는 인스턴스화 할 수 없다.즉 메모리에 객체를 생성할 수 없다 즉 new연산자로 메모리를 할당 할 수 없다.   
- 추상클래스는 상속이 목적이다.
- 추상 클래스를 상속받은 자식클래스(sub class)에서는 만약 추상 클래스가(super class) 하나라도 추상 메소드를 가지고 있다면 반드시 오버라이딩 해야 한다. 즉 동일한 API를 사용할 수 있다.

- 만약 자식클래스에서 부모클래스의 추상메소드를 오버라이딩 하지 않으려면 자식도 추상 클래스로 만들어야 한다
- 추상클래스는 new해서 인스턴스화 할 수 없지만 추상클래스 타입의 인스턴스 변수에 자식클래스의 메모리를 할당 할 수 있다.(Heterogenious)


 추상 메소드란?

    - 메소드 앞에 abstract키워드가 붙은 것
    - 메소드 원형만 있고 구현부가 없는것
    - 추상메소드는 오버라이딩이 목적이다

  예) 접근지정자 abstract 반환타입 메소드명([매개변수]);
  public abstract class Computer {
  	public abstract void display();
  }


추상 클래스의 유형

 

유형 1. 추상 메소드가 없는 추상 클래스 

abstract class NoHavingAbstractMethod{
	public static final int MAX_INT = Integer.MAX_VALUE; //멤버상수
	int instanceVar; // 멤버변수
	static int staticVar; // 멤버변수
	void instanceMethod() {} // 멤버 메소드
	static void staticMethod() {} //멤버 메소드

 

유형 2.  추상메소드를 가진 클래스 

- 추상 메소드를 멤버로 가지면 그 클래스는 반드시 추상 클래스가 되야 한다.

abstract class HavingAbstractMethod{
	//void abstractMethod();[x]추상 메소드가 아니다.구현부가 없어서 에러 발생
	abstract void abstractMethod();//[o]
}

 

- 추상 메소드를 가지지 않은 추상 클래스를 상속받은 경우 강제적으로 오버라이딩 할 의무는 없다.
-  정적 메소드는 오버라이딩 불가능하다

class NoHavingChild extends NoHavingAbstractMethod{
	
	int newVar;
	
	@Override
	void instanceMethod() {} // [강제사항 아님-임의로 오버라이딩 한것임
	
}
class HavingChild extends HavingAbstractMethod{

	@Override
	void abstractMethod() {}//의무적으로 오버라이딩한 메소드
	
	void newMethod() {}//자식에서 새롭게 추가한 메소드
}

 

유형 3. 
추상메소드를 가진 추상 클래스를 상속받은 자식클래스에서 의무적으로 오버라이딩 안하려면 자식클래스도 추상 클래스로 만들어 주면 된다.

abstract class HavingChildNoOverriding extends HavingAbstractMethod{
	abstract void abstractNewMethod();
}

class HavingNewChild extends HavingChildNoOverriding{

	@Override
	void abstractNewMethod() {}
	@Override
	void abstractMethod() {}
	
}

 

- 추상 클래스는 인스턴스화 불가]-자식타입으로는 객체생성 가능
- 추상클래스 타입의 인스턴스 변수에 자식클래스 타입의 메모리 할당-이질화
- 추상클래스의 정적멤버:(자식 혹은 부모)클래스명.정적멤버

public class AbstractBasic {

	public static void main(String[] args) {
		//1.추상 클래스는 인스턴스화 불가-자식타입으로는 객체생성 가능
		//NoHavingAbstractMethod name= new NoHavingAbstractMethod();//[x]
		NoHavingAbstractMethod name= new NoHavingChild();//[o]이질화는 가능
        
		//2.추상클래스 타입의 인스턴스 변수에 자식클래스 타입의 메모리 할당 가능
		HavingAbstractMethod ham = new HavingChild();
		ham.abstractMethod();
		((HavingChild)ham).newMethod();
		
        //추상클래스의 정적멤버:(자식 혹은 부모)클래스명.정적멤버
		NoHavingAbstractMethod.staticMethod();
		NoHavingChild.staticMethod();
	}
}


  


인터페이스(Interface)

- 클래스가 객체의 설계도라면 인터페이스는 클래스의 설계도라 할 수 있다.
- 클래스는 인터페이스를 상속받을 수 있지만 인터페이스는 클래스를 상속 받을 수 없다.
- 자바는 단일 상속이 원칙이나 인터페이스를 이용해서 다중 상속을 구현할 수 있다.
- ,(콤마)로 구분해서 여러개의 인터페이스를 상속 받을 수 있다.
- 추상 클래스처럼 상속이 목적으로 상속받은 클래스는 추상 메소드를 오버라이딩해야 하기때문에 동일한 API(메소드)를 사용할 수 있다.
- 멤버로는 추상메소드와 상수(final변수)로만 구성된다.
- 접근지정자는 public과 default접근지정자만 가질 수 있다. modifier(static,final)는 가질 수 없다.
- 인터페이스에 있는 추상메소드는 public과 abstract란 키워드를 생략한다.
- 자식의 오버라딩 메서드에서는 반드시 public을 붙여야 한다.
- 인터페이스의 상수 또한 public static final을 생략해도, 컴파일러가 자동으로 붙여준다.
- 클래스가 인터페이스를 상속받을때는 implements키워드를 사용한다.
- 인터페이스가 인터페이스를 상속받을때는 extends키워드를 사용한다. 
- 인터페이스는 생성자가 없다.

interface MyInter{}//[o] default(package/생략형)접근지정자 사용
//static interface MyInter{}//[x] 클래스와 동일
//final interface MyInter{}// [x] 클래스와 다르다
abstract interface MyInter{}//[o] 붙여도 되나 의미 없다.

 

interface MyInter1{
	//public MyInter1() {} // [x] 생성자를 가질 수 없다. 
	public static final int MAX_INT = Integer.MAX_VALUE;//멤버 상수
	double MAX_DOUBLE = Double.MAX_VALUE; //public static final 생략된 것과 같다.
	
    public abstract void noOmit();	//추상 메소드 
	void omit(); // public abstract이 생략된 것과 같다. 
}

 

- 추상 클래스 안에서는 추상 메소드 정의시에는 반드시 abstract 키워드를 붙인다 (단, 인터페이스에서는 생략 가능)

abstract class AbstractClass{
	// void abstractMethod(); [x]
	abstract void abstractMethod();//[o]
}


- 인터페이스에 동일한 이름의 추상 메소드가 있는 경우 먼저 기술한 인터페이스의 추상 메소드만 오버라이딩 된다. 

class MyClass implements  MyInter2,MyInter1{

	@Override
	public void noOmit() {}
		
	@Override
	public void omit() {}

 

- 인터페이스가 인터페이스 상속 받을 때 extends 키워드 사용한다.  클래스와 다르게 (,)콤마로 구분해서 여러개의 인터페이스 상속 가능하다. 

interface MyInter3 extends MyInter1,MyInter2{ //두개 상속
	 void abstractMethod();//새롭게 확장한 추상 메소드
}

 

- 인터페이스 역시 추상 클래스처럼 인스턴스화(객체화, 메모리 생성)불가능하다.
- 이질화: 인터페이스타입의 인스턴스변수 = new 자식클래스명();

public class InterfaceBasic {
	
	public static void main(String[] args) {
		
		//MyInter1 mi1 = new MyInter1();//[x] 객체화 불가능
		MyInter2 mi2 = new MyClass();//[o] 이질화
		mi2.omit();
		//mi2.noOmit();//[x] undifined
		((MyClass)mi2).noOmit();
		((MyInter1)mi2).noOmit(); // 인터페이스는 상속관계가 없어도 형변환이 가능하다
		
		//인터페이스 상수 접근 방법
		System.out.println(MyInter1.MAX_INT);
		System.out.println(MyInter3.MAX_INT);
		System.out.println(LasyClass.MAX_INT);
		
	}
	
}

 

 

 

 

 

 

 

 

 

 

반응형

댓글