[Java] 기초9 (다형성, 추상클래스, 인터페이스)

sua_ahn·2023년 1월 5일
0

Java

목록 보기
12/15
post-thumbnail

다형성 Polymorphism

: 하나의 객체가 여러 타입을 가질 수 있음

→ 부모 타입의 참조변수로, 자식 타입의 인스턴스를 참조할 수 있도록 하여 구현 (반대는 불가)


ParentClass pobj = new ChildClass();	// up-casting

  • 오버라이딩된 메소드 사용 가능
    → 그 외 자식타입의 메소드와 변수는 형변환(down-casting)을 통해 사용 가능

  • 여러 자식 타입의 객체를 배열로 묶을 수 있음 (= 공통 분모로 묶기)

 

Casting 형변환

: 다른 타입으로 변환

→ 기본형 외의 자료형은 상속관계의 클래스끼리 casting 가능

instanceof 연산자

: 참조하고 있는 인스턴스 타입 확인

→ 사용 시 각 객체의 정보를 외부 객체가 알게 되므로 캡슐화가 깨짐
⇒ 사용 지양!

public static MainClass {
	public static void main(String args[]) {
		
        // 부모 변수에 자식 인스턴스 담기(up-casting)
        ParentClass pobj = new ChildClass(); // 출력: Parent > Child
        
        // 오버라이딩한 method
        pobj.method(); // 출력: Child method()
        
        System.out.println(pobj instanceof ChildClass); // true
        System.out.println(pobj instanceof ParentClass); // true
        
        // down-casting
        ChildClass cobj = (ChildClass) pobj;
        
        cobj.onlyChild(); // pobj는 사용 못하는 메소드
        
        System.out.println(cobj instanceof ChildClass); // true
        System.out.println(cobj instanceof ParentClass); // true
    }
}

public class ParentClass {
    
    public ParentClass() {
    	System.out.println("Parent");
    }
    
    public void method() {
    	System.out.println("Parent method()");
    }
}

public class ChildClass extends ParentClass {
	
    public ChildClass() {	
        System.out.println("Child");
    }
    
    @Override
    public void method() {
    	System.out.println("Child method()");
    }
    
    public void onlyChild() {
    	System.out.println("onlyChild()");
    }
}



추상 클래스 Abstract class

: 공통 부분을 추출한 클래스

→ 필드와 메소드 이름을 각각 통일시켜 가독성 향상, 개발의 효율 증대

 
특징

  • 필드, 생성자, 메소드 모두 포함 가능
  • 상속을 통해서만 객체 생성 가능
  • abstract 키워드 사용

 

추상 메소드 Abstract method

: 내용은 없고 선언만 되어 있는 함수

 
특징

  • 오버라이딩 강제 → 상속 후 오버라이딩 안하면 오류 발생
  • abstract 키워드가 붙고 {} 블록이 없는 형태

주의!

❌ 추상 클래스 ⇏ 반드시 추상 메소드 포함
⭕ 추상 메소드를 포함하는 클래스 ⇒ 반드시 추상 클래스


// 추상 클래스
abstract class AbstactClass {
	// 추상 메소드
	public abstract void method();
}

// 상속
class Child extends AbstractClass {
	
    @Override
    public void method() {
    	System.out.println("Overriding");
    }
}


인터페이스 Interface

: 클래스들이 필수로 구현해야 하는 추상 자료형 (객체 설계도)

확장에 열려있고(다중 상속) 변경에 닫혀있다(표준화)

 
특징

  • 추상 메소드정적 변수만 포함 가능
    → Java 8부터 정적 메소드와 디폴트 메소드도 포함 가능
    cf) [자바8의 default 메서드 등장]
  • 객체 생성 불가
  • 인터페이스는 인터페이스로만 상속 받을 수 있으며, 다중 상속 가능
  • interface 키워드 사용
  • 클래스로 구현 시 implements 키워드 사용

// 인터페이스
public interface MyInterface {
	// 정적 변수
    public static final String LAST_NAME = "Lee";
	// 추상 메소드
	public abstract void func();
}

// 구현
class MyClass implements MyInterface {
	
    @Override
    void func() {
    	System.out.println("Overrided func()");
    }
}
profile
해보자구

0개의 댓글