지금까지 배운 내용들로 프로그램 만들어보기
<학생, 교사 관리 프로그램 만들어보기>
추상클래스(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);
}
}
'TIL' 카테고리의 다른 글
[JAVA] 접근 제어자 종류와 설명 (0) | 2023.04.23 |
---|---|
[23.04.05.] 국비지원 풀스택 개발자 과정 - Day 21(RDBMS, 오라클 자료형, SELECT문, SQL, SQL연산자,ORDER BY, 그룹함수, GROUP BY, HAVING) (1) | 2023.04.05 |
[23.03.24.] 국비지원 풀스택 개발자 과정 - Day 13 (0) | 2023.03.24 |
[23.03.23.] 국비지원 풀스택 개발자 과정 - Day 12 (0) | 2023.03.23 |
[23.03.22.] 국비지원 풀스택 개발자 과정 - Day 11 (0) | 2023.03.22 |
댓글