본문 바로가기

KOSTA : 클라우드 네이티브 애플리케이션 개발 전문가 양성과정

05/09 20일차 제어자(static,final,abstract) ,인터페이스

728x90

static - 클래스의, 공통적인

- static은 멤버변수, 메서드, 초기화 블록에 사용할 수 있습니다

- 클래스변수(static 멤버변수)는 인스턴스에 관계없이 같은 값을 갖습니다. 모든 인스턴스가 공유합니다. (멤버변수)

- 클래스가 메모리에 로드될 때 생성됩니다. (멤버변수)

- static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없습니다.(메서드)

 

abstract

- 각자 직접 구현이 필요한 메서드는 추상화 시킨다. (당근과 채찍)

- 공통으로 쓰는 메서드는 일반메서드로 뺀다.

- 선생님이 만든 시험<-->시험을 푸는 학생 관계?

- 다른 클래스들이 Pclass의 자손으로 관리가 되어질 필요가 있는 경우 사용됩니다. (구조적 기능)

- 다른 클래스들이 Pclass에서 제공되는 공통 기능의 메서드를 사용하되 일부 메서드는 각자가 기능구현해야 되는 경우 사용됩니다.(기능적)

-회원실명인증 기능에서 로그기록 기능은 결제파트, 포인트파트, 회원관리파트에서 따로 구현해야 합니다. 이때 로그기록 기능을 추상화시켜 각자 파트에서 만들도록 합니다.

 

Interface

- abstract은 추상(일반메서드,추상메서드)이고, Interface는 완전 추상(추상메서드)입니다.

- abstract은 공통으로 사용하는 일반메서드, 반드시 각자 구현하는 추상메서드로 나뉘어져 있습니다.

- interface는 main()을 만들 수 없습니다 == 실행의 목적이 아닙니다 == 부모가 되려는 목적으로 쓰입니다.

- interface는 공통의 메서드를 모아두고 부모 역할을 하기 위해 사용합니다.

- 변수는 상수만을 갖고, 메서드는 추상만을 갖습니다

public interface Lec인터페이스{
	double PI = 3.141592; // (public static final) double PI
    void add(); // (public abstract) void add
}

 

- 인터페이스는 다중상속 가능합니다. <--> 클래스는 단일 상속만 가능합니다.

public interface Lec07인터페이스 extends 인터페이스부모1, 인터페이스부모2{
	
	double PI = 3.141592; //--> public (static) (final) double PI 
	public void add(); //--> public (abstract) void add();
}

interface 인터페이스부모1{
	public void inter1ParentMethod1();
	public void inter1ParentMethod2();
}

interface 인터페이스부모2{
	public void inter2ParentMethod1();
}

 

- 추상클래스가 인터페이스를 상속받은 경우 둘다 추상이기 때문에 반드시 오버라이딩 할 메서드는 없다.

 

다형성(너무너무너무중요)

- 다양한 형태의 성질입니다. (뜻)

Child c = new Child(); // 5
Parent p = new Parent(); //2
// 자식 인스턴스로 부모타입의 객체에 접근하는 것
Parent pc = new Child(); // 2 parent에 있는거만 사용할 수 있음
// 왠 자식 클래스에 멤버들은 건들지 못하나??

- 자식의 클래스에 있는 메서드들(부모에게도 있는 자식의 메서드)을 제한적으로 사용하면서 공통의 것을 해야할 때 사용합니다.

- 관계없는 클래스를 묶어줄 수 있다.

 

인터페이스를 부모로 두면 좋은 점

-  다형성 : 동일한 인터페이스를 구현한 다양한 클래스들을 사용하여 유사한 작업을 수행할 수 있습니다. 다양한 페이 방식을 페이 인터페이스로 처리할 수 있습니다.

-  유연성 :  다른 클래스들이 각자의 방식으로 동작할 수 있도록 할 수 있습니다. (중요) --> 유지보수가 용이해지며, 코드 가독성를 높입니다. 추가 확장이 용이합니다.

- 확장성 : 새로운 클래스나 데이터 유형을 추가할 때 기존의 코드를 수정하지 않고도 쉽게 추가할 수 있습니다.

-  구조화 : 동일한 인터페이스로 다양한 클래스들을 사용하여, 코드를 더 추상화하고 간결하게 할 수 있습니다.

- 폴리모피즘 : 동일한 이터페이스를 구현한 객체들이 다양한 형태를 가질수 있습니다. 이로 인해 객채간의 관계를 더 추상화하고 코드의 가독성을 높일 수 있습니다.

 

class Parent{
	public int point = 100;
    public void add(int a){
    	System.out.println(a*100);
    }
    public void parentMethod(){
    	System.out.println("ParentMethod() 실행");
    }
}

class Child expends Parent{
	public int point = 10;
    
    @Override
    public void add(int a){
    	System.out.println(a*10);
    }
    
    public void childMethod(){
    	System.out.println("childMethod() 실행");
    }
    
    public static void main(String[] args){
    	// 1. 자식타입 = 자식 인스턴스
        child c = new child();
        System.out.println(c.point); // 자식 10
        c.add(8); // 자식-오버라이딩 80
        c.parentMethod(); // 부모
        c.childMethod(); // 자식
        
        // 2. 부모타입 = 부모 인스턴스
        Parent p = new Parent();
        System.out.println(p.point) // 부모 100
        p.add(8); // 부모 800 
        p.parentMethod() // 부모
        
        // 3. 부모타입 = 자식 인스턴스
        Parent pc = new Child();
        System.out.println(pc.point) // 부모 100
        pc.add(8); // 자식-오버라이딩 80
        pc.parentMethod(); // 부모
        
    }
}